【问题标题】:Defining "variables" in assembly language用汇编语言定义“变量”
【发布时间】:2015-05-31 15:21:00
【问题描述】:

我知道这是一个非常愚蠢的问题,但我有一段时间想不出答案
如何在 GAS AT&T 汇编语言中正确声明和定义“变量”?
例如,我想要 5 个字节的缓冲区、两个 1 字节的变量(初始值为 0)、2 字节的变量为 0 和 2 字节的变量为 10。
这段代码不能正常工作,至少调试器说(在程序的第一行,在这些声明之后,只是 nop 指令)bc 是大数字而不是零。

.bss
    .lcomm r, 5

.data
    a:  .byte 0
    b:  .byte 0
    c:  .word 0
    d:  .word 10

【问题讨论】:

  • 对我来说似乎很好。也许您的调试器将bc 读取为dwords,在这种情况下,bc 可能是0x0a00000x0a00,或者更大。
  • 或者调试器可能显示地址而不是值。你没有显示你在调试器中做了什么,以及你使用了哪一个,但是要打印a,你可以在gdb中做x/b &a
  • 这就是您在 GAS 程序集中定义变量的方式。您的调试器可能不知道 bc 应该是 8 位和 16 位数字。汇编器生成的调试信息不​​如编译器。
  • @user35443,我的调试器是kdbg,如果这很重要的话。那么在这种情况下我能做些什么呢?
  • @Construct 你如何检索bc的内容?您是否尝试过明确指定它们的大小,例如使用 x/1b variable

标签: assembly gnu-assembler att


【解决方案1】:

这是您在“手表”窗口中看到的内容:

a = 0 = 0x00 = 0x0000 = 0x00 0000 = 0x0000 0000

b = 167772160 = 16777216 * 10 = 0x1000000 * 0x0A = 0xA000000

c = 655360 = 65536 * 10 = 0x10000 * 0x0A = 0xA0000

d = 10 = 0x0A = 0x0000 000A

这是什么意思?这意味着您的编译器完成了它的工作,但您的调试器将cb 读取为双字(4 个字节)而不是字节。

当它读入 b 时,它会在顶部读取其值 0x00c 的值 0x0000d 的值 0x0A,共同构成 0xA000000

c 也发生了类似的事情。 a 很幸运,因为接下来的 4 个字节是零,所以 a 真的是零。

但是,情况并非总是如此。没有什么说在d 之后不可能有任何垃圾,更不用说等于零的变量可能会出现在.bss 中(在完全不同的内存位置上)。

【讨论】:

  • 谢谢。但我现在能做什么?我不能使用调试器来充分观察我的变量?
  • @Construct 我对kdbg不是很熟悉,可能有一些设置。如果您能够通过某个接口访问(可能是底层)gdb,或者直接使用 gdb,您的问题就会得到解决。您仍然可以尝试使用as -gas -g3as -ggdb 进行编译然后加载,因此kdbg 会出现一些额外的调试信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2010-12-24
  • 2014-10-07
相关资源
最近更新 更多