为了账号安全,请及时绑定邮箱和手机立即绑定

使用AT&T语法将整数打印为字符串,并使用Linux系统调用而不是printf

使用AT&T语法将整数打印为字符串,并使用Linux系统调用而不是printf

小怪兽爱吃肉 2019-12-06 15:24:48
我已经编写了一个汇编程序来显示遵循AT&t语法的数字的阶乘,但是它不起作用,这是我的代码.text .globl _start_start:movq $5,%rcxmovq $5,%raxRepeat:                     #function to calculate factorial   decq %rcx   cmp $0,%rcx   je print   imul %rcx,%rax   cmp $1,%rcx   jne Repeat# Now result of factorial stored in raxprint:     xorq %rsi, %rsi  # function to print integer result digit by digit by pushing in        #stack  loop:    movq $0, %rdx    movq $10, %rbx    divq %rbx    addq $48, %rdx    pushq %rdx    incq %rsi    cmpq $0, %rax    jz   next    jmp loop  next:    cmpq $0, %rsi    jz   bye    popq %rcx    decq %rsi    movq $4, %rax    movq $1, %rbx    movq $1, %rdx    int  $0x80    addq $4, %rsp    jmp  nextbye:movq $1,%raxmovq $0, %rbxint  $0x80.data   num : .byte 5这个程序什么都没打印,我也用gdb来可视化它正常工作,直到循环功能,但是当它出现时,下一个随机值开始输入到各个寄存器中。帮我调试以便可以打印阶乘。
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

几件事:


0)我想这是64b linux环境,但是您应该这样说(如果不是,我的一些观点将无效)


1)int 0x80是32b调用,但您使用的是64b寄存器,因此应使用syscall(和不同的参数)


2)int 0x80, eax=4要求ecx包含要存储内容的内存地址,同时给它提供ASCII字符ecx=非法内存访问(第一次调用应返回错误,即为eax负值)。或使用strace <your binary>应显示错误的参数+返回的错误。


3)为什么addq $4, %rsp?对我来说毫无意义,您正在破坏rsp,因此下一个pop rcx将弹出错误的值,最后您将“向上”运行到堆栈中。


...也许还有更多,我没有调试它,这个列表只是通过阅读源代码(所以我什至可能在某些方面是错的,尽管这种情况很少见)。


顺便说一句,您的代码正在工作。它只是没有达到您的预期。但是,正如CPU的设计和代码中的编写一样,它可以很好地工作。无论是实现了您想要的目标还是有意义的目标,这都是不同的话题,但是不要怪怪硬件或汇编程序。


...我可以快速猜测一下例程可能是如何修复的(只是部分hack-fix,仍然需要syscall在64b linux下重写):


  next:

    cmpq $0, %rsi

    jz   bye

    movq %rsp,%rcx    ; make ecx to point to stack memory (with stored char)

      ; this will work if you are lucky enough that rsp fits into 32b

      ; if it is beyond 4GiB logical address, then you have bad luck (syscall needed)

    decq %rsi

    movq $4, %rax

    movq $1, %rbx

    movq $1, %rdx

    int  $0x80

    addq $8, %rsp     ; now rsp += 8; is needed, because there's no POP

    jmp  next

再一次不要尝试自己,只是从头开始写,所以让我知道它是如何改变情况的。


查看完整回答
反对 回复 2019-12-06
  • 2 回答
  • 0 关注
  • 740 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信