操作码和操作数的操作无效

时间:2014-09-29 15:50:04

标签: assembly

我刚刚开始学习装配,所以毫无疑问,这是一个愚蠢的问题,但我仍然无法弄明白。我试图编写一个以十六进制打印给定16位字的过程。

我认为我可以通过向左和向右移动将其划分为4位块,然后将其用作索引以将符号常量从准备好的表复制到输出变量。这是我的代码现在的样子:

; Print hex at AX
print_hex:
    pusha
    mov cx, 0                   ; iterator CX = 0
    print_hex_loop:
        mov dx, bx              ; DX = symbol index
        shl dx, cx              ; Loose more significant digits << ERROR
        shr dx, 3               ; Loose less significant digits
        add dx, HEX_TABLE       ; DX = table address
        add cx, HEX_OUT + 2     ; CX = output address
        mov byte [cx], [dx]     ; HEX_OUT[cx] = HEX_TABLE[dx] << ERROR
        sub cx, HEX_OUT + 2     ; CX = iterator
        add cx, 1               ; increase iterator CX
        cmp cx, 4               ; if iterator CX less then 4
        jb print_hex_loop       ; repeat loop
    mov ax, HEX_OUT
    call print_string_loop
    popa
    ret

HEX_TABLE:  db '0123456789abcdef'
HEX_OUT:    db '0x0000', 0

然而,我得到的错误是我对shl和mov行不太了解:

utility.asm:23: error: invalid combination of opcode and operands
utility.asm:27: error: invalid combination of opcode and operands

我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

shl dx, cx              ; Loose more significant digits << ERROR

应该是cl,而不是cx

mov byte [cx], [dx]     ; HEX_OUT[cx] = HEX_TABLE[dx] << ERROR

CPU通常不支持内存到内存操作。您必须在两步操作中执行此操作 - 从内存位置加载到寄存器,然后从寄存器存储到(其他)内存位置。