2016-11-12 9 views
2

NASMを使用してアセンブリコードを作成しようとしていますが、何らかの理由でエラーが発生し続けます。それは文字列を宣言した後、カンマ、コロン、デコレータ、または行の終わりを期待していると言われていますが、どうすればそれが問題になるかわかりません。NASM: "カンマ、コロン、デコレータまたはオペランドの後に続く行末"が文字列を宣言するとき

section .text 
     global main 
main: 
     mov edi,str 
lab3: 
     cmp [edi],' ' 
     je lab1 

     cmp [edi],0x0 
     je lab2 

     mov eax,4 
     mov ebx,1 
     mov ecx,edi 
     mov edx,1 
     int 0x80 
     inc edi 
     jmp lab3 
lab1: 
     inc edi 
     mov eax,4 
     mov ebx,1 
     mov ecx,nwln 
     mov edx,1 
     int 0x80 
     jmp lab3 

lab2: 
     mov eax,1 
     int 0x80 

section .data 
str db 'this is a test',0x0  ;this is the line giving the error 
nwln db 0xa 
+0

nasmにはラベルの後にコロンが必要です。つまり、 'str:db 'これはテストです。'、0x0' – Jester

+0

@Jester:有効でないニーモニックである場合にのみ、ラベルオプションが存在します。 OPのプログラムは、 'str'を' str1'に変更するときにアセンブルされます。 ( 'cmp mem、immediate'命令のオペランドサイズが足りないことを除いて) –

+3

頭痛の少ない、常に使いたい方がいいです。また、来年のインテルがあなたのラベル名と衝突する新しい命令を導入すればどうなるのでしょうか... – Jester

答えて

6

STR(ストアタスクレジスタ)は、命令ニーモニックです。コロンを付けずにラベルとして使用しています。 str: db ...が有効でした。それはあなたがコードやデータを標識しているかどうか、ラベル名後:を使用し、常にに良い習慣だstring.asm:33: error: unexpected DB/DW/etc. after instruction


YASMは、ここでは、より便利なエラーメッセージを表示します。人間の読者にとってはより明確であり、将来の命令ニーモニックやアセンブラディレクティブに対する未来の証明です。

それはあなたが自分自身で行にcqde(ないcqde:)のようなものを書く場合ので、あなたが警告を受けるも-Worphan-labelsビルドすることをお勧めします。そのオプションがなければ、その行にラベルを置きます。このオプションを選択すると、警告が表示され、cdqeと入力したことがわかります。それはで組み立てないので(またはその他のオペランドなしx86命令。)ところで


は、即時およびメモリオペランドで命令を使用するときcmp byte [edi],' 'オペランド・サイズ修飾子を使用することを忘れないでくださいあいまいなオペランドサイズ。

また、意味のあるラベル名を使用してください。 lab1の代わりに.space_foundのようにします。

関連する問題