因为您似乎在 Linux 上使用 NASM。 nwln 是一个宏,它是Assembler Tutorial 的一部分,它基于Linux 中的汇编语言编程指南 一书中的代码。该库由一个名为 nwln 的宏组成,该宏将 LineFeed(LF) 字符 0x0a 打印到标准输出。您可以从上面的链接下载文件io.mac 和io.o。它们包含在 NASM/Linux 的 ZIP file 中。您将io.mac 和io.o 复制到您的项目目录。您必须在程序顶部包含宏文件。您的代码如下所示:
%include "io.mac"
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
section .text
global main
main:
mov ecx,msg3
mov edx,0 ; Set the length
jmp lab2
lab2:
cmp [ecx],byte ' '
je lab1
cmp [ecx], byte 0
je lab3
inc edx
inc ecx
jmp lab2
lab1:
sub ecx,edx
mov eax, SYS_WRITE
mov ebx, STDOUT
int 80h
nwln
add ecx, edx
inc ecx
mov edx,0
jmp lab2
lab3:
sub ecx,edx
mov eax, SYS_WRITE
mov ebx, STDOUT
int 80h
nwln
mov eax, SYS_EXIT
int 80h
segment .data
msg3 db 'this string', 0x0
要在 32 位环境中编译和链接,您可以使用以下代码:
nasm -f elf32 project.asm
ld -emain -melf_i386 -o project project.o io.o
您需要将io.o 添加为链接器对象,以解析宏所需的功能。
如果您不想依赖io.o,下面的代码包含等效的宏和函数,它们将以类似的方式实现nwln:
%macro nwln 0
call proc_nwln
%endmacro
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
section .text
global main
main:
mov ecx,msg3
mov edx,0 ; Set the length
jmp lab2
lab2:
cmp [ecx],byte ' '
je lab1
cmp [ecx], byte 0
je lab3
inc edx
inc ecx
jmp lab2
lab1:
sub ecx,edx
mov eax, SYS_WRITE
mov ebx, STDOUT
int 80h
nwln
add ecx, edx
inc ecx
mov edx,0
jmp lab2
lab3:
sub ecx,edx
mov eax, SYS_WRITE
mov ebx, STDOUT
int 80h
nwln
mov eax, SYS_EXIT
int 80h
proc_nwln:
pusha
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, new_line
mov edx, 0x1
int 0x80
popa
ret
segment .data
msg3 db 'this string', 0x0
new_line db 0x0a
然后您可以使用以下内容进行编译:
nasm -f elf32 project.asm
ld -emain -melf_i386 -o project project.o