【问题标题】:Assembly x86, print new line after each word in a string汇编 x86,在字符串中的每个单词后打印新行
【发布时间】:2015-10-29 04:38:49
【问题描述】:

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

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

【问题讨论】:

  • 要打印换行符,如果您在 Linux 上,您应该只需要打印字符 0x0a
  • @MichaelPetch 谢谢!但我仍然不知道如何打印 char 0xa

标签: linux assembly x86 nasm system-calls


【解决方案1】:

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

【讨论】:

  • 非常感谢,我现在知道它如何与 nwln 一起工作了。
  • 有没有其他不使用 nwln 打印新行的方法?
  • 打印换行符与将字符串打印到标准输出的过程几乎相同。所以不是真的。您也可以将0xa 添加到任何字符串的末尾。例如helloworld db 'hello world', 0xa, 0如果显示将打印hello world,然后是换行符。
猜你喜欢
  • 1970-01-01
  • 2015-07-30
  • 2019-06-28
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多