既然你似乎是在Linux上使用NASM解決它。 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
類似的方式:
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
然後,您可以用類似編譯
要打印換行符,只需要在Linux上打印字符「0x0a」。 –
@MichaelPetch謝謝!但我仍然沒有得到如何打印字符0xa – RhumB