微程序汇编程序(jasmin)

时间:2012-12-28 13:34:50

标签: assembly nasm jasmin-x86

这个命令在assambly中做了什么?

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]

如果是,为什么在eax = 100hebx = 0ecx = 100h <时,为什么他们不会在 Jasmin 中提供相同的结果/ p>

端。

1 个答案:

答案 0 :(得分:0)

假设我们有这些命令

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]

=&GT;它实际上是 mov ebx,[0x5B10] ,其中 0x5B10 是内存中的地址编号,但在我的情况下最大地址是 0xFFC&lt; 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