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

我已经编写了一个汇编程序来显示遵循AT&t语法的数字的阶乘,但是它不起作用,这是我的代码


.text 


.globl _start


_start:

movq $5,%rcx

movq $5,%rax



Repeat:                     #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 rax

print:

     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  next

bye:

movq $1,%rax

movq $0, %rbx

int  $0x80



.data

   num : .byte 5

这个程序什么都没打印,我也用gdb来可视化它正常工作,直到循环功能,但是当它出现时,下一个随机值开始输入到各个寄存器中。帮我调试以便可以打印阶乘。


小怪兽爱吃肉
浏览 741回答 2
2回答

qq_笑_17

几件事: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下重写):&nbsp; next:&nbsp; &nbsp; cmpq $0, %rsi&nbsp; &nbsp; jz&nbsp; &nbsp;bye&nbsp; &nbsp; movq %rsp,%rcx&nbsp; &nbsp; ; make ecx to point to stack memory (with stored char)&nbsp; &nbsp; &nbsp; ; this will work if you are lucky enough that rsp fits into 32b&nbsp; &nbsp; &nbsp; ; if it is beyond 4GiB logical address, then you have bad luck (syscall needed)&nbsp; &nbsp; decq %rsi&nbsp; &nbsp; movq $4, %rax&nbsp; &nbsp; movq $1, %rbx&nbsp; &nbsp; movq $1, %rdx&nbsp; &nbsp; int&nbsp; $0x80&nbsp; &nbsp; addq $8, %rsp&nbsp; &nbsp; &nbsp;; now rsp += 8; is needed, because there's no POP&nbsp; &nbsp; jmp&nbsp; next再一次不要尝试自己,只是从头开始写,所以让我知道它是如何改变情况的。
打开App,查看更多内容
随时随地看视频慕课网APP