2011-04-05 67 views
1

我在試着瞭解這段代碼發生了什麼,特別是在__asm__之內。如何逐句通過彙編代碼,以便我可以打印每個變量,哪些不是?如何使用GDB調試器查看__asm__內容?

具體來說,我想逐步完成這個要弄清楚什麼是8()的意思,看看它是如何知道這是怎麼回事到數組索引2

/* a[2] = 99 in assembly */ 
    __asm__("\n\ 
    movl $_a, %eax\n\ 
    movl $99, 8(%eax)\n\ 
"); 
+0

您需要在gdb中的關鍵字是'disassemble' ... _ __ – 2011-04-05 02:26:26

+0

謝謝,Tony :) – Strawberry 2011-04-05 02:47:52

回答

1
movl $_a, %eax  // load the memory address of a into %eax 

movl $99, 8(%eax) // jump 8 bytes and store number 99 (which is a[2]) 

這似乎我aint數組(INT在大多數平臺中有4個字節)。因此,通過增加4個字節,您將訪問數組的下一個項目。此陣列分配值的其它實例是:

movl $10, (%eax) // store number 10 on the the first position: a[0] 

movl $20, 4(%eax) // jump 4 bytes from the address loaded in %eax 
        // and store number 20 on the next position (a[1]) 
+0

爲了將來的參考,我怎樣才能找出數組元素中有多少字節?如果它是一個字符串呢?如果我在另一個系統上呢?等等......我猜我必須看看文檔,但是像這樣的東西似乎很難在互聯網上挖掘出來。 – Strawberry 2011-04-05 02:44:55

+1

您必須閱讀:從頭開始編程。這是一本免費的書,它很棒:http://download.savannah.gnu.org/releases/pgubook/ProgrammingGroundUp-1-0-booksize.pdf – karlphillip 2011-04-05 02:46:31

3

我從來沒有什麼好在AT & T語法,但我很確定8(%eax)部分意味着「存儲在EAX中的地址之後的8個字節的地址」,即它是相對於存儲在寄存器中的地址的偏移量。

在Intel語法相當於大約會是這樣的(從我的頭頂,所以這是完全有可能,有一些小的失誤在這裏...)

mov eax, a 
mov DWORD PTR [eax+8], 99 
+0

它實際上是'mov DWORD PTR [eax + 8],99'我相信,但是。 – caf 2011-04-05 02:18:14

+0

@caf:是的,你是對的。這就是我在早晨4點回答問題所得到的結果... – 2011-04-05 09:11:30

4

stepi通過在一個時間該組件一個指令命令的步驟。還有一個用於逐步調用函數的nexti。這些命令不遵守大多數命令適用的'只有命令的唯一前綴足夠'的規則 - 部分原因是它們的nextstep命令完全是這些命令的前綴,部分原因是這些命令不常用當他們通常由知道他們真的想要使用它們的人使用時。

info registers顯示很多寄存器內容。

您還需要查看與disassemble命令拆卸。所有這些命令的

更多信息,請與help命令,例如:

(gdb) help info registers 

告訴你info registers顯示整數寄存器和它們的內容,但它也告訴你,如果你提供一個寄存器名稱它將限制輸出到寄存器的值:

(gdb) info registers rax 
rax   0x0 0 

raxeax於x86_64版本) 第i列s是寄存器名稱,第二個是十六進制值,第三個是整數值。

沒有爲disassemble命令有用help爲好。

記住,GDB有許多命令選項卡完成,這可以用於不僅僅是簡單的命令更多,但很多時候它爲您提供了不錯的建議 - 這有時是有益的,但。

在內聯程序集中包含一個標籤可讓您在開始時輕鬆製作一箇中斷點。

+0

我以爲'ni'會跨過'__asm__'所以我在'__asm__'行設置了一箇中斷點,然後輸入'ni',然後它遍歷所有程序集。我做錯了什麼? – Strawberry 2011-04-05 04:05:43

+0

當你說「全部通過」時,你的意思是說它是單步執行每個彙編指令的嗎?我以爲那是你想要的。 – nategoose 2011-04-16 01:50:13