Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 更新NASM中每秒已打印的字符串_Linux_Assembly_Nasm_System Calls - Fatal编程技术网

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
not
printf
,所以它们不需要以
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
。用一个例子更新了我的答案。