Puisque vous semblez utiliser MSNA sur Linux. nwln
est une macro qui fait partie d'un Assembler Tutorial basé sur le code du livre Guide de programmation de langue d'assemblage dans Linux. La bibliothèque est constituée d'une macro appelée nwln
qui imprime le caractère LineFeed (LF) 0x0a
sur la sortie standard. Vous pouvez télécharger les fichiers io.mac
et io.o
à partir du lien ci-dessus. Ils sont contenus dans le ZIP file pour NASM/Linux. Vous copiez io.mac
et io.o
dans le répertoire de votre projet. Vous devez inclure le fichier macro en haut de votre programme. Votre code ressemblerait à quelque chose comme:
%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
Pour compiler et lier dans un environnement 32 bits vous utiliseriez quelque chose comme:
nasm -f elf32 project.asm
ld -emain -melf_i386 -o project project.o io.o
Vous devez ajouter io.o
comme un objet éditeur de liens pour résoudre le les fonctions nécessaires aux macros.
Si vous ne souhaitez pas compter sur io.o
le code ci-dessous contient la macro et la fonction équivalente qui mettra en œuvre nwln
d'une manière similaire:
%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
Vous pouvez ensuite compiler avec quelque chose comme:
nasm -f elf32 project.asm
ld -emain -melf_i386 -o project project.o
Pour imprimer un caractère de nouvelle ligne, vous devez seulement imprimer le caractère '0x0a' si vous êtes sous Linux. –
@MichaelPetch Merci! mais je n'ai toujours pas comment imprimer le caractère 0xa – RhumB