assembly - 汇编 x86_64 显示残值
问题描述
我想从控制台获取一个数字并显示它以 1 为增量。但结果不是我想要显示的。你能向我解释我做错了什么吗?(我在组装方面一点也不先进)
.data
number: .long 0
numberformat: .asciz "%ld"
assig: .asciz "text \n \n"
enternumber: .asciz "Enter the number: \n"
numberformat1: .asciz "The input number+1 = %d \n"
.text
.global main
main: # main
call print1
call print2
call inout
call exit
inout:
movq $0, %rax # clear rax
movq $numberformat, %rdi # load format string
movq $number, %rsi # set storage to address of number
call scanf
pop %rbp
movq $number, %rbx
add $1, %rbx
movq $0, %rax
movq %rbx, %rsi
movq $numberformat1, %rdi
call printf
# call printnewnumber
ret
print1:
movq $0, %rax
movq $assig, %rdi
call printf
ret
print2:
movq $0, %rax
movq $enternumber, %rdi
call printf
ret
printnewnumber:
movq $0, %rax
movq %rdx, %rsi
movq $numberformat1, %rdi
call printf
ret
解决方案
该行movq $number, %rbx
不复制输入数字本身,而只是复制它的地址。如果取消引用指针,您将获得所需的输出:
将上述行更改为
movq number(%rip), %rbx # Dereference pointer and store input number in RBX
产量
Assignment 1b: inout
Enter the number:
123
The input number+1 = 124
推荐阅读
- javascript - forEach 不处理非空 API(无法读取属性 'forEach' )
- getstream-io - 如何通过 API 调用注册用户设备进行聊天推送?仅查看 CLI 上的文档
- excel - 将 IFERROR 与复杂的 COUNTIFS 一起使用
- aws-cdk - 有没有办法指定创建 vpc 时使用的可用区数量?
- r - 无法在 for 循环中正确返回对象名称
- javascript - 调用同步准备好的异步 ajax javascript 函数
- javascript - 如何使用 Axios 和 Typescript 等待响应?
- python - 运行python时Sublime链接命令错误?
- npm - 找不到 scss-bundle 命令
- java - JMSTemplate 生产者是否为每条消息打开一个线程?