gpt4 book ai didi

assembly - 错误 : Operation size not specified - NASm

转载 作者:行者123 更新时间:2023-12-03 15:51:02 27 4
gpt4 key购买 nike

我正在使用 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中,然后是接下来的两个,然后是接下来的两个,然后是接下来的两个。我怎样才能使这项工作?

谢谢 :)

最佳答案

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

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

关于assembly - 错误 : Operation size not specified - NASm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38297648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com