2010-05-20 58 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