assembly 错误:未指定操作大小- NASM

vsdwdz23  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(131)

我在工作在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_coordy_coord的前两个字节复制到pixel_x/pixel_y中,然后再复制下两个,再复制下两个,再复制下两个。我该怎么做呢?

mbzjlibv

mbzjlibv1#

处理器没有简单的存储器到存储器移动指令,因此,如果要移动 * 一次两个字节 *,正确的做法是使用寄存器作为中介:

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以使用寄存器中的值。)

相关问题