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

时间:2017-12-25 03:54:55

标签: assembly x86 scanf nasm lldb

我注意到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.

进入" 2"对于第一个scanf,值得一提的是0x0000000000002104中的值2。

进入" 2"对于第二个scanf,0x0000000000002105中的值为2.但是,现在0x0000000000002104中的值为514.

我在其他地方拨打scanf之后会遇到类似的内存变化,并会在需要时重现这些内容,但想知道是否有人经历过这种情况。

1 个答案:

答案 0 :(得分:3)

以前,我使用%d作为scanf的格式,读取4个字节。但是,r14和r15中的地址仅在bss部分保留了1个字节。我更改了这个,以便它们现在保留4个字节,程序按预期工作。