assembly - 汇编语言代码未正确添加
问题描述
我正在尝试编写一个汇编语言代码,将一个数字乘以 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
解决方案
movq $10, %r10
movq %r11, %r10
AT&T 语法(与 Intel 语法相反)首先具有源,然后是目标。因此,上面的第一行正确加载10
到r10
中,然后第二行将其中的任何内容r11
(根据您的结果可能为零)加载到中r10
,覆盖它。
如果您想r11
结束 double r10
,则序列将类似于:
movq %r10, %r11 ; r11 <- r10
addq %r10, %r11 ; r11 <- r11 + r10
注意那里有一个mov
和一个 add
。您的原始代码mov
后面有两条add
指令,这意味着您最终会乘以三而不是二。
推荐阅读
- python - 如何在python中计算字符串中的字符?
- azure-devops - 嵌套 yaml 管道 Azure DevOps 中的默认参数
- java - Java(不是 JavaScript)日期解析问题:java.text.ParseException
- javascript - 立即检测连接丢失 - Websocket - JavaScript
- c++ - 嵌套虚拟化的 DNS 解析失败
- angular - *ngFor 行为主题 | 异步不更新
- php - 如何将mysql表中的总行数用于php中的循环计数器?
- python - 如何使用指数平滑来平滑python中的时间序列?
- javascript - 如何获取 javascript 中每一行的所有坐标?因为我想使用 lat 和 long 在地图上绘制标记
- spring - 我必须从数据库中获取超过 5000 条记录。我的查询需要大约 3 分钟的时间。如何提高代码性能