需要在不同行的字符串中打印单独的标记,但无法确定是否打印出新行。
从我的教程中,它说" nwln"在示例中,但它在我的代码中不起作用。
我现在的代码只打印一行中没有空格的所有单词。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="wrapper">
<div class="outer">
<div class="middle">
<div class="inner" id="a">1</div>
<div class="inner" id="b">2</div>
<div class="inner" id="c">3</div>
</div>
</div>
</div>
好吧我想我已经通过在.data中使用另一个变量换行符和另一个寄存器来打印新行来解决它
答案 0 :(得分:0)
因为您似乎在Linux上使用 NASM 。 nwln
是一个宏,它是Assembler Tutorial的一部分,基于 Linux中汇编语言编程指南一书中的代码。该库由一个名为nwln
的宏组成,它将LineFeed(LF)字符0x0a
打印到标准输出。您可以从上面的链接下载文件io.mac
和io.o
。它们包含在 NASM / Linux 的ZIP file内。您将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