Ошибка: размер операции не указан - NASm

Я работаю в 16-битной сборке NASM, и у меня проблема, из-за которой мой код не собирается. Ошибка происходит на всех линиях MOV здесь:

  section .bss
  x_coord   RESB 8 ; [x_coord] is the head, [x_coord+2] is the next cell, etc.
  y_coord   RESB 8 ; Same here
  pixel_x  RESB 2  ; Storage for calculations
  pixel_y  RESB 2  ; Storage for calculations

   ...


  MOV [pixel_x], [x_coord]
  MOV [pixel_y], [y_coord]
  CALL DrawPixel

  MOV [pixel_x], [x_coord+2]
  MOV [pixel_y], [y_coord+2]
  CALL DrawPixel

  MOV [pixel_x], [x_coord+4]
  MOV [pixel_y], [y_coord+4]
  CALL DrawPixel

  MOV [pixel_x], [x_coord+6]
  MOV [pixel_y], [y_coord+6]
  CALL DrawPixel

Я читал, что это происходит потому, что ассемблер не знает, какого размера переменные. Я старался MOV [pixel_x], byte [x_coord] предложенный некоторым сообщением онлайн, но это дает ту же самую ошибку. Я просто хочу скопировать первые два байта x_coord и y_coord в pixel_x / pixel_y, затем следующие два, затем следующие два, затем следующие два. Как я могу сделать эту работу?

Спасибо:)

1 ответ

Решение

Процессор не имеет простой инструкции перемещения памяти в память, поэтому, если вы хотите перемещать два байта за раз, правильнее всего использовать регистр в качестве посредника:

MOV ax, word [x_coord]
MOV word [pixel_x], ax
MOV ax, word [y_coord]
MOV word [pixel_y], ax
CALL DrawPixel

Поскольку ваши переменные непрерывны в памяти, вы также можете сделать это:

MOV eax, dword [x_coord]  ; move BOTH x_coord AND y_coord into the register
MOV dword [pixel_x], eax  ; populates BOTH pixel_x AND pixel_y
CALL DrawPixel

Если вы рисуете только четыре пикселя, вы можете выполнять вызовы один за другим:

MOV eax, dword [x_coord]
MOV dword [pixel_x], eax
CALL DrawPixel
MOV eax, dword [x_coord+2]
MOV dword [pixel_x], eax
CALL DrawPixel
MOV eax, dword [x_coord+4]
MOV dword [pixel_x], eax
CALL DrawPixel
MOV eax, dword [x_coord+6]
MOV dword [pixel_x], eax
CALL DrawPixel

Если бы у вас было больше пикселей, вы можете нарисовать цикл.

(Помимо: также рассмотреть вопрос о реализации DrawPixel использовать значения из регистра.)

Другие вопросы по тегам