x86 NASM 更改未作为参数传递的地址处的值

x86 NASM changes value at address not passed as parameter

我注意到 NASM 汇编代码中 scanf 有一些奇怪的行为。我有两次调用 scanf:

mov rdi, fmt
mov rsi, r14
call _scanf

mov rdi, fmt
mov rsi, r15
call _scanf

其中 fmtdata 部分声明为:

section .data
fmt: db "%d", 0

在第一个scanf之前,r14和r15中的地址是:

r14 = 0x0000000000002104
r15 = 0x0000000000002105

在 LLDB 中,对这些地址中的任何一个执行 me read -fd -c1 输出 0。

第一个scanf输入“2”后,0x0000000000002104中的值谢天​​谢地是2。

第二次输入“2”后scanf,0x0000000000002105中的值为2,而现在0x0000000000002104中的值为514。

在其他地方调用 scanf 后,我在内存中遇到了类似的变化,如果需要,我会重现它们,但想知道是否有人经历过这种情况。

以前,我使用 %d 作为读取 4 个字节的 scanf 的格式。然而,r14 和 r15 中的地址在 bss 部分中仅保留了 1 个字节。我对此进行了更改,以便他们现在保留 4 个字节并且程序按预期工作。