这个命令在汇编中做了什么?
mov ebx, [eax+ecx*4+12]
它是否与以下内容相同?
MOV EBX,ECX
ADD EBX,EBX ; *2
ADD EBX,EBX ; *4
ADD EBX,EAX
ADD EBX,12
MOV EBX,[EBX]
如果是,为什么他们在Jasmin中不给出相同的结果时eax = 100h
, ebx = 0
,ecx = 100h
结尾。
这个命令在汇编中做了什么?
mov ebx, [eax+ecx*4+12]
它是否与以下内容相同?
MOV EBX,ECX
ADD EBX,EBX ; *2
ADD EBX,EBX ; *4
ADD EBX,EAX
ADD EBX,12
MOV EBX,[EBX]
如果是,为什么他们在Jasmin中不给出相同的结果时eax = 100h
, ebx = 0
,ecx = 100h
结尾。
假设我们有这些命令
mov eax, 0x1234 ; 1234h
mov ebx, 0
mov ecx, 0x1234 ; 1234h
MOV EBX,ECX ; ebx = 0x1234
ADD EBX,EBX ; *2
ADD EBX,EBX ; *4
ADD EBX,EAX ; ebx = 0x5B04
ADD EBX,12 ; ebx = 0x5B10
MOV EBX, [EBX] ; Error out of range
; Or
mov ebx, [eax+ecx*4+12] ; => mov ebx, [0x1234+0x1234*4+12]
=> 它实际上是mov ebx, [0x5B10]其中0x5B10是内存中的地址号,但在我的情况下,最大地址是0xFFC < 0x5B10,所以它超出了范围,所以出现的结果是最后一个命令的结果
所以通过使用像0x14这样更小的值,我们会得到相同的结果
mov eax, 0x14 ; eax = 0x14
mov ebx, 0 ; ebx = 0
mov ecx, 0x14 ; ecx = 0x14
MOV EBX,ECX ; ebx = 0x14
ADD EBX,EBX ; *2
ADD EBX,EBX ; *4
ADD EBX,EAX ; ebx = 0x64
ADD EBX,12 ; ebx = 0x70
MOV EBX, [EBX] ; => mov ebx, [0x70]
; Or
mov ebx, [eax+ecx*4+12] ; => mov ebx, [0x14+0x14*4+12] => mov ebx, [0x70]
我们得到两种情况或方法:
eax = 0x14
ebx = 0 => its 0 because the address 0x70 in the memory is empty = 0x0000
ecx = 0x14
但是如果我们在最后一行之前添加类似
mov [0x70], 0x111
我们将进入ebx 0x111