Как сохранить последовательные байты в регистре EBX - PullRequest
0 голосов
/ 18 сентября 2011

Я пытаюсь сохранить массив последовательности Фибоначчи в последовательных байтах регистра 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 в последовательных байтах.Это возможно?

Ответы [ 2 ]

1 голос
/ 18 сентября 2011

Когда вы записываете значение в регистр, оно начинается с младших битов регистра. Невозможно получить доступ к старшим битам без доступа к младшим, за исключением второго байта с 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
0 голосов
/ 28 ноября 2012

Попробуйте этот код:

; 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 бита), вы не можете поместить в EBX более 4-х байтовых значений.

Я понятия не имею, что вы действительно хотите сделать, но вот хороший пример, как упаковать четыре байтовых значения в регистр EBX.

Следует отметить, что BL = 8 младших бит EBX, а BX = 16 младших бит EBX.

Другими словами:

BL = биты [7..0] EBX.

BH = биты [15..8] EBX.

BX = биты [15..0] EBX.

...