2

我有一个程序以原始模式读取字符。也就是说,任何输入的字符都会被立即读取,而不是被缓冲。

我想知道如何执行退格。也就是说,当我按下退格键时,它应该删除左边的字符并将光标向左移动一位。

我尝试输出一个退格字符,后跟一个空格字符。由于某种原因,这会删除左侧的字符,但会将光标向右移动两个空格。

我也尝试过自己输出 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

以下代码打印退格键。它不会像您的常规 Backspace 那样将光标向左移动一位。

    mov     al, 0x08 ; ASCII for Backspace
    call    printchar

此代码打印一个退格键,后跟一个空格键。它将光标向右移动两个空格而不是一个空格。

    mov     al, 0x08 ; ASCII for Backspace
    call    printchar
    mov     al, 0x20 ; ASCII for Space
    call    printchar

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

请注意,正如我之前提到的,我正在以原始模式读取字符。提前致谢!

4

1 回答 1

5

我也尝试过自己输出 Backspace 字符。这会将光标向左移动一格,但不会删除字符。

您快到了!尝试输出一个退格键,然后输出一个常规空格来黑掉光标现在所在的字符,然后再输出一个退格键再次将光标移回。

这看起来像一个黑客,但它实际上很常见!

于 2012-05-26T12:03:48.253 回答