如何在EBX寄存器中存储连续的字节

时间:2011-09-18 04:12:58

标签: x86 assembly nasm masm

我试图将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。这可能吗?

2 个答案:

答案 0 :(得分:1)

当您将值写入寄存器时,它从寄存器的最低位开始。除了使用ahbhchdh的第二个字节外,无法访问高位而无法访问低位。您可以通过在每次存储后将寄存器右移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]。