学习汇编两大知识点:
1.汇编指令
2.寄存器
64bit:
RAX \RBX\RCX\RDX :通用寄存器
32bit:
EAX\EBX\ECX\EDX :通用寄存器
16bit:
AX\BX\CX\DX :通用寄存器
现代计算机普遍64位,以前是32位。为了向下兼容,如上图,64位一半包含着32位的寄存器。
一般规律:
R开头的寄存器是64位的,占8字节。
E开头的寄存器是32位的,占4字节。
注意:寄存器是独立存在的,不是连续的。
c++支持内联汇编
__asm{
}
验证eax包含ax
image.png
image.png
可以发现,ax的值发生了变化,变成了3344
汇编指令
move dest,src
- 将src的内容复制到dest,类似于dest = src
[地址值]
- 中括号里面包含的都是地址值
word是2字节,dword是4字节,qword是8字节
作用:
int a = 3;int类型告诉编译器分配4个字节给a变量。
所以汇编要通过dword等告诉编译器分配多少个字节。
ptr是固定写法,表示指定单位大小。
一个格子代表1个字节。
image.png
指定大小后就知道占4个字节。
image.png
通常是向高地址存/取。[1128->112b而不是1128->1124]
通过cout<<&a,输出a的地址值。然后查看汇编窗口里的ebp地址值。发现括号里面的值的确是a的地址值。
image.png
-
全局变量地址是固定的。
全局
cpu大小端模式
image.png现在大部分cpu是小端模式,低字节放低地址,高字节放高地址(高高低低)。读取从小端开始读取。
lea dest,[地址值],直接把地址给dest
lea eax,[1122h]
等价于eax = 1122h
lea(load effect address)
ret 函数返回
xor op1,op2
异或操作,等价于op1 =op1^op2
类似的还有add,sub,inc(自增),dec
jmp [内存地址]
cpu跳转到该内存地址进行执行
还有很多j开头的指令,比如jne()jump not equal
jump
网友评论