简单汇编函数调用出错
这几天正在学习汇编,函数调用老出错,各位大哥帮忙讲解下
.section .data
format1:
.ascii "%%eax : %dn"
.ascii "%%ebx : %dn"
.byte 0
format2:
.ascii "result : %dn"
.byte 0
.section .text
.globl add1
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也没解决问题,试了这个
也不对,很奇怪。运行提试段错误。
各位大哥救急啊!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
非常感谢!
我试试先
感谢大哥相救!嚯嚯
.section .data
format1:
.ascii "%%eax : %dn"
.ascii "%%ebx : %dn"
.byte 0
format2:
.ascii "result : %dn"
.byte 0
.section .text
.globl add1
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
本帖最后由 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)中存放的是返回地址,你把它冲掉了