窗口指定位置显示字符串
(在窗口指定位置,用指定格式,字符串以0结束)
1.窗口显示:B8000h~BFFFFh,共25行,每行80个字即160个字节
2.字的属性:8位–>闪烁 R G B(背景) 高亮 R G B(前景)
3.B800::0000 第一行
00~01第1列 02~03第二列
B800:00A0 第二行
在窗口的8行3列,用绿色,显示data段中的字符串
assume cs:code
data segment
db 'hello',0
data ends
code segment
start:mov dh,8 //8行
mov dl,3 //3列
mov cl,2 //绿色
mov ax,data
mov ds,ax
mov si,0 //用于取数据段中的字母
mov di,0 //用于窗口显示数据
call show_str
mov ax,4c00h
int 21h
show_str:push ax //保存主程序的寄存器
push cx
push dx
push es
push si
push di
mov ax,0b800h //es保存段地址
mov es,ax
dec dh //计算行:(行数-1)* 160
mov al,160
mul dh
mov bx,ax
dec dl //计算列:(列数-1)* 2
add dl,dl
add bl,dl //bx保存偏移地址,注意用bl进行转化
mov al,cl //ax保存字的属性
s:mov cl,ds:[si] //取ASCII码,记得转化
mov ch,0
jcxz ok
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short s
ok:pop di //恢复主程序的寄存器
pop si
pop es
pop dx
pop cx
pop ax
ret
code ends
end start
在窗口中间显示年/月/日 时:分:秒
在CMOS RAM中,存放当前时间:秒0(存放单元) 分2 时4 日7 月8 年9,每个信息1个字节,用BCD码表示,高四位表示十位,低四位表示个位
CMOS中有两个端口:70为地址端口,写入要访问的单元;71为数据端口,读写数据
assume cs:code
data segment
db '00/00/00 00:00:00'
db 9,8,7,4,2,0
data ends
code segment
start:mov ax,data
mov ds,ax
mov di,0 //di用来写入数据
mov si,17 //si用来读取数据
//读取年月日等信息,写入数据段
mov cx,6
s:mov al,ds:[si] //读取数据
out 70h,al
in al,71h
mov ah,al
mov cl,4(注意:右移几位只能用cl传)
shr ah,cl //取得十位
and al,00001111b //取得个位
add ah,30h //BCD码+30h=十进制数
add al,30h
mov ds:[di],ah
mov ds:[di+1],al
inc si
add di,3
loop s
//把数据段中的年月日,显示在屏幕上
mov cx,17
mov ax,data
mov ds,ax
mov di,0
mov si,0
mov bx,0b800h
mov es,bx
s0:mov al,ds:[di]
mov byte ptr es:[160*12+40*2+si],al
inc di
add si,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
计算除法(商>8位时不会溢出)
X:被除数(32位),高16位是H(用dx保存),低16位是L(用ax保存)
N:除数(16位)(用cx保存)
结果:dx存高16位,ax存低16位,cx存余数
公式:X/N = int(H/N)*65536 + [rem(H/N)*65536+L]/N(int是取商,rem是取余)
计算1000000/10(F4240H/0AH)
code segment
mov ax,4240h //被除数低位
mov dx,000fh //被除数高位
mov cx,0ah //除数
call divdw
mov ax,4c00h
int 21h
divdw:push ax //保存低位
mov ax,dx //被除数高16位除以除数,商是最后结果的高16位
mov dx,0
div cx (此时rem在dx,int在ax)
pop bx //取出被除数的低16位,放在高位寄存器,就相当于*65536即左移16位
push ax //保存最后结果的高16位
mov ax,bx (相当于+L)
div cx //得到最后结果的低16位,存入ax
mov cx,dx //把余数给cx
pop dx
ret
code ends
end
菜单
setscreen: jmp short set
table dw sub1,sub2,sub3,sub4 //table为数据标号,标记了地址和单元长度
set:push bx
cmp ah,3 //判断功能号是否大于3
ja sret
mov bl ah
mov bh,0
add bx,bx //ah中功能号*2=子程序在table中的偏移
call word ptr table[bx] //调用对应的子程序
sret:pop bx
ret
...
sub1:...
...
sub2:...
...
sub3:...
...
sub4:...
...