目錄
一. 匯編源碼
二. 匯編分析
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;
}