Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 如何在EBX寄存器中存储连续字节_X86_Assembly_Nasm_Masm - Fatal编程技术网

X86 如何在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

我试图将斐波纳契序列的数组存储在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的转储时。然后,当我尝试将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]