我正在尝试编写一个将数字乘以2(不使用乘法)并将其打印出来的汇编语言代码,但是我的汇编代码无法正常工作-当应打印20时它正在打印0。我确实将%r10初始化为10,但是在将%r10复制到%r11之后,%r10的值就变成一个无关的数字(582)。有人可以帮我指出我做错了什么,应该如何实施?谢谢!
.section .rodata
sOutputFmt: .string "%ld\n"
.section .text
.globl main
main:
subq $8,%rsp
movq $10,%r10
movq %r11,%r10
addq %r11,%r10
addq %r11,%r10
movq $sOutputFmt,%rdi
movq %r10,%rsi
call printf
addq $8,%rsp
ret
答案 0 :(得分:2)
movq $10, %r10
movq %r11, %r10
AT&T语法(与Intel语法相反)首先是源,然后是 。因此,上面的第一行将10
正确地加载到r10
中,然后第二行将r11
中的任何内容(根据您的结果可能为零)加载到r10
中,从而将其覆盖。 / p>
如果您希望r11
以双r10
结尾,则序列将类似于:
movq %r10, %r11 ; r11 <- r10
addq %r10, %r11 ; r11 <- r11 + r10
请注意,这里有一个mov
和一个单 add
。您的原始代码包含一个mov
,后跟两个add
指令,这意味着您最终将乘以 3 而不是两个。