因為是函式呼叫所以能觀察到 main() 裡面去 call 其他 function 。今天介紹呼叫單一函數、函數裡僅有單一參數、雙參數、函數中再呼叫其他函數的情況。
disassemble main
可以看到 main 裡 call 一個 function。
disassemble function
這裡要說一下 function prologue。包括:push rbp、mov rbp, rsp (因為此 function 沒有 local variable,不然的話應該會有 sub rsp, xxx 的 function prologue)。而 function epilogue 則是 pop rbp、ret。
解答公布:
#include <stdio.h>
void function();
int main(void) {
function();
return 0;
}
void function() { printf("Hello, world!\n"); }
disassemble main
可以看到 main 裡 call 一個 function 叫 theSquareFunction。並且把 0xA 存到 edi。
disassemble function
這裡的 function prologue 因為有 local variable,所以才有 sub rsp, 20h 的 function prologue。另外可以看到 imul eax, eax 是用來自己相乘(平方),而 eax 來自 edi (即成功取得外部傳來的參數)。
解答公布:
#include<stdio.h>
void theSquareFunction(int side);
int main(void){
theSquareFunction(10);
return 0;
}
void theSquareFunction(int side){
int area = side * side;
printf("The area is %d\n", area);
}
disassemble main
disassemble function
IDA Pro 突然開不起來......換成Hopper Disassembler。可以看到下圖,透過 esi 與 edi 將兩個參數傳入並做運算。
解答公布:
#include<stdio.h>
void theSquareFunction(int side1, int side2);
int main(void){
theSquareFunction(10, 11);
return 0;
}
void theSquareFunction(int side1, int side2) {
int area = side1 * side2;
printf("The area is %d\n", area);
}
disassemble main()
main() 呼叫 function1。
disassemble function1()
function1 先加一,再呼叫 function2。
disassemble function2()
function2 加一,從 0x1f 變成 0x20。最後再呼叫 0x1050 做 printf()。
解答公布:
#include<stdio.h>
void function1();
void function2();
int main(void){
function1();
return 0;
}
void function1(){
int num1 = 15;
num1++;
printf("Num1 from function1 is %d\n", num1);
function2();
}
void function2(){
int num2 = 31;
num2++;
printf("Num2 from function2 is %d\n", num2);
}
今天講解函式呼叫。明天講解陣列的特徵。