目录
一. 汇编源码
二. 汇编分析
1. ECX寄存器
2. 栈位置计算
3. 特殊指令深度解析
三、 汇编转化
一. 汇编源码
single_int_param:0000000000000040: 89 4C 24 08 mov dword ptr [rsp+8],ecx0000000000000044: 57 push rdi0000000000000045: 8B 44 24 10 mov eax,dword ptr [rsp+10h]0000000000000049: 8D 44 00 01 lea eax,[rax+rax+1]000000000000004D: 5F pop rdi000000000000004E: C3 ret000000000000004F: CC int 30000000000000050: CC int 30000000000000051: CC int 30000000000000052: CC int 30000000000000053: CC int 30000000000000054: CC int 30000000000000055: CC int 30000000000000056: CC int 30000000000000057: CC int 30000000000000058: CC int 30000000000000059: CC int 3000000000000005A: CC int 3000000000000005B: CC int 3000000000000005C: CC int 3000000000000005D: CC int 3000000000000005E: CC int 3000000000000005F: CC int 3
二. 汇编分析
1. ECX寄存器
第一行
mov dword ptr [rsp+8],ecx
出现了一个新的寄存器ECX
ECX是32位寄存器,其低16位称为CX,CX可进一步拆分为高8位CH和低8位CL
例如:若ECX=0x11223344
,则CX=0x3344
,CH=0x33
,CL=0x44
分层设计支持灵活处理不同精度的数据操作
在Windows的fastcall调用约定中,ECX常作为函数的第一个整型参数传递寄存器
这个语句的意思就是将函数的第一个参数,存入栈顶地址偏移8个字节的位置,读取的是一个32位数,即代表一个整型
PS: 注意ECX保存的是第一个整型的参数,如果第一个参数非整型,则不是再EXC寄存器
2. 栈位置计算
第一行mov dword ptr [rsp+8],ecx 将第一个参数放到[rsp+8的位置]
第三行 mov eax,dword ptr [rsp+10h]为什么是操作地址rsp+0x10呢?
这里就涉及到了push rdi之后RSP的地址的变化
初始状态:
RSP = 0x1000 [RSP+8] = 参数值
执行 push rdi 后:
RSP = 0x1000 - 8 = 0x0FF8
参数位置变为: 0x1000 + 8 = 0x1008 → [RSP+0x10]
3. 特殊指令深度解析
lea eax, [rax+rax+1]
(高效计算)
- LEA 指令:Load Effective Address,本用于地址计算
- 创新使用:执行算术运算而不影响标志位
- 计算过程:
输入: EAX = n
操作: [n + n + 1] = 2n + 1
输出: EAX = 2n + 1
- 优势:
- 比
add eax, eax
+inc eax
更高效 - 单条指令完成乘加操作
- 不修改状态寄存器(FLAGS)
- 比
三、 汇编转化
根据以上汇编分析得到注释
single_int_param:0000000000000040: 89 4C 24 08 mov dword ptr [rsp+8],ecx ; 保存参数到栈0000000000000044: 57 push rdi ; 保存 RDI0000000000000045: 8B 44 24 10 mov eax,dword ptr [rsp+10h] ; 加载参数到 EAX0000000000000049: 8D 44 00 01 lea eax,[rax+rax+1] ; 计算 2*EAX + 1000000000000004D: 5F pop rdi ; 恢复 RDI000000000000004E: C3 ret ; 返回结果000000000000004F: CC int 3 ; 调试断点(填充)...(更多填充)
转华为C语言:
int single_int_param(int param) {// 计算 2*param + 1int result = 2 * param + 1;return result;
}