2015-10-29 5 views
0

Нужно распечатать отдельный токен в строке в другой строке, но не может понять, распечатать новую строку.Сборка x86, печать новой строки после каждого слова в строке

Из учебника, который у меня есть, в примерах указано «nwln», но он не работает в моем коде.

Код, который я сейчас печатаю только в одной строке, не содержит пробелов.

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 

хорошо, я думаю, что я решил его с помощью другой переменной новой строки в .data и другой регистр для печати новой линии

+0

Чтобы напечатать символ новой строки, вам нужно только напечатать символ '0x0a', если вы находитесь в Linux. –

+0

@MichaelPetch Спасибо! но я до сих пор не понимаю, как печатать char 0xa – RhumB

ответ

0

Поскольку вы, кажется, использует 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 
+0

Большое вам спасибо, я вижу, как это работает с nwln сейчас. – RhumB

+0

Есть ли другой способ печати новой строки без использования nwln? – RhumB

+0

Чтобы напечатать новую строку, это тот же процесс, что и печать строки до стандартного. Так что не совсем. Вы можете добавить '0xa' в конец любой строки. Например, 'helloworld db 'hello world', 0xa, 0'if отображал бы печать' hello world', а затем новая строка. –

Смежные вопросы