我正在进行一项需要调试AT& T程序集的作业。我在使用以下两行时遇到了麻烦,只是想要一点澄清。
add -0x8(%esi,%ebx,4),%eax
cmp %eax,-0x4(%esi,%ebx,4)
我知道%esi
包含用户输入的值,而%eax
和%ebx
都等于2.
对于第一行,我将其解释为“-8 + %esi + (%ebx*4) + %eax
”。由于我知道%ebx
为2,因此评估为%esi + %eax
。基本上,添加行只是将输入值加2。
我知道的第二行是将%eax
与-0x4(%esi,%ebx,4)
进行比较。此时%eax
等于%esi + 2
,并且遵循先前的逻辑,右侧值等于-4 + %esi + (%ebx*4)
,因为%esi + 4
仍然等于2,所以%ebx
将评估为%esi + 2
如果我是正确的,那意味着第二行是%esi + 4
与{{1}}的比较,对于任何输入值都不能为真。然而,根据任务,它必须是真实的。我的翻译在哪里出错?
答案 0 :(得分:1)
那些是内存操作数。
add -0x8(%esi,%ebx,4),%eax
将地址esi + ebx*4 - 8
中存储的值添加到eax
。
cmp %eax,-0x4(%esi,%ebx,4)
将地址esi + ebx*4 - 4
中存储的值与eax
进行比较。