2015-10-29 3 views
0

Vous devez imprimer un jeton distinct dans une chaîne sur une ligne différente, mais vous ne pouvez pas imprimer une nouvelle ligne. Dans le tutoriel que j'ai, il est dit "nwln" dans les exemples, mais cela ne marche pas dans mon code.Assemblage x86, imprimez une nouvelle ligne après chaque mot d'une chaîne

Le code que j'ai maintenant imprime seulement tous les mots dans une ligne sans espaces.

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 

    add ecx, edx 
    inc ecx 
    mov edx,0 
    jmp lab2 

ok je pense que je l'ai résolu en utilisant un autre saut de ligne variable dans .data et un autre registre pour imprimer une nouvelle ligne

+0

Pour imprimer un caractère de nouvelle ligne, vous devez seulement imprimer le caractère '0x0a' si vous êtes sous Linux. –

+0

@MichaelPetch Merci! mais je n'ai toujours pas comment imprimer le caractère 0xa – RhumB

Répondre

0

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 
+0

Merci beaucoup, je vois comment ça marche avec nwln maintenant. – RhumB

+0

Existe-t-il un autre moyen d'imprimer une nouvelle ligne sans utiliser nwln? – RhumB

+0

Pour imprimer un saut de ligne, le processus est le même que pour l'impression d'une chaîne standard. Donc pas vraiment. Vous pouvez également ajouter '0xa' à la fin de n'importe quelle chaîne. Par exemple, 'helloworld db 'hello world', 0xa, 0's'afficherait 'hello world' suivi d'un retour à la ligne. –