2

raw モードで文字を読み取るプログラムがあります。つまり、入力された文字はバッファリングされるのではなく、すぐに読み取られます。

バックスペースを実行する方法を知りたいです。つまり、Backspace キーを押すと、左側の文字が削除され、カーソルが 1 つ左に移動します。

バックスペース文字に続いてスペース文字を出力しようとしました。これにより、左側の文字が削除されますが、何らかの理由でカーソルが2スペース右に移動します。

また、バックスペース文字を単独で出力しようとしました。これにより、カーソルが 1 スペース左に移動しますが、文字は削除されません。

私のアセンブラは 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 を出力します。通常の Backspace のように、カーソルを 1 か所左に移動しません。

    mov     al, 0x08 ; ASCII for Backspace
    call    printchar

このコードは、Backspace の後に Space を出力します。カーソルを 1 つではなく 2 つ右に移動します。

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

Len は、バックスペース、スペース、バックスペースの順に印刷することを提案しました。これはうまくいくようです:

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

前に述べたように、私は raw モードで文字を読んでいることに注意してください。前もって感謝します!

4

1 に答える 1

5

また、バックスペース文字を単独で出力しようとしました。これにより、カーソルが 1 スペース左に移動しますが、文字は削除されません。

あなたはもうすぐそこにいます!バックスペースを出力してから、カーソルが現在上にある文字を黒く塗りつぶすために通常のスペースを出力してから、カーソルをもう一度戻すために別のバックスペースを出力してみてください。

ハックのように見えますが、実際にはよくあることです。

于 2012-05-26T12:03:48.253 に答える