【发布时间】:2026-02-05 20:05:01
【问题描述】:
我正在尝试理解以下汇编代码(x86-64 att):
msg: .ascii "This is an examp" # please note it's examp not example
_start:
mov $msg, %rsi
mov $1, %rdi
mov $1, %rdx
mov $1, %rax
mov $0, %rbx
mov $16, %r9
call exm
exm:
cmp %rbx, %r9
je end
test $1, %rbx
jnz skip
syscall
skip:
inc %rsi
inc %rbx
call exm
end:
ret
-
将字符串存储在寄存器中是什么意思?寄存器不是持有 0/1 吗?
-
如果它正在转换 ascci ti chars,我知道 char 大小是 1 个字节,我们的字符串是 16 个字母,所以我们需要 16 个字节,而寄存器只有 8 个字节。怎么样?
-
因为 rdi 是 1,我们正在从屏幕读取,这是真的吗?
-
如果系统调用失败,它将返回 0,如果存储在 rax 中,则返回值,这是否意味着存在无限循环的可能性?
【问题讨论】:
-
您有一个名为
msg1的标签,但您在实际代码中使用了msg。请澄清哪一个是正确的。 -
@mediocrevegetable1 非常感谢您的指正,已更新
-
你试过运行它吗?您是否尝试过在 GDB 中单步执行它来观察寄存器值?这应该告诉你
%rdi得到一个地址,而不是 ASCII 字节。此外,strace ./a.out是一个很好的方法,可以在您开始弄清楚它是如何/为什么制造它们之前,了解它制造了什么系统调用。
标签: assembly ascii x86-64 system-calls cpu-registers