【发布时间】: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。还要记住al是ax的低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