2011-09-18 79 views
0

我想從最低字節到最高字節的EBX寄存器的連續字節中存儲斐波那契數列。我的代碼按預期工作,直到這一點:如何在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 

當我做一個DumpRegs的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。這可能嗎?

回答

1

將值寫入寄存器時,它從寄存器的最低位開始。除了第二個字節ah,bh,chdh之外,沒有辦法訪問高位而不訪問低位。你可以做你想做的右鍵每個存儲後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 
+0

'ror ebx,8'是一個巧妙的把戲,並且完美地工作!謝謝。 –

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的大小是四個字節(= 32位),所以不能將超過4個字節大小的值放入EBX。

我不知道你真的想做什麼,但這裏是一個很好的例子,如何將四個字節大小的值打包到EBX寄存器中。

您應該注意,BL = EBX的低8位,EBX的BX = 16低位。

換句話說:

BL = EBX的位[7..0]。

BH = EBX的位[15..8]。

BX = EBX的位[15..0]。

相關問題