2015-09-29 126 views
3

我正在編寫NASM彙編代碼,並且必須做一些索引編址。我將索引存儲在$ al中,但x86不會讓您將$ al用作索引寄存器,並且我已經使用$ bl,所以我不能使用$ bx。所以我需要把我在$ al中的字節放到一個32位寄存器中,比如$ ecx,然而,當我嘗試時,它會拋出'操作碼和操作數無效組合'的錯誤。有沒有辦法做到這一點?NASM - 如何將8位寄存器移動到完整的32位寄存器中?

sub  al, 97     ; char - 97 

    push ecx      ; b/c al cant be used as indexing register 
    mov  ecx, al     ; move byte in al into ecx 

    mov  bl, [table + ecx]  ; value_at(first_table_addr + char) -> bx 

    pop  ecx 

回答

7

使用MOVZX instruction

movzx ecx, al ; move byte to doubleword, zero-extension 

還有MOVSX,如果你想爲簽署在待處理al值。

零擴展表示目標操作數的高位將被設置爲零,而符號擴展表示目標操作數的高位將被設置爲源操作數的符號位。一些例子:

mov al,0x7F 
movzx ebx,al ; ebx = 0x0000007F 
movsx ebx,al ; ebx = 0x0000007F 

mov al,0x80 
movzx ebx,al ; ebx = 0x00000080 
movsx ebx,al ; ebx = 0xFFFFFF80 
+0

所以我的理解是,「零擴展」只是填補了剩餘的24位奇與零ECX?所以不管是有沒有弄髒的少數我把在? –

+0

這是正確的。 – Michael

+0

太棒了,工作,非常感謝你 –

相關問題