jmp start
;==============================
; Draws a horiz and vert line
;==============================
startaddr dw 0a000h ;start of video memory
colour db 1
;==============================
start:
mov ah,00
mov al,19
int 10h ;switch to 320x200 mode
;=============================
horiz:
mov es, startaddr ;put segment address in es ; <--- Error Line 14
mov di, 32000 ;row 101 (320 * 100)
add di, 75 ;column 76
mov al,colour ;cannot do mem-mem copy so use reg
mov cx, 160 ;loop counter
hplot:
mov es:[di],al ;set pixel to colour ; <--- Error
inc di ;move to next pixel
loop hplot
vert:
mov di, 16000 ;row 51 (320 * 50)
add di, 160 ;column 161
mov cx, 100 ;loop counter
vplot:
mov es:[di],al ; <--- Error
add di, 320 ;mov down a pixel
loop vplot
;=============================
keypress:
mov ah,00
int 16h ;await keypress
end:
mov ah,00
mov al,03
int 10h
mov ah,4ch
mov al,00 ;terminate program
int 21h
我完全从this tutorial。
复制了这段代码使用NASM编译时出现三个错误(不使用参数,只有-o output.exe
):
14: Error: Invalid combination of opcode and operands
20: Error: Invalid combination of opcode and operands
28: Error: Invalid combination of opcode and operands
答案 0 :(得分:5)
请参阅tanascius对第14行问题的回答。您需要mov es, word [startaddr]
。
第20和28行有一个共同的问题。 Nasm需要语法mov [es:di],al
。不需要大小前缀 - 它隐含在寄存器操作数中。
答案 1 :(得分:2)
根据this yasm reference (see Memory references)你的NASM可能在确定引用的内存大小时遇到问题:
通常,内存引用的大小可以通过您正在移动的寄存器来推断 - 例如,“mov [rax],ecx”是32位移动,因为ecx是32位。如果YASM无法计算出你正在移动的内存量,那么YASM目前会给出非显而易见的“操作码和操作数的无效组合”错误。在这种情况下,修复是添加内存大小说明符:qword,dword,word或byte。
这是一个64位的内存移动,从rax开始设置8个字节:
mov qword [rax], 1
这是一个32位的内存移动,设置4个字节:
mov dword [rax], 1
这是一个16位的内存移动,设置2个字节:
mov word [rax], 1
这是一个8位内存移动,设置1个字节:
mov byte [rax], 1