汇编学习5

汇编函数

今天用汇编完成一个函数,还是计算两个数的和

函数流程概述

  1. 函数调用者将参数压入栈中
  2. 被调用函数创建自己的栈帧
  3. 函数执行,完成计算
  4. 函数返回,清理栈帧并返回结果

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
section .text
global _start

_start:
; 将参数压入栈中
push dword 5 ; 参数1
push dword 3 ; 参数2

; 调用函数
call add_two_numbers

; 清理栈中的参数
add esp, 8

; 结束程序
mov eax, 1 ; sys_exit
int 0x80

; 函数定义
add_two_numbers:
; 创建栈帧
push ebp
mov ebp, esp

; 获取参数
mov eax, [ebp+8] ; 参数1
mov ebx, [ebp+12] ; 参数2

; 执行加法
add eax, ebx

; 恢复栈帧
mov esp, ebp
pop ebp

; 返回
ret

代码解释

主程序部分(_start)

  • push dword 5push dword 3:将参数 5 和 3 压入栈中
  • call add_two_numbers:调用 add_two_numbers 函数
  • add esp, 8:清理栈中压入的参数(每个参数 4 字节,共 8 字节)

函数部分(add_two_numbers)

  • push ebpmov ebp, esp:创建新的栈帧,保存上一个栈帧的基址
  • mov eax, [ebp+8]:从栈帧中获取第一个参数
  • mov ebx, [ebp+12]:从栈帧中获取第二个参数
  • add eax, ebx:将两个参数相加,结果存入 eax
  • mov esp, ebppop ebp:恢复之前的栈帧
  • ret:返回到调用者

栈帧结构

调用 add_two_numbers 函数时,栈的结构如下

1
2
3
4
5
6
7
高地址
---------
[返回地址] <- [ebp+4]
[参数1:5] <- [ebp+8]
[参数2:3] <- [ebp+12]
---------
低地址