【问题标题】:How to read a character input in a bootloader? (nasm)如何读取引导加载程序中的字符输入? (纳斯姆)
【发布时间】:2018-03-19 12:17:36
【问题描述】:

我希望我的代码读取一个字符输入,然后将其存储在 ax 中。

我在函数“readInput”中尝试了什么:

mov ah,0h   ;get character from keyboard
int 16h     ;and store it in AL
mov ah,0eh  ;Display a character in AL
int 10h     ;aka, echo it
mov ax, al
int 10h

我收到一个错误,它是“mov ax, al”行中操作码和操作数的无效组合

所以我想首先将 al 存储在一个变量中。现在,通常当它不是 .bss 部分中的引导加载程序时,我会放置 num resb 1。但是引导加载程序中没有任何部分..?我应该在哪里声明这个变量,如果这是我需要做的事情?

我尝试了以下方法来使用变量:

mov ah, 0h
int 16h
mov ah, 0eh
int 10h
mov [num1], al
sub al, 48
int 0x10
mov ax, [num1]
int 0x10

最后我在'done'函数中声明了'num1 resb 1',它的第一行是ret。但是当我这样做时,我看到它会无休止地打印出来。

这是我的正方形用户输入代码,这就是我尝试使用 ax 寄存器的原因:

call readInput
outer_loop:
mov bx, ax
inner_loop:
    call dot
    dec bx
    cmp bx, 0
    jg inner_loop
call newline
dec ax
cmp ax, 0
jne outer_loop
call newline 

感谢您的帮助。

@小丑

考虑到您所说的,我觉得 al 已经存储了我想要的数字,因此无需尝试将其放入 ax 中。但是,此解决方案也不起作用:

call readInput  
outer_loop:
mov bx, ax
inner_loop:
    call dot
    dec bx
    cmp bx, 0
    jg inner_loop
call newline
dec ax
cmp ax, 0
jne outer_loop
call newline 

readInput:
mov ah, 0h
int 16h
mov ah, 0eh
int 10h
mov ah, 0
int 10h

【问题讨论】:

  • 如果您正在编写引导加载程序,您应该已经熟悉基本架构的东西,例如 ax 是 16 位和 al 是 8 位,因此您不能在它们之间移动。如果你想扩展它,你可以使用movsx,movzx 或者简单地归零ah。还要记住alax 的低8 位。
  • @Jester 你能帮我澄清一下寄存器吗?正如你所看到的,斧头是我的正方形大小。通常这将是例如'移动斧头,10'。由于我将我想要的号码存储在 AL 中,这对我来说究竟意味着什么?例如,如果我将 5 放入其中,您将如何从中制作等效于“mov ax, 5”的代码?或者更像是,如果代码是“mov ax, 5”,那么 ah 和 al 会是什么?我很难理解这一点……如果 al 是较低的寄存器而 ah 是较高的,我似乎喜欢之后我读了输入,al 会存储 5 和 ah = 0。为什么不是
  • @Jester 是这样吗?当我尝试这样做时,我仍然让它打印出无限的点。
  • 你认为dec ax 是做什么的?当然,如果你减少它,你会减少一个。
  • 要输出一个正方形,你必须输出N乘N个点,所以你需要每行N的源,行的倒数计数器(第二个N,从第一行开始每行重置) ,以及行的倒数计数器(第三个 N,每行递减)。因此,您可以为此分配三个备用寄存器,例如 bp 具有原始 N,cx 每行计数(由行开头的 bp 的值初始化)和 bx 计数行(由bp 在外循环之前只有一次)。这与引导加载程序完全无关,它是编程基础,为什么是引导加载程序?使事情复杂化...

标签: assembly x86 nasm bootloader


【解决方案1】:

答案是在方循环中使用不同的寄存器,将键盘输入变成整数。

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 2014-06-09
    • 2019-05-21
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多