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

Assembly x86 NASM更改未作为参数传递的地址处的值,assembly,x86,scanf,nasm,lldb,Assembly,X86,Scanf,Nasm,Lldb,我注意到NASM汇编代码中scanf的一些特殊行为。我有两个电话打给scanf: mov rdi, fmt mov rsi, r14 call _scanf 及 其中fmt在data部分声明为: section .data fmt: db "%d", 0 在第一次scanf之前,r14和r15中的地址为: r14 = 0x0000000000002104 r15 = 0x0000000000002105 在LLDB中,对这些地址中的任何一个执行me read-fd-c1,输出0 在为第一个

我注意到NASM汇编代码中scanf的一些特殊行为。我有两个电话打给scanf:

mov rdi, fmt
mov rsi, r14
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个字节,并且程序可以按预期工作。

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

这些地址2104和2105的间隔为一个字节,但您使用的是“%d”,它将填充一个4字节的整数,可能会在您尝试读取的位置后对字节进行补全。您缺少一个最小的完整的可验证示例。你应该发布你的代码,我们可以更好地理解它。这在MacOS上吗?在scanf调用之前,您是否将AL寄存器设置为零?514是0x0202,即2105和2104中字节值的dword组合。@MichaelPetch:您可以在注释中使用
[mcve]
:它扩展为。这几乎是太小了,但我认为这个具体问题是可以回答的。我想您应该检查OP在扫描后读取整数值时使用的宽度,以确保它是dword,与
%d
存储的
int
的宽度相匹配?换句话说,0x2014和0x2015,如果用作32位整数的地址,则重叠。如果scanf将“2”写入0x2014,它将写入2至0x2014、0至0x2015、0至0x2016和0至0x2017。写入0x2015将分别写入2到0x2015和0到0x2016..0x2018。现在,如果你从0x2014中读到这一点,那么在0x2014中会有一个2,在0x2015中会有一个2,在0x2016中会有一个0,在ox2017中会有一个0。这意味着您将得到0x00000202,即514。请将答案作为答案发布,而不是对您的问题进行编辑。这些地址2104和2105之间的间隔为一个字节,但您使用的是“%d”,它将填充一个4字节的整数,可能会在您尝试读取的位置后填充字节。您缺少一个最小的完整的可验证示例。你应该发布你的代码,我们可以更好地理解它。这在MacOS上吗?在scanf调用之前,您是否将AL寄存器设置为零?514是0x0202,即2105和2104中字节值的dword组合。@MichaelPetch:您可以在注释中使用
[mcve]
:它扩展为。这几乎是太小了,但我认为这个具体问题是可以回答的。我想您应该检查OP在扫描后读取整数值时使用的宽度,以确保它是dword,与
%d
存储的
int
的宽度相匹配?换句话说,0x2014和0x2015,如果用作32位整数的地址,则重叠。如果scanf将“2”写入0x2014,它将写入2至0x2014、0至0x2015、0至0x2016和0至0x2017。写入0x2015将分别写入2到0x2015和0到0x2016..0x2018。现在,如果你从0x2014中读到这一点,那么在0x2014中会有一个2,在0x2015中会有一个2,在0x2016中会有一个0,在ox2017中会有一个0。这意味着您将得到0x00000202,即514。请将答案作为答案发布,而不是对您的问题进行编辑。
r14 = 0x0000000000002104
r15 = 0x0000000000002105