2015-05-31 465 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