如何解决sys_nanosleep禁止光标在终端
我正在使用syscalls和基本的c stdlib在Linux的x86-64汇编中制作蛇游戏。我做了一个函数来设置终端在等待1秒钟(用于调试的1秒,在真实游戏中要少得多)之后每次游戏循环迭代时所调用的光标位置。如果我不睡觉,光标会成功移动,但如果我不睡觉则不会。 这是我的代码:
global main
extern putc
extern printf
extern fflush
%define MAP_WIDTH 20
%define MAP_HEIGHT 20
%define MAP_COUNT (MAP_WIDTH * MAP_HEIGHT)
%define SCREEN_WIDTH (MAP_WIDTH + 1)
%define SCREEN_HEIGHT MAP_HEIGHT
%define SCREEN_COUNT (SCREEN_WIDTH * SCREEN_HEIGHT)
%define WAIT_TIME_NS (150 * 10^6)
%define MAX_SNAKE_LENGTH MAP_COUNT
section .text
; Functions: rdi,rsi,rdx,rcx,r8,r9
; Syscalls: rax,rdi,rdx
clear_console:
mov rax,1 ; RAX: Syscall #1 : Write
mov rdi,1 ; RDI: File Handle #1 : Stdout
mov rdx,CLEAR_CMD_LEN ; RDX: Length
mov rsi,CLEAR_CMD ; RSI: char*
syscall ; Perform the syscall
ret
sleep_before_next_iteration:
mov rax,35 ; RAX: Syscall #35: sys_nanosleep
mov rdi,SLEEP_TIMESPEC ; RDI: req: pointer to struct timespec.
xor rsi,rsi ; RSI: mem: struct timespec* (NULL here)
syscall ; Perform the syscall
ret
exit_program:
mov rax,60 ; RAX: Syscall #60: Exit
xor rdi,rdi ; RDI: Error Code 0: Clean Exit
syscall ; Call Syscall
ret
go_to_location: ; Args (rdi: x,rsi: y)
; Move Cursor To Position
mov rdx,rsi ; Argument 2; %d for y
mov rsi,rdi ; Argument 1: %d for x
mov rdi,MOVE_CURSOR_CMD ; Argument 0: string to format
call printf
ret
main:
call clear_console
game_loop_iterate:
call sleep_before_next_iteration
; Print Apple
mov rdi,5 ; goto x
mov rsi,7 ; goto y
call go_to_location
mov rax,1 ; RDX: Length
mov rsi,APPLE_STR ; RSI: char*
syscall ; Perform the syscall
jmp game_loop_iterate
game_loop_end:
call exit_program
ret
section .data:
SLEEP_TIMESPEC: dq 1,0
APPLE_STR: db "apple string",0
MOVE_CURSOR_CMD: db 0x1B,"[%d;%df",0
CLEAR_CMD: db 27,"[H",27,"[2J" ; Clear Console Command
CLEAR_CMD_LEN: equ $-CLEAR_CMD ; Length Of The Clear Console Command
任何帮助将不胜感激!我不认为sys_nanosleep
是此问题的根本原因,因为它只是在睡觉,但我一直在搜索约半天。
信息:
- 内核:5.4.0-42-通用
- 操作系统:Ubuntu 20.04 LTS
建筑物:
-
nasm -felf64 -g ./snake.asm
-
clang snake.o -o snake
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。