我正在尝试将以下程序转换为x86汇编(AT&T)。

#include <stdio.h>

int main()
{
   int n = 123;
   int reverse = 0;


   while (n != 0)
   {
      reverse = reverse * 10;
      reverse = reverse + n%10;
      n       = n/10;
   }

   printf("%d\n", reverse);

   return 0;
}


它应该打印321。

但是,使用下面的代码,我得到的是0。
有人能给我一个关于我在这里做错了什么的线索吗?
(我只粘贴了下面的相关部分。我确定初始化和打印工作正常。您可以看到the whole thing here

  movl  $123, %esi    # int n
  movl  $0, %edi    # int reverse
  movl $10, %ebx    # divisor


L1:     # while n != 0

cmpl $0, %esi
je L2

# reverse = reverse * 10
imul $10, %edi

# reverse = reverse + n % 10
movl $0, %edx
movl %edi, %eax
idivl %ebx
addl %edx, %edi

# n = n / 10
movl %esi, %eax
movl $0, %edx
idivl %ebx
movl %eax, %esi

jmp L1

L2:  # end while

movl %edi, %eax


也许我还不太了解idivl命令应该做什么。我知道它会将%edx:%eax除以%ebx,然后将商数存储在%eax中,将余数存储在%edx中。

最佳答案

# reverse = reverse + n % 10
movl $0, %edx
movl %edi, %eax   ; <--- here


根据上面的注释,%edi不是n

movl  $123, %esi    # int n


因此,它应该使用%esi,即movl %esi, %eax

关于c - 尝试翻译C程序以将数字反向转换为x86汇编,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49941176/

10-11 18:34