汇编语言代码未正确添加

时间:2020-09-24 00:49:04

标签: assembly x86

我正在尝试编写一个将数字乘以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

1 个答案:

答案 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 而不是两个。