私は楽しみのためにアセンブラを学ぶことにしました。私は長年 C でコーディングしてきました。
「Hello world」を出力するいくつかのオンライン チュートリアルに従い、NASM マニュアルを少し掘り下げました。すべて順調です。そこで、ループで「hello world」を出力するタスクを設定しました。loop
オペコードを使用してこれを実行できることはわかっていますが、明示的にコーディングして、.bss
セクションで定義されている変数を使用したいと考えていました。
ただし、エラーメッセージが表示されるため、アセンブリで変数の割り当てがどのように機能するかを明らかに誤解しています。
nasm -felf -o hello.o hello.asm
hello.asm:16: error: invalid combination of opcode and operands
hello.asm:17: error: invalid combination of opcode and operands
hello.asm:28: error: invalid combination of opcode and operands
NASM マニュアルなど、変数の割り当てに関する情報を Web で検索しようとしましたが、必要な情報が見つからないようです。誰でも手伝ってもらえますか? これが私の(シンプルな!)コードです:
; print "Hello world!" to the screen multiple times
section .data
msg: db 'Hello world!', 10
msglen: equ $ - msg
section .bss
iter: resb 1
section .text
global _start
_start:
; loop 10 times
mov iter, 0 ; initalise loop counter
FL: cmp iter, 10 ; is iter == 10?
jge LoopEnd
; write the message to STDOUT:
mov eax,4 ; code for write syscall
mov ebx,1 ; stdout fd
mov ecx,msg ; message to print...
mov edx,msglen ; ...and it's length
int 80h ; kernel interrupt
; increment loop iterator
inc iter
jp FL
LoopEnd:
; now exit, with return code 0:
mov eax,1
mov ebx,0
int 80h