barloshi 发表于 2010-04-06 00:19

简单汇编函数调用出错

这几天正在学习汇编,函数调用老出错,各位大哥帮忙讲解下 :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:03

本帖最后由 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)中存放的是返回地址,你把它冲掉了

cjaizss 发表于 2010-04-06 14:38

.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

barloshi 发表于 2010-04-06 15:49

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


    感谢大哥相救!嚯嚯

barloshi 发表于 2010-04-06 15:52

.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]
查看完整版本: 简单汇编函数调用出错