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

J'ai copié ce code exactement à partir de this tutorial.Assemblage d'apprentissage, problème avec le code?

Il est livré avec trois erreurs lors de la compilation avec NASM (en utilisant aucun paramètre, seul -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

ce serait bien si vous mettez en évidence les lignes avec des erreurs – Andrey

Répondre

5

Voir tanascius de réponse pour le problème avec la ligne 14. Vous avez besoin mov es, word [startaddr] ici.

Les lignes 20 et 28 ont un problème commun. Nasm nécessite la syntaxe mov [es:di],al. Aucun préfixe de taille n'est requis - il est implicite dans l'opérande de registre.

2

Selon this yasm reference (see Memory references) votre MSNA pourrait avoir un problème pour déterminer la taille de la mémoire référencée:

Habituellement, la taille d'une référence mémoire peut être déduite par les registres que vous déplacez - par exemple, "mov [rax], ecx" est un mouvement de 32 bits, car ecx est de 32 bits. YASM donne actuellement l'erreur "combinaison invalide d'opcode et d'opérandes" non-évidente si elle ne peut pas comprendre combien de mémoire vous déplacez. La solution dans ce cas consiste à ajouter un spécificateur de taille de mémoire: qword, dword, word ou byte.

Voilà un mouvement de mémoire à 64 bits, qui fixe 8 octets à partir de rax:
mov qword [rax], 1

Voici un mouvement de mémoire à 32 bits, qui fixe 4 octets:
mov dword [rax], 1

Voici un 16 -bit déplacement de mémoire, qui fixe 2 octets:
mov word [rax], 1

Voici un mouvement de mémoire de 8 bits, qui fixe 1 octet: mov byte [rax], 1