系统的简单注解 - 9 06_color.asm文件

本文介绍了一套用于绘图的基本程序指令集,包括调色板设置、横线绘制、竖线绘制及矩形绘制等功能。这些指令适用于低级别图形操作,如在特定内存地址上直接进行像素点的修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



该文件用于设置调色板,并绘制相应的图形。

 

Set_color_palette:设置前16个调色板的值(整个系统仅用16个颜色);

draw_line:画横线;

draw_long_string:画竖线;

draw_rectangle:画矩形;

;===============================================================================
;=== 本程序提供图形化功能:                                                  ===
;=== 1.调色板初始化                                                          ===
;=== 2.各类绘画接口                                                          === 
;===============================================================================

;-------------------------------------------------------------------------------
Set_color_palette:                           ;设置前16个调色板的值 
                          
     cli                                     ;关中断
	
     pushad                                  ;保存寄存器
	
     xor eax, eax
	
     mov dx, 0x3c8 
     out dx, al                              ;起始调色板号(我从从0开始设置)
	
     mov ecx, 48                             ;一共要写入48个字节,三个对应一个调色板
     xor ebx, ebx
     mov dx, 0x3c9

_color_palette_loop:                         ;依次将每个调色板的R、B、G写入
     mov al, byte [palette_color_buf + ebx]
     shr al, 2
     out dx, al
     inc ebx
     loop _color_palette_loop 	

     popad                                   ;恢复寄存器

     ret	

;-------------------------------------------------------------------------------
draw_line:                                ;画横线
										  ;输入:EAX-低16位为起点Y值,高16位为起点X的值
										  ;输入:EBX-横线长度
										  ;输入:CL=颜色	 
     pushad
	 
     mov edx, eax
     and eax, 0x0000ffff
     push eax                             ;记录Y值,[ebp+8]
     shr edx, 16
     push edx                             ;记录X值,[ebp+4]
     push ebx                             ;记录长度,[ebp]
     mov ebp, esp
	 
     xor edx, edx	 
	 mov eax, [ebp+8]
     mov ebx, 320
     mul ebx
     mov ebx, [ebp+4]
     mov edx, [ebp]
_dr_line:
     mov [pic_mem_addr + eax + ebx], cl
     inc ebx
     dec edx
     cmp edx, 0
     ja _dr_line
	 
     add esp, 12                          ;修正堆栈指针
     
     popad
     ret

;-------------------------------------------------------------------------------
draw_long_string:                         ;画竖线
										  ;输入:EAX-低16位为起点Y值,高16位为起点X的值
										  ;输入:EBX-竖线长度
										  ;输入:CL=颜色	 
     pushad
	 
     mov edx, eax
     and eax, 0x0000ffff
     push eax                             ;记录Y值,[ebp+8]
     shr edx, 16
     push edx                             ;记录X值,[ebp+4]
     push ebx                             ;记录长度,[ebp]
     mov ebp, esp
	 
     xor edx, edx	 
	 mov eax, [ebp+8]
     mov ebx, 320
     mul ebx
     mov ebx, [ebp+4]
     mov edx, [ebp]
_dr_long_string:
     mov [pic_mem_addr + eax + ebx], cl
     add ebx, 320
     dec edx
     cmp edx, 0
     ja _dr_long_string
	 
     add esp, 12                          ;修正堆栈指针
     
     popad
     ret	 
	 
;-------------------------------------------------------------------------------
draw_rectangle:                           ;画矩形
										  ;EAX-低16位为Y值,高16位为Y的高度
										  ;EBX-低16位为X值,高16位为X的宽度
										  ;CL=颜色
     pushad

	 mov edx, eax
     and eax, 0x0000ffff
     push eax                             ;Y值[ebp+12]
     shr edx, 16
     push edx                             ;Y的高度[ebp+8]
     mov edx, ebx
     and ebx, 0x0000ffff                  
     push ebx                             ;X值[ebp+4]
     shr edx, 16
     push edx                             ;X的宽度[ebp]
	 mov ebp, esp 

	 mov eax, [ebp+4]
     shl eax, 16
     mov ebx, [ebp+12]
     or eax, ebx
	 mov ebx, [ebp]
     mov edx, [ebp+8]
_drw_rectangle:
     call draw_line
	 inc eax
	 dec edx
     cmp edx, 0
     ja _drw_rectangle
	 
	 add esp, 16
	 
     popad
     ret	 
	 
;--------------------------------全局变量---------------------------------------
align 4
	 ;调色板的颜色配置数据,共16色
     palette_color_buf    db  0x00, 0x00, 0x00,  ;黑
	                      db  0xff, 0x00, 0x00,  ;亮红
                          db  0x00, 0xff, 0x00,  ;亮绿
                          db  0xff, 0xff, 0x00,  ;亮黄
                          db  0x00, 0x00, 0xff,  ;亮蓝
                          db  0xff, 0x00, 0xff,  ;亮紫
                          db  0x00, 0xff, 0xff,  ;浅亮蓝
                          db  0xff, 0xff, 0xff,  ;白
                          db  0xc6, 0xc6, 0xc6,  ;亮灰
                          db  0x84, 0x00, 0x00,  ;暗红
                          db  0x00, 0x84, 0x00,  ;暗绿
                          db  0x84, 0x84, 0x00,  ;暗黄
                          db  0x00, 0x00, 0x84,  ;暗青
                          db  0x84, 0x00, 0x84,  ;暗紫
                          db  0x00, 0x84, 0x84,  ;浅暗蓝
                          db  0x84, 0x84, 0x84   ;暗灰	  	

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值