【问题标题】:How to store consecutive bytes in the EBX register如何在 EBX 寄存器中存储连续字节
【发布时间】:2011-09-18 04:12:57
【问题描述】:

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

【问题讨论】:

    标签: x86 assembly nasm masm


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      试试这个代码:

      ; 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.
      

      当然,由于每个值占用 1 个字节 = 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]。

      【讨论】:

        猜你喜欢
        • 2011-04-22
        • 2019-04-21
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        相关资源
        最近更新 更多