микропрограммный ассемблер (jasmin)

что делает эта команда в уме?

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]

if yes why do they don't give the same result in Jasmin when eax = 100h, ebx = 0, ecx = 100h

конец.

1
nl ja de
@Tinctorius: Я считаю, что этот вопрос относится к этому Jasmin , а не другой . Интересно, должен ли он иметь отдельный тег. Возможно, jasmin-x86 ?
добавлено автор Ilmari Karonen, источник
Это не связано с Jasmin, JVM-ассемблером, потому что mov и add не являются подходящими мнемониками для любой команды для JVM.
добавлено автор user824425, источник

1 ответы

скажем, у нас есть эти команды

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]

=> its actually mov ebx, [0x5B10] where 0x5B10 is the address number in the memory, but in my case the maximal address is 0xFFC < 0x5B10, so its out of range so the appeared result is the result of the before last command

поэтому, используя меньшие значения, такие как 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

BUT if we add before the last line something like

mov [0x70], 0x111

we will get in ebx 0x111

0
добавлено