汇编x86,在字符串中的每个单词后面打印新行

时间:2015-10-29 04:38:49

标签: linux assembly x86 nasm 32-bit

需要在不同行的字符串中打印单独的标记,但无法确定是否打印出新行。

从我的教程中,它说" 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中使用另一个变量换行符和另一个寄存器来打印新行来解决它

1 个答案:

答案 0 :(得分:0)

因为您似乎在Linux上使用 NASM nwln是一个宏,它是Assembler Tutorial的一部分,基于 Linux中汇编语言编程指南一书中的代码。该库由一个名为nwln的宏组成,它将LineFeed(LF)字符0x0a打印到标准输出。您可以从上面的链接下载文件io.macio.o。它们包含在 NASM / Linux ZIP file内。您将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的等效宏和函数:

%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