我正在尝试编辑传统的“ 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
答案 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
相比,它更快,更小。