📄 boot.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call Display
;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;;;;;;;;;;;;;;;;;;;;;;
mov cx,0800
LOPP:
call SetPixel
push ax
mov ax,[X1]
add ax,1
mov [X1],ax
pop ax
loop LOPP
;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;
jmp $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Display:
mov ax,0x4f02
mov bx,0x115
int 10h
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SetPixel_Begin:
mov ax,0xA000
mov es,ax
mov bx,0x0000
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SetPixel:
;;;;;;;;;;;;;;;;(800*y+x)
mov bx,[X1]
sub bx,1
mov ax,[Y1]
sub ax,0001
mov dx,0800
mul dx
add ax,bx
mov bx,4
mul bx
mov [color_pos],ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call SetPixel_Begin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
add bx,[color_pos]
mov al,0x00 ;显存是每字节放RGBA四个的一个g
mov [es:bx],al
inc bx
mov al,0x00 ;显存是每字节放RGBA四个的一个b
mov [es:bx],al
inc bx
mov al,0xff ;显存是每字节放RGBA四个的一个r
mov [es:bx],al
inc bx
mov al,0x00 ;显存是每字节放RGBA四个的一个a
mov [es:bx],al
inc bx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PutPixel:
mov ax,0xA000
mov es,ax
mov bx,0x0000
;;连续写点,要在一子程序同时写
mov ax,4
mov dx,200
mul dx
mov cx,ax ;;计数器--------200/4=800个像素
LOP:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;MEM_0_green
mov al,0x00 ;显存是每字节放RGBA四个的一个
mov [es:bx],al
inc bx
;;;MEM_1_blue
mov al,0x00 ;显存是每字节放RGBA四个的一个
mov [es:bx],al
inc bx
;;;MEM_2_red
mov al,0xff ;显存是每字节放RGBA四个的一个
mov [es:bx],al
inc bx
;;;MEM_3_aphle
mov al,0x00 ;显存是每字节放RGBA四个的一个
mov [es:bx],al
inc bx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
loop LOP ;;cx=cx-1,当cx=0跳出循环
;;否则为写点一次,刷新一次
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
color_g db 0x00 ;;db-----al <---> dw-----------ax
color_b db 0x00
color_r db 0x00
color_a db 0x00
color_pos dw 0
X1 dw 0001
Y1 dw 0010
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -