정확하게이 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>
그것을 분해 해 주셔서 감사합니다. 저는 uint32_t/uint8_t에 익숙하지 않지만 아이디어가 있습니다. – Gov
사용할 수있는 더 나은 유형이 있습니까? 이 경우에는 32 비트 및 8 비트 정수 유형을 나타 내기 위해 노력하고 있습니다. –
당신이 사용하는 것이 옳다는 것을 확신합니다. 저는 아직 초보자이며 C뿐만 아니라 잘 모릅니다. – Gov