我刚刚开始学习装配,所以毫无疑问,这是一个愚蠢的问题,但我仍然无法弄明白。我试图编写一个以十六进制打印给定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
我在这里做错了什么?
答案 0 :(得分:3)
shl dx, cx ; Loose more significant digits << ERROR
应该是cl
,而不是cx
mov byte [cx], [dx] ; HEX_OUT[cx] = HEX_TABLE[dx] << ERROR
CPU通常不支持内存到内存操作。您必须在两步操作中执行此操作 - 从内存位置加载到寄存器,然后从寄存器存储到(其他)内存位置。