Assembly imul使用DWORD PTR[reg+;reg*n-n]
我显然不明白这个imul到底发生了什么,因为当我自己计算的时候,它不是2。如果有人能解释r/m表格以及为什么imul得到2,我将不胜感激 esi和ebx都=0x1。 *4是指字号,对吗?(我想是德沃德吧)? 最后一部分,-0x4,是位移?只是为了增加或减少的价值 顺便说一下,当我自己计算时,如果你还没有猜到的话,我得到-2Assembly imul使用DWORD PTR[reg+;reg*n-n],assembly,x86,gdb,Assembly,X86,Gdb,我显然不明白这个imul到底发生了什么,因为当我自己计算的时候,它不是2。如果有人能解释r/m表格以及为什么imul得到2,我将不胜感激 esi和ebx都=0x1。 *4是指字号,对吗?(我想是德沃德吧)? 最后一部分,-0x4,是位移?只是为了增加或减少的价值 顺便说一下,当我自己计算时,如果你还没有猜到的话,我得到-2 9: x/32xw $esp 0xffffd300: 0xffffd3f4 0x00000000 0xffffd338 0x08049226 0xffffd310: 0
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>
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:imul eax,DWORD PTR[esi+ebx*4-0x4]
0x8048b7e:cmp DWORD PTR[esi+ebx*4],eax
(gdb)
0x08048b7e在相位_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:cmp DWORD PTR[esi+ebx*4],eax
0x8048b81:je 0x8048b88
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
指令将eax
与DWORD 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
并将导致真正的比较。$esi不是0x1——它是0xffffd310,它是堆栈上的一个地址。DWORD PTR正在读取堆栈内存位置的内容,[]中的表达式是地址计算 我的意思是esi指向的地址是0x1,这不是imul计算它时使用的地址吗?感谢您将其分解,我对uint32\u t/uint8\t不熟悉,但我有一个想法,我现在会仔细阅读。有更好的类型吗?在本例中,我只是尝试指出32位和8位整数类型。我确信您使用的是正确的,我在这里仍然只是一个初学者,不知道C以及我应该。您最好在深入研究汇编之前尝试学习C。