Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly imul使用DWORD PTR[reg+;reg*n-n]_Assembly_X86_Gdb - Fatal编程技术网

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

Assembly 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

我显然不明白这个imul到底发生了什么,因为当我自己计算的时候,它不是2。如果有人能解释r/m表格以及为什么imul得到2,我将不胜感激

esi和ebx都=0x1。 *4是指字号,对吗?(我想是德沃德吧)? 最后一部分,-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>
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。