汇编语言
vscode反汇编
-exec disassemble /m
-exec disassemble /m main
-exec info registers //寄存器信息
字节长度
1byte=8bits
1word=2bytes=16bits
1dword=4bytes=32bits
逻辑运算
运算 | and | or | xor |
---|---|---|---|
0 0 | 0 | 0 | 0 |
0 1 | 0 | 1 | 1 |
1 0 | 0 | 1 | 1 |
1 1 | 1 | 1 | 0 |
计算机加法运算
以2+3为例
X:0010 Y:0011
1.首先进行xor运算得到0001(此操作将相加后无需进位的数保留下来)。
2.然后进行and运算得到0010,并左移一位 0010 << 1 ==0100 (此操作为进位操作) 。
3.最后判断2操作后得到的数是否为0(判断是否仍需进位)。
4.继续将1和2步骤得到的数进行上述操作,直到得到0为止 。
32位通用寄存器
寄存器 | 作用 |
---|---|
EAX | 累加器 |
ECX | 计数 |
EDX | I/O指针 |
EBX | DS段的数据指针 |
ESP | 堆栈指针 |
EBP | SS段的数据指针 |
ESI | 字符串操作的源指针:SS段的数据指针 |
EDI | 字符串操作的目标指针:ES段的数据指针 |
通用寄存器使用
MOV /ADD/SUB
MOV EAX,12345678 ;将12345678放入EAX中
ADD EAX,1 ;EAX中的值加1
MOV ECX,2 ;将2放入ECX中
ADD EAX,ECX ;将EAX和ECX中的值相加
SUB EAX,3 ;EAX中的值减3
LEA 寻址 LEA EAX,DWORD PTR DS:[0x12345678]
内存
1.每个内存单元的宽度为8。
2.[0x0000000] [0xFFFFFFFF]称为地址。
3.地址的作用:当我们想从内存中读取数据或者想向内存中写入数据,首先应该找到读、写的位置。
内存的读写
寻址公式 | 例子 |
---|---|
[立即数] | DWORD PTR DS:[0x12345678] |
[reg] reg代表任意寄存器 | DWORD PTR DS:[ECX] |
[reg+立即数] | DWORD PTR DS:[ECX+4] |
[reg+reg*{1,2,4,8}] | mov dword ptr ds[0x0000FFFF],0x0000FFFF |
[reg+reg*{1,2,4,8}+立即数] | DWORD PTR DS:[ECX+ECX*4+2] |
堆栈
PUSH ;进栈
POP ;出栈
先进栈后出栈,栈底地址不变。
C++指针笔记
一、指针的基本概念
指针是一个变量,它存储了另一个变量的内存地址。这个变量可以是一个基本数据类型(如int、char等),也可以是一个复杂的数据类型(如数组、结构体等)。在C++中,我们使用"*"来定义一个指针变量。
二、指针的声明和初始化
-
指针的声明:要声明一个指针,我们需要指定它所指向的数据类型。例如,如果我们想要一个指向整数的指针,我们可以这样声明:
int *p;
。 -
指针的初始化:我们可以使用"&"运算符来获取一个变量的地址,然后将这个地址赋值给一个指针。例如:
int x = 10;
int *p = &x;
三、指针的访问和修改
我们可以使用"*"运算符来访问一个指针所指向的值。例如:cout << *p;
我们也可以使用"="运算符来修改一个指针所指向的值。例如:*p = 20;
四、指针的指针(二级指针)
有时,我们需要一个指针来存储另一个指针的地址。这样的指针称为二级指针。例如,我们可以定义一个指向整数指针的指针:int **p;
五、动态内存分配
在C++中,我们使用new和delete操作符来动态分配和释放内存。例如,我们可以使用new来创建一个新的整数:int *p = new int();
。当我们不再需要这个整数时,我们可以使用delete来释放它的内存:delete p
;。
六、指针的安全问题
在使用指针时,我们必须小心避免悬挂指针和空指针。悬挂指针是指指向已经释放的内存的指针。空指针是指未初始化的指针。在使用指针之前,我们应该检查它们是否为空。
标签:第一周,int,EAX,内存,ECX,reg,指针 From: https://www.cnblogs.com/yee-l/p/18216408