Linux 更新NASM中每秒已打印的字符串
我对组装这件事是完全陌生的,在谷歌上搜索了几个小时,所以没有把事情弄清楚,所以我来这里问 我想要达到的目标:Linux 更新NASM中每秒已打印的字符串,linux,assembly,nasm,system-calls,Linux,Assembly,Nasm,System Calls,我对组装这件事是完全陌生的,在谷歌上搜索了几个小时,所以没有把事情弄清楚,所以我来这里问 我想要达到的目标: [第一秒]:你好(在屏幕上停留1秒) [second]:世界(你好消失了,现在我们有了“世界”来代替它) 这是一个无限循环 换句话说,我希望我的终端的标准输出在hello和world之间闪烁(改变),而不添加任何换行符、书写字符串或任何其他东西,我只希望现有的、已经打印的文本被其他文本替换 我已经编写了无限循环,它将打印hello,然后等待一秒钟,然后打印world,然后等待一秒钟。我还
[第一秒]:你好(在屏幕上停留1秒)
[second]:世界(你好消失了,现在我们有了“世界”来代替它)
这是一个无限循环
换句话说,我希望我的终端的标准输出在hello和world之间闪烁(改变),而不添加任何换行符、书写字符串或任何其他东西,我只希望现有的、已经打印的文本被其他文本替换
我已经编写了无限循环,它将打印hello
,然后等待一秒钟,然后打印world
,然后等待一秒钟。我还将这段代码放在一个无限循环中
以下是我目前拥有的代码:
section .data
hello db "hello",10,0
world db "world",10,0
delay dq 1,0
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, hello
mov rdx, 6
syscall
mov rax, 35
mov rdi, delay
mov rsi, 0
syscall
mov rax, 1
mov rdi, 1
mov rsi, world
mov rdx, 6
syscall
mov rax, 35
mov rdi, delay
mov rsi, 0
syscall
call _start
请注意,我使用elf64 asm格式,非常感谢您提出该格式的解决方案。打印一个
\r
回车符(ASCII代码13),将光标放在行的开头,而不必像\n
换行符(ASCII 10)那样滚动终端
然后你可以覆盖你最后写的东西。如果较短,则可以在可见字符后打印空格,以“擦除”后面仍然存在的字符
e、 g.由于两个单词的长度相同,您可以这样做:
section .rodata
hello db 13, "hello" ; `\rhello`
hello_len equ $ - hello
world db 13, "world"
world_len equ $ - world
请注意,数据中不需要,0
,因为您要将这些缓冲区传递给write
notprintf
,所以它们不需要以0
结尾的隐式长度C字符串。您也不需要硬编码mov-rdx,6
,您可以使用mov-rdx,hello_len
,由汇编程序为您计算
对于睡眠部分,您可以使用
sleep
libc函数,但对于原始系统调用,您必须使用。(就像你已经在做的那样。)
对于循环,不要使用
call\u start
;使用jmp
。你不想推送回信地址;这最终会导致堆栈溢出(大约100万秒后:8MB堆栈大小限制和调用推送8字节返回地址)。使用Peter Cordes的有用指导解决了这一问题
工作代码如下所示:
section .data
hello db "hello",13,0
world db "world",13,0
delay dq 1,0
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, hello
mov rdx, 6
syscall
mov rax, 35
mov rdi, delay
mov rsi, 0
syscall
mov rax, 1
mov rdi, 1
mov rsi, world
mov rdx, 6
syscall
mov rax, 35
mov rdi, delay
mov rsi, 0
syscall
jmp _start
mov-rax、1-mov-rdi、1-mov-rsi、13-h-mov-rdx、6-syscall
使用此选项并没有将光标放在行的开头。我还尝试使用glibc printf函数,但在链接stage时出错。@Andrewf0s3Kosenko:write
在RSI中获取指针,而不是单个字符的值。此外,ASCII CR是13
(0x0d
)而不是13h
。用一个例子更新了我的答案。