汇编语言:如何垂直打印字符串?

时间:2019-05-19 10:20:43

标签: assembly x86 x86-64

我正在尝试编辑传统的“ Hello,world”程序,以使其垂直打印,例如:

H

e

l

l

o

w

o

r

l

d

我需要使用某种循环指令来执行此操作,但我不确定到底出了什么问题。

section .data
    text db "Hello, World!",10,0

section .text
    global _start

_start:
    mov rax, text
    call _print

    mov rax, 60
    mov rdi, 0
    syscall

_print:
    push rax
    mov rbx, 0

_printLoop:
    inc rax
    inc rbx
    mov cl, [rax]
    cmp cl, 0
    jne _printLoop

    mov rax, 1
    mov rdi, 1
    pop rsi
    mov rdx, rbx
    syscall

    ret

1 个答案:

答案 0 :(得分:1)

打印系统调用不会自动追加换行符,您将需要使用缓冲区来构造新字符串。我已尝试保留您的大部分结构。

section .data
  text db `Hello, World!\n\0`

section .bss
  buffer resb 32

section .text
  global _start

_start:
  mov rax, text
  mov rbx, buffer
  call _print

  mov rax, 60
  mov rdi, 0
  syscall

_print:
  push rbx
  mov rdx, 0

_printLoop:
  mov byte [rbx], `\n`
  inc rbx
  mov cl, [rax]
  mov byte [rbx], cl
  inc rbx
  inc rax
  add rdx, 2
  cmp cl, 0
  jne _printLoop

  mov rax, 1
  mov rdi, 1
  pop rsi
  syscall

  ret

在此功能中,rdx跟踪写入的字符数,rbx指向正在写入缓冲区的当前字符,rax指向从中读取的当前字符源字符串。

顺便说一句:

  • 除非更改标志会带来问题,否则它不会使用mov register, 0而是使用xor register, register,而是更快,更小一个数量级。
  • 与使用cmp register, 0而不使用test register, register相比,它更快,更小。
  • 您在x86-64中有很多寄存器,例如r8,可以使用它而不是堆栈,这要慢得多