一、在屏幕上显示文本
01、显卡和显存
每个字节表示三原色中的一个(红绿蓝)
两种模式
|-文本模式
|-图像模式
两种模式的显存是分开的;
文本模式下,显存的内容是文本的编码;
图像模式下,显存的内容是像素的颜色。
“字符发生器”根据字符的编码来控制显示的像素;
比如其接收到字符“e”的编码,就根据接收到的字符编码来控制显示器上的像素,显示出字符的轮廓;
为了要显示字符,处理器就要访问显存,把字符的编码写进去;
02、准备访问文本模式下的显存
03、字符的编码和显示属性
04、文本模式下的显存操作
mov byte [0x00],0x41
,将DS寄存器中的值 B800
左移4位,加上偏移地址[0x00]
,计算出具体的物理地址,
05、MOV指令的形式和机器码
⭐️不允许内存单元之间传送数据,因为内存单元间没有电路连接
在指令中ip寄存器是不可以直接访问的
06、列表文件的创建和使用
生成列表文件,命令如下:
d:/nasm exam.asm -l exam.lst
07、在汇编程序中使用标号
08、段间直接绝对跳转指令
jmp 0x0000:0x7c00
;// 指令的机器码为: EA 00 7C 00 00
⚠️注意: 段地址在后,偏移地址在前
09、在Bochs中运行和调试写屏程序
10、在VirtualBox中运行写屏程序
11、主引导扇区执行时的内存布局
12、使用标号计算跳转的偏移地址
13、使用寄存器的绝对间接近跳转
14、使用相对偏移量的短跳转和近跳转
二、在屏幕上显示数字
1、显示数字的基本原理
2、无符号数除法指令div
3、在调试器里验证除法操作
4、异或指令xor的用法
16位寄存器可以存储的数值是065535(0x00000xFFFF),65535/10=6553
8 位寄存器可以存储的数值是0255(0x000xFF)
所以数值>2550的值作为被除数,除以除数是8位二进制数字时,结果会是错误的值
5、加法指令add的用法
;// 在屏幕上显示65535
start:
mov ax,65535
xor dx,dx ;等价于mov dx,0
mov bx,10
div bx ;AX=商(6553),DX=余数(5)
add dl,0x30 ;将数字转换为对应的数字字符
current:
times 510-(current-start) db 0
db 0x55,0xaa
add bh, al ; 寄存器bh al的值相加,结果放入bh
add cx, dx ; 寄存器cx dx的值相加,结果放入dx
add ax, 3 ; 立即数3被当成16位的数字与寄存器ax的值相加,结果放入ax中
add word [0x2002], 67 ; 内存地址0x2002开始的一个字与立即数67(当成16位的字)相加,结果放入内存地址0x2002处
add si, [0x2002] ; 寄存器si的值与内存地址0x2002的值相加,结果放入寄存器si,si是16位的,所以从0x2002开始读取一个字
6、使用标号访问内存数据
7、段超越前缀的使用
8、显示标号的汇编地址
三、阶段性重点内容总结
1、重点内容总结
⭐️ 位指令要和后面的数据匹配
长数据不能放到短数据操作指令后,那短的数据可以放长数据操作指令后么?