汇编实例解析--实模式下屏幕显示

         ; 开机上电,先执行BIOS,再执行硬盘主引导程序,也即这里。
         ; 此时属于实模式,16位模式,此时主引导程序所在的物理内存位置是0x7c00
         
         ; 物理内存区域:0xb8000~0xbFFFF是显存区域。
         ; 显存模式80*25。每个字符占据2个字节,一个是字符ascii码,一个是显示格式。
         mov ax,0xb800                
         mov es,ax                    
         
         ; es可用于数据物理内存寻址辅助段寄存器,默认是ds
         mov byte [es:0x00],'L'        
         mov byte [es:0x01],0x07       
         mov byte [es:0x02],'a'
         mov byte [es:0x03],0x07
         mov byte [es:0x04],'b'
         mov byte [es:0x05],0x07
         mov byte [es:0x06],'e'
         mov byte [es:0x07],0x07
         mov byte [es:0x08],'l'
         mov byte [es:0x09],0x07
         mov byte [es:0x0a],' '
         mov byte [es:0x0b],0x07
         mov byte [es:0x0c],"o"
         mov byte [es:0x0d],0x07
         mov byte [es:0x0e],'f'
         mov byte [es:0x0f],0x07
         mov byte [es:0x10],'f'
         mov byte [es:0x11],0x07
         mov byte [es:0x12],'s'
         mov byte [es:0x13],0x07
         mov byte [es:0x14],'e'
         mov byte [es:0x15],0x07
         mov byte [es:0x16],'t'
         mov byte [es:0x17],0x07
         mov byte [es:0x18],':'
         mov byte [es:0x19],0x07   

         ; 进入主引导程序时候,cs内容是0x0000
         mov cx,cs                      
         mov ds,cx

         mov ax,number                 
         mov bx,10
         mov dx,0
         ; dx:ax / bx,商放ax,余数放dx
         div bx                         
         mov [0x7c00+number+0x00],dl ; 存储余数,这是个位
         xor dx,dx ; dx会被设置为0                       
         div bx  
         mov [0x7c00+number+0x01],dl ; 存储余数,这是十位   
         xor dx,dx
         div bx
         mov [0x7c00+number+0x02],dl ; 存储余数,这是百位
         xor dx,dx
         div bx
         mov [0x7c00+number+0x03],dl ; 存储余数,这是千位
         xor dx,dx
         div bx
         mov [0x7c00+number+0x04],dl ; 存储余数,这是万位
         mov al,[0x7c00+number+0x04]  
         add al,0x30 ; 这是将万位的十进制数值转化为ascii代码
         mov [es:0x1a],al ; 继续向显存写入万位ascii
         mov byte [es:0x1b],0x04         
         mov al,[0x7c00+number+0x03] 
         add al,0x30
         mov [es:0x1c],al
         mov byte [es:0x1d],0x04
         mov al,[0x7c00+number+0x02]
         add al,0x30
         mov [es:0x1e],al
         mov byte [es:0x1f],0x04
         mov al,[0x7c00+number+0x01]
         add al,0x30
         mov [es:0x20],al
         mov byte [es:0x21],0x04
         mov al,[0x7c00+number+0x00]
         add al,0x30
         mov [es:0x22],al
         mov byte [es:0x23],0x04
         mov byte [es:0x24],'D'  
         mov byte [es:0x25],0x07
         
         ; 控制显存显示一段内容,接着显示number,接着显示D。
   infi: jmp near infi                
   ; 汇编语言支持标号,标号是一个数值。反映了指示位置的偏移量。
   ; 这里number反映了db所声明的5个1字节数据起始位置距离本程序起始位置的距离
   number db 0,0,0,0,0    
   ; 汇编支持times前缀,用于表示其后指令执行多少次。
   ; 声明203个1字节数据,占据连续的203存储空间。           
   times 203 db 0                     
   ; 主引导程序512字节,最后两个字节需要为0x55 0xaa
   db 0x55,0xaa             

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/125581787