Поскольку вы, кажется, использует NASM на Linux. nwln
- это макрос, который является частью Assembler Tutorial на основе кода из книги Руководство по программированию на языке программирования в Linux. Библиотека состоит из макроса с именем nwln
, который печатает символ LineFeed (LF) 0x0a
на стандартный вывод. Вы можете скачать файлы io.mac
и io.o
по ссылке выше. Они содержатся внутри ZIP file для NASM/Linux. Вы копируете 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
Чтобы напечатать символ новой строки, вам нужно только напечатать символ '0x0a', если вы находитесь в Linux. –
@MichaelPetch Спасибо! но я до сих пор не понимаю, как печатать char 0xa – RhumB