1. ホーム
  2. assembly

[解決済み] エラーです。操作サイズが指定されていません - NASm

2022-02-06 17:11:55

質問

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の最初の2バイトをpixel_x/pixel_yにコピーし、次の2バイト、次の2バイト、そして次の2バイトをコピーしたいだけなのですが、どうすればよいでしょうか?どうしたらこれがうまくいくのでしょうか?

ありがとうございます :)

解決方法は?

プロセッサには単純なメモリ間移動命令がないので、移動する場合は 一度に2バイト レジスタを媒介として使用します。

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

4ピクセルしか描画しない場合は、1つずつ呼び出しを行うことができます。

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 を使用して、レジスタからの値を使用します)。