【问题标题】:How to get keyboard ASCII input and save it to a value in .data in x86_64 Assembly?如何获取键盘 ASCII 输入并将其保存到 x86_64 程序集中的 .data 中的值?
【发布时间】:2021-08-13 21:11:09
【问题描述】:

所以正如我的问题所述,如何从键盘输入中获取 ASCII 键码作为整数值,然后我想将该值保存在 .data 内的数据字中,这样我就可以将数据字放入不同的函数中.

input:
    ; get ASCII for keyboard input
    ; save ASCII into cha
    push rbp
    mov rdi, cha
    call kernel_input
    pop rbp

section .data
    cha dw 

【问题讨论】:

  • 您可以使用sys_read 从输入流中获取单个字节。
  • 你标记了这个 [osdev]。这是否意味着您正在编写内核代码,特别是键盘驱动程序? (如果是这样,对于什么硬件?遗留的可能模拟的 PS/2 键盘控制器?USB(更复杂),或者类似 UEFI 调用来为你处理它?)如果你不编写内核/裸 - metal / uefi 应用程序,那么您只想要求内核将输入读入您的内存。它将是代表数字的 ASCII 文本,您可以使用 NASM Assembly convert input to integer? 将其转换为二进制整数
  • 还要注意cha dw 不保留任何字节。也许您的意思是 section .bss / cha resw 1 保留 2 个字节?

标签: assembly x86-64 osdev


【解决方案1】:

您应该能够通过调用 x64 的 SYS_READ 系统调用来存储单个字节。这是根据您的示例修改的代码。

input:
    ; get ASCII for keyboard input
    ; save ASCII into cha
    push rbp
    mov  rdx, 1             ; max length
    mov  rsi, cha           ; buffer
    mov  rdi, 0             ; stdin
    mov  rax, 0             ; sys_read
    syscall
    pop rbp

section .data
    cha dw 0

我建议查看system calls in Linux 了解更多详情。

【讨论】:

  • cha dw 有一个空的单词初始值设定项列表,因此它保留了 0 个字节。通常,您只需将堆栈空间用于较小的固定大小,但您至少需要dw 0。此外,阅读问题的一种方式意味着他们希望 NASM Assembly convert input to integer? 将二进制整数保存到 .data 中。不清楚他们是否真的在做 [osdev];如果是这样,他们可能正在尝试编写键盘驱动程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2012-06-26
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多