2013-07-25 4 views
1

정확하게이 imul로 무슨 일이 일어나는지 정확히 이해하지 못합니다. 계산을 할 때 2로 나오지 않기 때문입니다. 누군가가 r/m을 설명 할 수 있다면 형태와 왜 imul이 2를 얻고 있는지 나는 크게 감사 할 것입니다.imul은 DWORD PTR을 사용합니다. [reg + reg * nn]

esi 및 ebx = 0x1. * 4는 단어 크기를 참조하고 있습니까? (4 DWORD 내가 생각하는) 무엇입니까? 마지막 부분 인 -0x4가 위치 변경입니까? 값을 더하거나 뺄 때만 사용 하시겠습니까?

그런데 계산을 할 때 이미 짐작하지 않으면 -2가됩니다.

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

대체 당신의 가치 :

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 = 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