寄存器
扩展
8位 | 16位 | 32位 | 64位 |
---|---|---|---|
al | ax | eax | rax |
cl | cx | ecx | rcx |
dl | dx | edx | rdx |
bl | bx | ebx | rbx |
ah | sp | esp | rsp |
ch | bp | ebp | rbp |
dh | si | esi | rsi |
bh | di | edi | rdi |
新增
8位 | 16位 | 32位 | 64位 |
---|---|---|---|
r8b | r8w | r8d | r8 |
r9b | r9w | r9d | r9 |
r10b | r10w | r10d | r10 |
r11b | r11w | r11d | r11 |
r12b | r12w | r12d | r12 |
r13b | r13w | r13d | r13 |
r14b | r14w | r14d | r14 |
r15b | r15w | r15d | r15 |
128位 XMM0-XMM8
64位下入栈不能使用pushad 得用push rax rcx一个个入栈
地址
32位下是四字节 64位下是八字节 但是只有48位有效
64-48位 | 47-0位 |
---|---|
符号扩展位 要么全是0 要么全是1 | 地址 |
地址范围是0xFFFF8000 00000000 ~ 0xFFFFFFFFF FFFFFFFF跟0x00000000 00000000 ~ 0x00007FFF FFFFFFFF 中间的0x00008000 00000000 ~ 0xFFFF7FFFF FFFFFFFF 为非法的地址
但是Intel规定的是48位有效 而微软只使用了44位
寻址
X86下寻址
寻址形式 | 介绍 |
---|---|
[base] | 基址 |
[disp32] | 偏移量 |
[base + index] | 基址 + 变址 |
[base + disp8/32] | 基址 + 偏移量 |
[base + index*scale + disp8/32] | 基址 + 变址 + 偏移量 |
CALL的寻址
X86
寻址为 (B9187C + 5) + FFFFF84C = 100B910CD
X64
寻址为 (7FF7B1711888 + 5) + FFFFF903 = 7FF7B1711190
参数的寻址
X86
直接寻址
X64
寻址为(7FF7B1711881 + 7)+ 839C = 7FF7B1719C24
X64使用内联汇编
源文件中添加
编写汇编代码
设置项类型
新建一个头文件 导入汇编函数
然后就能直接用了
调用约定
X86
cdcel 参数都是从右向左通过堆栈传递 自动清理堆栈
stdcall 所有参数从右到左依次入栈 手动清理堆栈
thiscall 所有参数从右到左依次入栈 如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压栈后被压入堆栈 对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈
fastcall 函数的第一个和第二个DWORD参数(或者尺寸更小的)通过ecx和edx传递,其他参数通过从右向左的顺序压栈 手动清理堆栈
X64
类似fastcall 第一个第二个第三第四参数 放入rcx rdx r8 r9