【问题标题】:Performing a Backspace in YASM or NASM assembly在 YASM 或 NASM 程序集中执行退格键
【发布时间】:2012-05-26 11:51:55
【问题描述】:

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

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

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

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

我的汇编程序是 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

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

【问题讨论】:

    标签: assembly x86-64 nasm yasm


    【解决方案1】:

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

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

    这似乎是一种 hack,但实际上很常见!

    【讨论】:

    • 好吧,我怎么会傻到没想到这一点! :) 非常感谢。顺便说一句,为什么输出一个 Backspace 后跟一个 Space 会导致光标向前移动两个空格而不是一个?这是否意味着“真正的”ASCII Backspace 不会移动光标?
    • @Terribad:这很奇怪!在给出答案时,我以某种方式掩盖了那段,但我唯一的想法是,也许其他一些输出以某种方式混淆了这个过程。如果我建议的解决方案不起作用,如果您可以提供一些显示问题的代码,我很乐意尝试修改它直到它起作用。 :)
    • 但它确实有效!我会用一些代码更新我原来的帖子。
    • 哦,太好了!我会尝试不使用第二个空格,看看我是否能弄清楚为什么它会移动两个空格,我现在很感兴趣。
    • @Terribad:好的,当输出退格和空格(而不是另一个退格)—here's what it looks like on my terminal 时,我已经尝试使用您的代码。它有一个额外的空间,但对我来说,我实际上被误导了一秒钟并认为有两个空格,因为光标位于它自己的空白空间确实给人的印象是它也是“空的”(即使光标总是在空白处)。我不确定你是否会遇到同样的问题!
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 2021-11-15
    • 2016-03-28
    相关资源
    最近更新 更多