2015-10-29 31 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 

好,我覺得我已經通過使用。數據另一個變量換行符和另一個寄存器來打印一個新行

+0

要打印換行符,只需要在Linux上打印字符「0x0a」。 –

+0

@MichaelPetch謝謝!但我仍然沒有得到如何打印字符0xa – RhumB

回答

0

既然你似乎是在Linux上使用NASM解決它。 nwln是基於指南中的代碼的Assembler Tutorial中的一個宏。該指南用於Linux中的彙編語言編程指南。該庫由名爲nwln的宏組成,可將LineFeed(LF)字符0x0a打印到標準輸出。您可以從上面的鏈接下載文件io.macio.o。它們包含在ZIP fileNASM/Linux。您將io.macio.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類似的方式:

nasm -f elf32 project.asm 
ld -emain -melf_i386 -o project project.o 

%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 

然後,您可以用類似編譯

+0

非常感謝,我看到它如何與nwln現在。 – RhumB

+0

有沒有其他方法可以在不使用nwln的情況下打印新的一行? – RhumB

+0

要打印換行符與打印字符串到標準輸出過程非常相似。所以不是真的。你也可以在任何字符串的末尾添加0xa。例如'helloworld db'hello world',如果顯示0xa,0,將會打印'hello world',接着是一個換行符。 –

相關問題