Сборка обучения, проблема с кодом? - PullRequest
1 голос
/ 20 мая 2010
    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 возникает три ошибки (без параметров, только -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

Ответы [ 2 ]

5 голосов
/ 20 мая 2010

См. Ответ tanascius для проблемы со строкой 14. Вам нужно mov es, word [startaddr] здесь.

Строки 20 и 28 имеют общую проблему. Nasm требует синтаксиса mov [es:di],al. Префикс размера не требуется - он присутствует в операнде регистра.

2 голосов
/ 20 мая 2010

Согласно этой ссылке на yasm (см. Ссылки на память) У вашего NASM может быть проблема с определением размера памяти, на которую ссылаются:

Обычно размер ссылки на память может быть определен по тем регистрам, которые вы перемещаете - например, "mov [rax], ecx" - это 32-битный шаг, потому что ecx равен 32 битам. В настоящее время YASM выдает неочевидную ошибку «недопустимая комбинация кода операции и операндов», если не может определить, сколько памяти вы перемещаете. Исправление в этом случае заключается в добавлении спецификатора размера памяти: qword, dword, word или byte.

Вот 64-битный ход памяти, который устанавливает 8 байтов, начиная с rax:
mov qword [rax], 1

Вот 32-битный ход памяти, который устанавливает 4 байта:
mov dword [rax], 1

Вот 16-битный ход памяти, который устанавливает 2 байта:
mov word [rax], 1

Вот 8-битный ход памяти, который устанавливает 1 байт:
mov byte [rax], 1

...