标签:
.type func, @function func:
#func.s
.section .data
base:
.int 100
.section .bss
.lcomm result, 4
.section .text
.globl _start
_start:
nop
movl $8, %eax
call cal_func
movl $1, %eax
movl result, %ebx
int $0x80
cal_func:
addl $10, %eax
addl base, %eax
movl %eax, result
ret
$ ./func $ echo $? 118
func_lable:
pushl %ebp #函数开头把ebp的原始值保存到堆栈的顶部
movl %esp, %ebp #把当前esp堆栈指针复制到ebp寄存器
...
movl %ebp, %esp #获取存储在ebp寄存器中原始的esp寄存器值。
popl %ebp
ret
.section .data
base:
.int 100
plus_no:
.int 8
.section .text
.globl _start
_start:
nop
pushl base #将函数所需参数压入堆栈顶部
pushl plus_no
call cal_func
movl $1, %eax
int $0x80
cal_func:
pushl %ebp
movl %esp, %ebp
movl $0, %eax
addl 8(%ebp), %eax # 第一个输入参数位于间接寻址位置8(%ebp)
addl 12(%ebp), %eax # 第二个参数位于12(%ebp)
movl %eax, %ebx # 将和值放在%ebx寄存器中,最后作为程序返回值返回
movl %ebp, %esp
popl %ebp
ret
$ ./func $ echo $? 108
.section .text .type addfunc, @function .globle addfunc addfunc:
#main.s
.section .data
base:
.int 100
plus_no:
.int 8
.section .bss
.lcomm result, 4
.section .text
.globl _start
_start:
nop
pushl base
pushl plus_no
call addfunc
movl $1, %eax
int $0x80
#func.s
.section .text
.type addfunc, @function
.globl addfunc
addfunc:
pushl %ebp
movl %esp, %ebp
movl $0, %eax
addl 8(%ebp), %eax
addl 12(%ebp), %eax
movl %eax, %ebx
movl %ebp, %esp
popl %ebp
ret
$ make as -o add.o add.s as -o main.o main.s ld -o func add.o main.o $ ./func $ echo $? 108 $
标签:
原文地址:http://blog.csdn.net/shallnet/article/details/45625145