Rua*_*uan 2 c x86 assembly att
我正在尝试将以下程序转换为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;
}
Run Code Online (Sandbox Code Playgroud)
它应该打印321.
但是,使用下面的代码,我得到的是0.任何人都可以告诉我这里我做错了什么吗?(我粘贴了下面的相关部分.我确信初始化和打印工作正常.你可以在这里看到整个事情)
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
Run Code Online (Sandbox Code Playgroud)
也许我还没有完全理解idivl命令应该做什么.我知道它将%edx:%eax除以%ebx并将商存储在%eax中,余数存储在%edx中.
# reverse = reverse + n % 10
movl $0, %edx
movl %edi, %eax ; <--- here
Run Code Online (Sandbox Code Playgroud)
%edin根据上面的评论,不是:
movl $123, %esi # int n
Run Code Online (Sandbox Code Playgroud)
所以,它应该是使用%esi,即movl %esi, %eax.