assume cs:code code segment a db 1,2,3,4,5,6,7,8 b dw 0 start: mov si,offset a mov bx,offset b mov cx,8 s: mov al,cs:[si] mov ah,0 add cs:[bx],ax inc si loop s mov ax,4c00H int 21h code ends end start
;用 al 传送要显示的数据 showbyte: jmp short show table db '0123456789ABCDEF' ;建立表单
show: ;设置子程序 push bx push es mov ah,al mov bl,4 shr ah,bl ;右移4位,ah中得到高4位的值 and al,00001111b ;al为低4位 mov bl,ah mov bh,0 mov ah,table[bx] ;用高4位的值作为table的偏移,取得相应的字符 mov bx,0b800h mov es,bx mov es:[160*12+40*2],ah mov bl,al mov bh,0 mov al,table[bx] ;用低4位作为相对于table的偏移,取得相对于的字符 mov es:[160*12+40*2+2],al pop es pop bx code ends end start
4.程序入口地址的直接定址表
首先就是说:我们可以将这些字功能的入口地址存储再一个表中,它们在表中的位置和功能号相对应。
来设计功能吧
1.清屏:也就是将显存中当前屏幕中的字符串设为空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
sub1: push bx push cx push es mov bx,0b800H mov es,bx mov bx,0 mov cx,2000 subls: mov byte ptr es:[bx],' ' add bx,2 loop subls pop es pop cx pop bx ret
2.设置前景色:设置显存中当前屏幕中处于奇地址的属性字节的第0,1,2位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
sub2: push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub2s: and byte ptr es:[bx],11111000b ;先将0,1,2位设置为0 or es:[bx],al ;然后用or来设置前景色中的值为al add bx,2 loop subs2 pop es pop cx pop bx ret