在YASM或NASM程序集中执行退格

时间:2012-05-26 11:51:55

标签: assembly x86-64 nasm yasm

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

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

我尝试输出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

以下代码打印退格。它不会将光标向左移动一个位置,就像常规的Backspace一样。

    mov     al, 0x08 ; ASCII for Backspace
    call    printchar

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

    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

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

1 个答案:

答案 0 :(得分:5)

  

我也试过单独输出Backspace字符。这会将光标向左移动一个空格,但不会删除该字符。

你快到了!尝试输出一个退格键,然后输出一个常规空格,将光标现在放在上面的字符变黑,然后再用另一个退格键再次将光标移回。

这似乎是一个黑客,但实际上很常见!