gpt4 book ai didi

c - GDB:汇编指令计算

转载 作者:太空狗 更新时间:2023-10-29 17:23:02 32 4
gpt4 key购买 nike

我是 assembly 新手。除了正在调试的实际代码之外,有没有办法在 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 上,$eax 是 2 得到 7 . 而 $eax 是 2。

最佳答案

如果您要求的话,您可以使用寄存器计算表达式。

gdbprint 命令是您的 friend 。

基本上,您可以通过在前面加上美元符号来查询寄存器,例如

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通过指令,或者继续运行程序。

附言如果您不知道,您可能想学习如何设置断点等。

关于c - GDB:汇编指令计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773101/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com