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

标签 assembly x86-64 nasm yasm

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

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

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

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

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

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

    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 建议打印一个退格键,然后是一个空格,然后是一个退格键。这似乎有效:

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

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

最佳答案

I have also tried outputting the Backspace character by itself. This moves the cursor one space to the left, but doesn't delete the character.

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

这看起来像是一种黑客攻击,但实际上很常见!

关于assembly - 在 YASM 或 NASM 程序集中执行退格键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10765959/

相关文章:

performance - 地址操作数如何影响机器代码的性能和大小?

c - 理解 C 反汇编调用

performance - 指令级分析 : The Meaning of the Instruction Pointer?

Windows 强制执行 READ-ONLY .text 部分,即使被 ld 链接器禁用

assembly - NASM:声明字符串时为 "comma, colon, decorator or end of line expected after operand"

assembly - 使用MMX指令集从二进制文件加载大小为2个字节的128个数字,用饱和度计算f(x)= 2 *(x ^ 2)+5

assembly - 如何清理格式错误的 x86_64 程序集?

linux - 在i386和x86-64上UNIX和Linux系统调用的调用约定是什么

c - 缓冲区溢出内存映射解释

c - lldb 查找应用程序的退出点