imul使用DWORD PTR [reg + reg * n-n]

时间:2013-07-25 18:39:40

标签: assembly x86 gdb

我显然不明白这个imul到底发生了什么,因为当我自己进行计算时它不会出现2.如果有人能解释r / m形式以及为什么imul得到2我会大大欣赏它。

esi和ebx都是0x1。 * 4是指字大小,对吗? (4我想是DWORD)? 最后一部分-0x4是位移?只是为了增加或减去价值?

顺便说一句,当我自己进行计算时,如果你还没猜到,我会得到-2。

9: x/32xw $esp
0xffffd300: 0xffffd3f4  0x00000000  0xffffd338  0x08049226
0xffffd310: 0x00000001  0x00000002  0x00000006  0x00000001
0xffffd320: 0x00000002  0x00000006  0xffffd358  0x08048a83
0xffffd330: 0x0804b6d0  0x08049620  0xffffd358  0x08048a7a
8: /x $ebp = 0xffffd328
7: /x $ebx = 0x1
6: /x $ecx = 0x0
5: /x $edx = 0x0
4: /x $edi = 0x0
3: /x $esi = 0xffffd310
2: /x $eax = 0x2
1: x/10i $eip
=> 0x8048b79 <phase_2+49>:  imul   eax,DWORD PTR [esi+ebx*4-0x4]
   0x8048b7e <phase_2+54>:  cmp    DWORD PTR [esi+ebx*4],eax

(gdb) 
0x08048b7e in phase_2 ()
9: x/32xw $esp
0xffffd300: 0xffffd3f4  0x00000000  0xffffd338  0x08049226
0xffffd310: 0x00000001  0x00000002  0x00000006  0x00000001
0xffffd320: 0x00000002  0x00000006  0xffffd358  0x08048a83
0xffffd330: 0x0804b6d0  0x08049620  0xffffd358  0x08048a7a
8: /x $ebp = 0xffffd328
7: /x $ebx = 0x1
6: /x $ecx = 0x0
5: /x $edx = 0x0
4: /x $edi = 0x0
3: /x $esi = 0xffffd310
2: /x $eax = 0x2
1: x/10i $eip
=> 0x8048b7e <phase_2+54>:  cmp    DWORD PTR [esi+ebx*4],eax
   0x8048b81 <phase_2+57>:  je     0x8048b88 <phase_2+64>

2 个答案:

答案 0 :(得分:2)

imul eax,DWORD PTR [esi+ebx*4-0x4]相当于C类伪代码中的这个表达式:

eax = eax * *(uint32_t *)((uint8_t *)esi + ebx*4 - 4)

代替你的价值观:

eax = 2 * *(uint32_t *)((uint8_t *)0xffffd310 + 1*4 - 4)
eax = 2 * *(uint32_t *)0xffffd310
eax = 2 * 1
eax = 2

同样,cmp指令正在将eaxDWORD PTR [esi+ebx*4]进行比较,例如:

eax == *(uint32_t *)((uint8_t *)esi + ebx * 4)
2 == *(uint32_t *)((uint8_t *)0xffffd310 + 1*4)
2 == *(uint32_t *)0xffffd314
2 == 2

并将导致真正的比较。

答案 1 :(得分:0)

$ esi不是0x1 - 它是0xffffd310,它是堆栈上的地址。 DWORD PTR正在读取堆栈内存位置的内容,而[]中的表达式是地址计算。