简单汇编函数调用出错
这几天正在学习汇编,函数调用老出错,各位大哥帮忙讲解下 :P.section .data
format1:
.ascii"%%eax : %d\n"
.ascii"%%ebx : %d\n"
.byte 0
format2:
.ascii"result : %d\n"
.byte 0
.section .text
.globladd1
add1:
/* popl %ebx //这里就是取出靠压栈传进来的两个参数,但是出问题,就改成下面的mov取值了
popl %eax*/
movl (%esp), %ebx
movl 4(%esp), %eax //取出两个值,后相加放入%eax
addl %ebx, %eax
/* pushl %eax*/
movl %eax, (%esp) //再把返回值放回栈中,前边试过pop、push来代替这个,不过出现莫名其妙的错误,所以换了这个
ret
.globl_start
_start:
pushl $4
pushl $10
call add1
/* popl %eax*/
movl (%esp), %eax //调用add1结束,把在esp栈顶存放在返回值取出
addl $8, %esp //然后add1的两个参数从栈中取出
pushl %eax //为调用printf传参
pushl $format2
call printf
addl $8, %esp
pushl $0
call exit
#################################3
这个问题好郁闷啊,我感觉没什么问题啊,试了popl、pushl也没解决问题,试了这个
也不对,很奇怪。运行提试段错误。
各位大哥救急啊! 本帖最后由 qtdszws 于 2010-04-06 09:10 编辑
movl (%esp), %ebx
movl 4(%esp), %eax
改成
movl 4(%esp), %ebx
movl 8(%esp), %eax
movl %eax, (%esp)
改成
movl %eax, 4(%esp)
因为(%esp)中存放的是返回地址,你把它冲掉了 .section .data
format1:
.ascii"%%eax : %d\n"
.ascii"%%ebx : %d\n"
.byte 0
format2:
.ascii"result : %d\n"
.byte 0
.section .text
.globladd1
add1:
/* popl %ebx //这里就是取出靠压栈传进来的两个参数,但是出问题,就改成下面的mov取值了
popl %eax*/
movl 8(%esp), %ebx
movl 4(%esp), %eax //取出两个值,后相加放入%eax
addl %ebx, %eax
/* pushl %eax*/
// movl %eax, (%esp) //再把返回值放回栈中,前边试过pop、push来代替这个,不过出现莫名其妙的错误,所以换了这个
ret
.globl_start
_start:
pushl $4
pushl $10
call add1
/* popl %eax*/
// movl (%esp), %eax //调用add1结束,把在esp栈顶存放在返回值取出
addl $8, %esp //然后add1的两个参数从栈中取出
pushl %eax //为调用printf传参
pushl $format2
call printf
addl $8, %esp
pushl $0
call exit movl (%esp), %ebx
movl 4(%esp), %eax
改成
movl 4(%esp), %ebx
movl 8(%esp), %eax
...
qtdszws 发表于 2010-04-06 09:03 http://linux.chinaunix.net/bbs/images/common/back.gif
感谢大哥相救!嚯嚯 .section .data
format1:
.ascii"%%eax : %d\n"
.ascii"%%ebx : %d\n"
.b ...
cjaizss 发表于 2010-04-06 14:38 http://linux.chinaunix.net/bbs/images/common/back.gif
非常感谢!
我试试先 :P
页:
[1]