[英]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。
您可以使用寄存器來評估表達式,如果這就是您所要求的。
gdb的print
命令是你的朋友。
基本上你可以通過在美元符號前加上查詢寄存器,例如
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.