错误:未指定操作大小 - NASm

时间:2016-07-11 00:29:07

标签: assembly nasm x86-16 mov

我正在使用16位NASM程序集,但我的代码无法构建。这里的所有MOV线都会发生错误:

none

我读过这是因为汇编程序不知道变量的大小。我尝试了一些在线帖子提出的 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 ,但这也给出了同样的错误。我只是想将x_coord和y_coord的前两个字节复制到pixel_x / pixel_y,然后是接下来的两个,然后是接下来的两个,然后是接下来的两个。我怎样才能做到这一点?

谢谢:)

1 个答案:

答案 0 :(得分:4)

处理器没有简单的内存到内存移动指令,所以正确的做法是,如果你想一次移动两个字节,就是使用寄存器作为中介:

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