簡體   English   中英

GDB:匯編指令計算

[英]GDB: Assembly instruction calculation

我是裝配新手。 除了正在調試的實際代碼之外,有沒有辦法在GDB中執行計算? 例如,我正在使用Linux IA-32程序集(AT&T語法)逐步完成以下操作:

   ;$esi is 0xbffff0a8 which refers to 1 after this command. $eax is 2
   0x08048cd5 <+42>:    lea    -0x20(%ebp),%esi

   ;$eax=ebx=2 after this instruction
   0x08048cd8 <+45>:    mov    %ebx,%eax 

   ;$eax equals 2 after this instruction               
   0x08048cda <+47>:    add    -0x4(%esi,%ebx,4),%eax

我只是沒有看到$ eax如何結束2.我可以在gdb中發出如下指令:-0x4(%esi,%ebx,4)並分析結果嗎?

根據我的理解,$ ebx乘以4得到8.然后將$ esi加到9.然后減去-4得到5.然后將5加到$ eax,這是2得到7.而不是$ eax是2。

您可以使用寄存器來評估表達式,如果這就是您所要求的。

gdbprint命令是你的朋友。

基本上你可以通過在美元符號前加上查詢寄存器,例如

print $ecx

或者在表達式中使用它們:

print $esi + $ebx + 4

您可以使用*運算符取消引用內存(如C中所示):

print *$ecx

將打印ecx指向的內存位置的內容。

雖然您無法直接鍵入匯編代碼,但您可以將表達式轉換為更高級別的內容,如下所示:

print $eax - ($esi * $ebx)

此外,您可以使用強制轉換為C數據類型轉換為各種類型,例如

print (char)$ecx

ecx的內容打印為一個字符。

print *(char**)$ecx

這會將ecx解釋為指向char*的指針,然后將其解除引用。 所以你會在ecx包含的地址中看到字符串的內容。

這只是冰山一角。 gdb是非常強大的工具。 您可能還會發現display命令很有用。 它與print基本相同,只要它在代碼停止時重復print命令(對斷點有用)。 您可以使用info registers檢查大多數寄存器,如果您是受虐狂,則可以查詢info all-registers

您還可以使用set更改寄存器的內容:

set $eax = 20

stepi通過說明,或continue運行程序。

PS如果你不知道,你可能想學習如何設置斷點等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM