2013-07-25 32 views
1

我清楚地不明白這個imul究竟發生了什麼,因爲當我做計算時,我自己不會出現爲2.如果有人能解釋r/m形式,爲什麼imul越來越2我非常感謝它。imul使用DWORD PTR [reg + reg * nn]

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

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指令與DWORD PTR [esi+ebx*4]比較eax,像:

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

而且會導致真正的比較。

+0

感謝您的分解,我對uint32_t/uint8_t不熟悉,但我有一個想法,現在我會讀到它們。 – Gov

+0

有更好的類型可以使用嗎?在這種情況下,我只是試圖指出32位和8位整數類型。 –

+0

我敢肯定,你使用什麼是正確的,我仍然在這裏只是一個初學者,不知道的C,以及我應該。 – Gov

0

$ esi不是0x1 - 它是0xffffd310,它是堆棧中的地址。 DWORD PTR正在讀取堆棧內存位置的內容,[]中的表達式是地址計算。

+0

我的意思是esi指向的地址是0x1,那不是imul用來計算的地址嗎? – Gov