汇编基础10--使用函数

Catalogue
  1. 1. 汇编基础10 – 使用函数
    1. 1.1. 函数编写
    2. 1.2. 函数调用

汇编基础10 – 使用函数

函数编写

函数格式:

1
2
3
function proc
code
function endp

传参方式:

  1. 寄存器
  2. 堆栈

函数调用

调用指令:CALL

格式:CALL OPRD

相当于:

1
2
push EIP
jmp OPRD

返回指令:RETN

格式:RETN

相当于:

1
2
pop EIP
jmp EIP

函数调用会先push eip,跳转到函数进行调用,调用完后再pop eip

示例1:通过栈传递参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.586
.MODEL flat,stdcall
.code

addx proc
mov eax ,[esp+4] ;先进栈的,地址位置大,后进的,地址小(小端序)
mov ebx ,[esp+8]
add eax ,ebx
retn
addx endp

main proc
push 1
push 2;通过栈传参
call addx
mov eax ,eax
main ENDP
END main

示例2:通过寄存器传递参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.586
.MODEL flat,stdcall
.code

addx proc
add eax ,ebx
retn
addx endp

main proc
mov eax ,2
mov ebx ,1
call addx
mov eax ,eax
main ENDP
END main

示例3:加减乘除函数

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
38
39
40
.586
.MODEL flat,stdcall
.code

addx proc
add eax ,ebx
retn
addx endp

subt proc
sub eax ,ebx
retn
subt endp

mult proc
mov ebx,[esp+4]
mul ebx
ret
mult endp

divi proc
div ebx
mov ah,ah
mov al,al
ret
divi endp

main proc
mov eax ,2
mov ebx ,2
push 15
call addx
call subt
call mult
mov ebx ,1;把ebx清0,方便观察看出栈数据
pop ebx
call divi
mov eax ,eax
main ENDP
END main

示例4:使用寄存器作为参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
addx proc uses esi ecx ;函数中使用寄存器(用完之后用的寄存器会回复原来的值)
add esi ,ecx
;mov ecx ,22
mov eax ,esi ;这里需要把结果保存到其他寄存器里
ret
addx endp

main proc
mov esi ,5
mov ecx ,1
push esi
push ecx
call addx

push 0
call ExitProcess
main endp
END main