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

このコードは、このチュートリアルから正確にコピーしました。

NASM でコンパイルすると、次の 3 つのエラーが発生します (パラメーターを使用せず、 のみを使用-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
4

2 に答える 2

5

14行目の問題については、タナシウスの回答を参照してください。ここが必要mov es, word [startaddr]です。

20 行目と 28 行目に共通の問題があります。Nasm には構文が必要mov [es:di],alです。サイズのプレフィックスは必要ありません。レジスタ オペランドでは暗黙的です。

于 2010-05-20T12:06:51.383 に答える
2

この yasm リファレンス (メモリ リファレンスを参照)によると、NASM は参照されるメモリのサイズを決定する際に問題が発生する可能性があります。

通常、メモリ参照のサイズは、移動するレジスタによって推測できます。たとえば、ecx は 32 ビットであるため、"mov [rax],ecx" は 32 ビットの移動です。YASM は現在、移動しているメモリの量を把握できない場合、明らかではない「オペコードとオペランドの組み合わせが無効です」というエラーを出します。この場合の修正は、メモリ サイズ指定子 (qword、dword、word、または byte) を追加することです。

以下は、rax から始まる 8 バイトを設定する 64 ビット メモリの移動です。
mov qword [rax], 1

以下は、4 バイトを設定する 32 ビットのメモリ移動です。
mov dword [rax], 1

以下は、2 バイトを設定する 16 ビットのメモリ移動です。
mov word [rax], 1

以下は、1 バイトを設定する 8 ビットのメモリ移動です。
mov byte [rax], 1

于 2010-05-20T12:00:20.083 に答える