我正在使用gdb来调试x86程序集中的程序。 虽然我有一些变量的奇怪行为,但我无法理解为什么。

这就是我定义和查看它们的方式:

section .data
CountDied: dd 0000
OnesFound: db 00

section .text
global _start
_start:
nop
... code

当我逐步运行gdb时,检查变量是否在第一条指令处具有正确的值,并得到以下结果:

print CountDied
$1=0
print OnesFound
$2=167772672

虽然在下一个说明中,OnesFound似乎表现得很正确。 我真的很困惑。 谢谢你的建议。

#1楼 票数:4 已采纳

程序集“variable”只是内存中特定点的标签。 GDB不知道应该有多大,它只是假设它是一个32位的值。

您获得的数字的十六进制表示为0x0A000200。 x86是一个小端平台,因此它实际上将作为00 02 00 0A存储在内存中。 只有第一个字节实际上是您设置的值的一部分,并且设置正确。

您可以使用命令x/b &OnesFound而不是使用print来查看所需的特定字节。

  ask by Luigi Tiburzi translate from so

未解决问题?本站智能推荐:

2回复

在gdb中具有奇怪值的变量

我有点儿“菜鸟”,但我不明白为什么“ print WeirdValue”用以下代码返回“ 16777216”(1000000000000000000000000): 当在 返回正确的“ 0”。 我在64位系统上,并且正在使用以下命令 汇编代码。 有人有线索吗?
3回复

奇怪的结果是gdb

我正在阅读一本C书,它与asm有很多关系,并用GDB查看寄存器和内存。 问题是,当我编译和反汇编完全相同的源(实际上使用随书附带的源文件)时,汇编指令看起来与书中的内容有很大不同。 这本书使用英特尔风味的程序集,我在gdb中放置“set disassembly intel”,所以不是这样..
3回复

GDB未使用的变量

是否可以使用GDB获取未使用变量的值? GCC是否有一些配置,以便未使用的变量的垃圾值显示为“优化输出”? c文件: 在gdb中我想获得变量y的垃圾值。
1回复

在GDB中打印装配变量

我没有完整的源代码,但有一个带符号的目标文件。 有一条读线: 我把ab放在第一行,并在函数名称中添加了一个以确定。 输入“1”后尝试了p *(char**)$esp ,我得到: 这不是我的预期。 我原本应该看到“1”。 我也尝试过:
1回复

如何获取gdb中某个变量的地址

如何通过命令行获取gdb中某个变量的地址。 编辑: 它在构造函数中不起作用。
2回复

如何用gdb读取局部变量?

我知道你可以通过使用gdb查看$ ebp的正偏移来找到任何参数: 然后,我将使用x/s查看第3和第4个地址,因为它们将是第一个和第二个参数。 局部变量怎么样? 我如何看待$ ebp的负偏移值? 还有,无论如何看看$ eax的价值? 每当我尝试使用x/s $eax打印$ eax的值时,
2回复

如何使用gdb更改变量的值

我有一个名为exploit.c的文件,其中: 我知道我可以通过更改 c 的值来打印标志。 但我想通过组装/执行来做到这一点。 如何在不更改布尔值但使用 gcc 和 gdb 的情况下打印出标志?
1回复

查找GDB中的变量变化

我在一个有 100 多个源代码文件的项目中工作。 我正在调试它以发现错误。 我需要找到的是特定对象分配给值的时间。 IE。 这个对象一开始是NULL ,但其他一些文件改变了它的值,我不知道。 是否有任何方法可以找到此变量何时更改其值? 我现在尝试的是在变量初始化的函数上放置一个断点。 我还添加了一