制作程序集引导加载程序时出现问题,它将所有背景颜色写入显存

Problem while making assembly bootloader, that writes all the background colors to the video memory

我想制作一个简单的引导加载程序,它将所有背景颜色写入屏幕的下一行。
问题是,它只将第一行的颜色更改为黑色,将第二行的颜色更改为蓝色,而它应该显示所有 16 种颜色 .我认为 loop1: 有问题,但我不知道是什么。
有用信息:

我的代码(fasm 汇编):

format binary
use16
org 0x7c00
mov ax,0xb800
mov es,ax
mov bx,0
mov al,0
mov ah,0x0f
mov cx,160
loop1:
call procedure1
add ax,0x1000
add cx,160
cmp ah,0xff
jl loop1
call procedure1
mov cx,4000
mov ah,0x0f
call procedure1
jmp $
procedure1:
mov word [es:bx],ax
add bx,2
cmp bx,cx
jl procedure1
ret
times 510-($-$$) db 0
dw 0xaa55

ah 不再比 0xff 时,您将离开 loop1
比较带符号的数字时,术语 less/greater 在 x86 汇编中使用。 被视为有符号 8 位整数的数字 0xff 具有值 -1ah 作为有符号字节 (-128..+127),从 0x0f + 0x10 = 0x1f 开始。并且 31 < -1 在第一次迭代时为假,因此 loop1 在第一个 call procedure1.

之后被放弃

比较无符号数时,我们使用术语 below/above。 使用 jb loop1 而不是 jl loop1。类似地,在 procedure1: 中将 jl procedure1 替换为 jb procedure1。 (https://www.felixcloutier.com/x86/jcc)