2015-05-31 177 views
3

我underdstand,这是愚蠢至极quiestion,但我找不出答案一段时间
如何正确地声明和定义气体“变量” AT & T汇编语言?
例如,我想缓冲液中5个字节,2个1字节变量(最初为0的值),与10
此代码0和2字节的变量的2字节变量不正确地工作,至少调试器说,(在程序的第一线,这些声明,只是nop指令后),其bc是大数字,而不是零。汇编语言定义“变量”

.bss 
    .lcomm r, 5 

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

对我来说这似乎很好。也许你的调试器读取'b'和'c'作为'dwords',在这种情况下'b'和'c'可能是'0x0a0000'和'0x0a00',或者更大。 – user35443

+0

或者也许调试器显示的地址不是值。你没有显示你在调试器中做了什么,以及你使用了哪一个,但是要打印'a',你可以在'gdb'中执行'x/b&a'。 – Jester

+1

这就是你如何在GAS程序集中定义变量。你的调试器可能不知道'b'和'c'应该是8位和16位数字。汇编器生成的调试信息不​​如编译器生成的调试信息。 –

回答

3

这里就是你在 “监视” 窗口中看到:

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

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

然而,这并不总是必须是这种情况。没有什么表示,不能有d之后的任何垃圾,更不用说变量等于零可能会出现在.bss(在一个完全不同的内存位置)。

+0

谢谢。但我现在可以做什么?我不能使用调试器来充分观察我的变量吗? –

+0

@Construct我对'kdbg'不太熟悉,可能有一些设置。如果你能够通过某个接口访问(可能是底层的)'gdb',或者直接使用gdb,你的问题就可以解决。 您仍然可以尝试使用'as -g','as -g3'或'as -ggdb'进行编译,然后加载,因此会为'kdbg'提供一些额外的调试信息。 – user35443