2010-05-20 59 views
1
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 
+1

如果你突出显示有错误的行,这将是很好的 – Andrey 2010-05-20 11:53:43

回答

5

见tanascius的回答与线14的问题,您需要mov es, word [startaddr]在这里。

20行和28行有一个共同的问题。 Nasm需要语法mov [es:di],al。不需要大小前缀 - 它隐含在寄存器操作数中。

2

根据this yasm reference (see Memory references)您NASM可以在确定引用的内存的大小有一个问题:

通常,内存引用的大小可以通过您正在移动的寄存器来推断 - 例如,“mov [rax],ecx”是32位移动,因为ecx是32位。如果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