我试图将fibonacci序列的数组存储在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 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的DumpRegs时。当我尝试将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。这可能吗?
答案 0 :(得分:1)
当您将值写入寄存器时,它从寄存器的最低位开始。除了使用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
答案 1 :(得分:0)
试试这段代码:
; 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]。