首页 > 解决方案 > 汇编语言代码未正确添加

问题描述

我正在尝试编写一个汇编语言代码,将一个数字乘以 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

标签: assemblyx86

解决方案


movq $10,  %r10
movq %r11, %r10

AT&T 语法(与 Intel 语法相反)首先具有源,然后是目标。因此,上面的第一行正确加载10r10中,然后第二行将其中的任何内容r11(根据您的结果可能为零)加载到中r10,覆盖它。

如果您想r11结束 double r10,则序列将类似于:

movq %r10, %r11  ; r11 <- r10
addq %r10, %r11  ; r11 <- r11 + r10

注意那里有一个mov一个 add。您的原始代码mov后面有两条add指令,这意味着您最终会乘以而不是二。


推荐阅读