我决定学习汇编程序很有趣。我已经用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
Run Code Online (Sandbox Code Playgroud)
我尝试在网络上搜索有关变量分配的信息,包括NASM手册,但似乎找不到我需要的信息。有人可以协助吗?这是我的(简单!)代码:
; 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
Run Code Online (Sandbox Code Playgroud)
要以nasm形式引用内存,必须用方括号括住地址。此外,在每种情况下,您还需要指定尺寸,例如:
mov byte [iter], 0 ; initalise loop counter
FL: cmp byte [iter], 10 ; is iter == 10?
inc byte [iter]
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,将其存储iter在寄存器中而不是存储中可能更有意义。您正在使用系统调用来破坏大多数显而易见的功能,但是看起来esi还是edi可用的。