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
其中 fmt
在 data
部分声明为:
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 个字节并且程序按预期工作。
我注意到 NASM 汇编代码中 scanf 有一些奇怪的行为。我有两次调用 scanf:
mov rdi, fmt
mov rsi, r14
call _scanf
和
mov rdi, fmt
mov rsi, r15
call _scanf
其中 fmt
在 data
部分声明为:
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 个字节并且程序按预期工作。