# 080 call ret kho tài liệu training

53 3 0

Tải lên: 298 tài liệu

1/53 trang

### Thông tin tài liệu

Ngày đăng: 17/11/2019, 08:21

CALL and RET Assembly language programming By xorpd xorpd.net Objectives  We will study the CALL and RET instructions  We will see examples of using CALL and RET  We will understand the stack’s meaning with respect to function calls Example  A function that calculates the sum of a list of numbers (dwords): ; Input: ecx – length of list ; esi – address of list ; Output: eax – contains the sum ; sum_nums: xor edx,edx next_dword: lodsd add edx,eax loop next_dword mov eax,edx Example (Cont.)  A function that calculates the sum of a list of numbers (dwords): ; Input: ecx – length of list ; esi – address of list ; Output: eax – contains the sum ; sum_nums: push edx ; Keep regs push ecx xor edx,edx next_dword: lodsd add edx,eax loop next_dword mov eax,edx pop ecx ; Restore regs pop edx Example (Cont.)  Using sum_nums: mov esi,my_list mov ecx,LIST_LEN call sum_nums ; Exit the process: push call [ExitProcess] sum_nums: push push xor next_dword: lodsd add loop mov pop pop ret edx ; Keep regs ecx edx,edx edx,eax next_dword eax,edx ecx ; Restore regs edx Example (Cont.)  Using sum_nums: mov esi,my_list mov ecx,LIST_LEN call sum_nums ; Exit the process: push call [ExitProcess] sum_nums: push push xor next_dword: lodsd add loop mov pop pop ret edx ; Keep regs ecx edx,edx edx,eax next_dword eax,edx ecx ; Restore regs edx Example (Cont.)  Using sum_nums for two different lists: mov mov call mov esi,my_list1 ecx,LIST1_LEN sum_nums edx,eax mov mov call mov ; esi,my_list2 ecx,LIST2_LEN sum_nums ebx,eax push call [ExitProcess] sum_nums: ; ret Example (Cont.)  Using sum_nums for two different lists: mov mov call mov esi,my_list1 ecx,LIST1_LEN sum_nums edx,eax mov mov call mov ; esi,my_list2 ecx,LIST2_LEN sum_nums ebx,eax push call [ExitProcess] sum_nums: ; ret First call to sum_nums Example (Cont.)  Using sum_nums for two different lists: mov mov call mov esi,my_list1 ecx,LIST1_LEN sum_nums edx,eax mov mov call mov ; esi,my_list2 ecx,LIST2_LEN sum_nums ebx,eax push call [ExitProcess] sum_nums: ; ret Second call to sum_nums Example (Cont.)  Using sum_nums for two different lists: mov mov call mov esi,my_list1 ecx,LIST1_LEN sum_nums edx,eax mov mov call mov ; esi,my_list2 ecx,LIST2_LEN sum_nums ebx,eax push call [ExitProcess] sum_nums: ; ret  How can ret know where to return? Second call to sum_nums Stairs illustration call func_a: call call ret func_b: ret func_c: ret func_a func_b func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret time func_a start func_b func_c func_a func_b: ret func_b func_c: ret depth func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Stairs illustration call func_a: call call ret func_a start func_b func_c func_a func_b: ret func_b func_c func_c: ret  The depth corresponds to the amount of elements currently occupied in the stack Summary  CALL and RET are special purpose jumps  CALL and RET allow us to call a function and return from a function call  CALL pushes the return address to the stack  RET pops the return address from the stack  The stack helps us navigate the calls graph  It contains the full path to the current function Exercises  Intro  Local, Anonymous labels  Stack balancing  Read Code  Write code ... – Nested calling  Nested calling: call func_a: call call ret Call graph func_a start func_b func_c func_a func_b: ret func_b func_c: ret func_c Example – Nested calling  Nested calling:...  The return address is kept on the stack! Example – Simple calling  Simple calling and returning: call my_func: ret my_func Example – Simple calling  Simple calling and returning: call ... my_func: ret my_func ???????? unoccupied 0040200a esp ???????? ???????? ???????? ???????? occupied Example – Nested calling  Nested calling: call func_a: call call ret func_b: ret func_c: ret
- Xem thêm -

### Tài liệu mới bán

#### TOP TÀI LIỆU 7 NGÀY

1
353 20 35523
2
209 15 15813
3
5933 41 101529
4
2174 51 43788
5
3454 7 164158
Gửi yêu cầu tài liệu
Tìm tài liệu giúp bạn trong 24h