Inv*_*ion 2 assembly x86-64 nasm yasm
我有一个程序以原始模式读取字符。即,输入的任何字符都将立即读取而不是被缓冲。
我想知道如何执行退格键。也就是说,当我按下Backspace键时,它应该删除左侧的字符并将光标向左移动一个位置。
我试过输出一个Backspace字符,再跟一个Space字符。这会删除左侧的字符,但是由于某种原因会将光标向右移动两个空格。
我也尝试过自行输出Backspace字符。这会将光标向左移动一个空格,但不会删除该字符。
我的汇编程序是YASM,我正在使用64位Linux。以下是一些相关代码。
首先,这是我用来输出字符的函数:
printchar:
mov [buf], al ; Backup whatever was in al.
; buf is declared as resb 1 in section .bss
mov edx, 1
mov ecx, buf
mov ebx, 1
mov eax, 4
int 0x80
mov al, [buf] ; restore char that was previously in al
ret
Run Code Online (Sandbox Code Playgroud)
以下代码显示退格键。它不会像常规的Backspace一样将光标向左移动一个位置。
mov al, 0x08 ; ASCII for Backspace
call printchar
Run Code Online (Sandbox Code Playgroud)
此代码打印一个Backspace,后面跟一个空格。它将光标向右移动两个空格,而不是一个空格。
mov al, 0x08 ; ASCII for Backspace
call printchar
mov al, 0x20 ; ASCII for Space
call printchar
Run Code Online (Sandbox Code Playgroud)
Len建议先打印一个Backspace,然后打印一个Space,再打印一个Backspace。这似乎可行:
mov al, 0x08 ; ASCII for Backspace
call printchar
mov al, 0x20 ; ASCII for Space
call printchar
mov al, 0x08 ; ASCII for Backspace
call printchar
Run Code Online (Sandbox Code Playgroud)
请注意,正如我之前提到的,我正在以原始模式读取字符。提前致谢!
我也尝试过自行输出Backspace字符。这会将光标向左移动一个空格,但不会删除该字符。
你快到了!尝试输出一个退格键,然后输出一个常规空格以涂黑光标现在位于其上方的字符,然后再输出一个退格键以再次将光标移回。
看起来很hack,但实际上很常见!