我注意到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。
在为第二个scanf
输入“2”后,0x0000000000002105中的值为2.但是,现在0x0000000000002104中的值为514。
我在其他地方打电话给scanf
后会遇到类似的记忆变化,如果需要的话会重现它们,但想知道是否有人经历过这种情况。
以前,我使用%d
作为scanf的格式,读取4个字节。但是,r14和r15中的地址仅在bss
部分保留1个字节。我更改了这个,以便它们现在保留4个字节,程序按预期工作。