X86 如何在EBX寄存器中存储连续字节
我试图将斐波纳契序列的数组存储在EBX寄存器从最低字节到最高字节的连续字节中。到目前为止,我的代码仍按预期工作:X86 如何在EBX寄存器中存储连续字节,x86,assembly,nasm,masm,X86,Assembly,Nasm,Masm,我试图将斐波纳契序列的数组存储在EBX寄存器从最低字节到最高字节的连续字节中。到目前为止,我的代码仍按预期工作: fib0=0 fib1=1 fib2= fib0 + fib1 fib3= fib1 + fib2 fib4= fib2 + fib3 fib5= fib3 + fib4 fib6= fib4 + fib5 .data array BYTE fib2, fib3, fib4, fib5, fib6 ;Adding elements to the array .code main
fib0=0
fib1=1
fib2= fib0 + fib1
fib3= fib1 + fib2
fib4= fib2 + fib3
fib5= fib3 + fib4
fib6= fib4 + fib5
.data
array BYTE fib2, fib3, fib4, fib5, fib6 ;Adding elements to the array
.code
main PROC
xor ebx,ebx
xor esi,esi
mov esi,OFFSET array ; Moves array in to ESI for offset
inc esi ; incrementing to fib3 value
mov bl,[esi] ; fib3 going to bl registry
inc esi ; inc. to fib4 value
mov bh,[esi] ; fib4 going to bh registry
当我进行EBX=00000302的转储时。然后,当我尝试将fib5移动到bx注册表时,它似乎覆盖了其他两个bl和bh注册表值。因此,当我使用以下代码将另外两个fib值写入ebx注册表时:
inc esi ; inc. to fib5 value
mov bx,[esi] ; fib5 going to bx registry
inc esi ; inc. to fib6 value
mov ebx,[esi] ; fib6 going to ebx registry
我的EBX=00000008的最终值,这意味着最终mov语句将完全覆盖整个寄存器。我希望它在连续字节中看起来像这个EBX=08050302。这可能吗?将值写入寄存器时,它从寄存器的最低位开始。除了第二个字节(带有
ah
、bh
、ch
和dh
)之外,不访问低位就无法访问高位。您可以通过在每次存储后将寄存器向右旋转8位来完成所需的操作,这会将低位字节移动到高位字节,将其他字节向下移动1位
xor ebx,ebx
mov cl,4 ; 4 byte counter
mov esi,OFFSET array ; Moves array in to ESI for offset
0:
inc esi ; incrementing to next fib value
mov bl,[esi] ; fib going to bl registry
ror ebx,8 ; Rotate right 8 bits
dec cl
jnz 0b
请尝试以下代码:
; xor esi,esi - not needed because the next line will overwrite esi anyway.
mov esi,OFFSET array ; Moves array in to ESI for offset
inc esi ; incrementing to point to fib3 value
mov bl,[esi+2] ; fib5 temporarily going to bl register
mov bh,[esi+3] ; fib6 temporarily going to bh register
shl ebx, 16 ; fib5,fib6 moving to high half of EBX register
mov bl,[esi] ; fib3 going to bl register
mov bh,[esi+1] ; fib4 going to bh register
add esi,4 ; now esi will point to fib7 value
; EBX register now has all for values (from high to low end of EBX): fib6, fib5, fib4, fib3
; END Of code.
当然,由于每个值取一个字节=8位,并且EBX的大小为4个字节(=32位),所以不能将超过4个字节大小的值放入EBX
我不知道您真正想做什么,但这里有一个很好的例子,如何将四字节大小的值打包到EBX寄存器中
您应该注意,BL=EBX的8个低位,BX=EBX的16个低位
换言之:
BL=EBX的位[7..0]
BH=EBX的位[15..8]
BX=EBX的位[15..0]