;程序名称:p17_3
;任务:为设置时钟而移动光标;按下“→”键光标右移,按下“←”键光标左移
assume cs:code
data segment
db '2000/00/00 00:00:00','$',16,0 ;置16和0,作为16位乘数的低8位与高8位
db 9,0,0,8,0,0,7,0,0,4,0,0,2,0,0,0,0,0,'!' ;置0使相乘后(dx)=0成立
data ends
code segment
start: mov ax,data
mov ds,ax
sub bx,bx
Tm_cycle: mov ax,[bx].22 ;从data中取出指定位置的数据信息
out 70h,al ;将该单元地址传到地址端口70h
in al,71h ;从数据端口71h取出单元的数据
or [bx].3,al ;or运算使30h及存入数据的个位均得保存
and byte ptr [bx].3,00111111b ;and运算清除残余使数据纯化为(30h + 个位)
mul word ptr ds:[20] ;乘以16,等同于ax左移4位后,在ah中得十位数
add [bx].2,ah ;传到data中相加,得其ASCII码
add bx,3 ;寻址增3个字节
cmp byte ptr [bx].22,'!' ;判断是否读到结束标识符'!'
jne Tm_cycle ;未读到,则继续读写时间
mov ah,2 ;置光标,设置2号子程序;准备输出时间
sub bh,bh ;第0页
mov dh,12 ;第12行
mov dl,30 ;第30列
int 10h ;用int 10h的2号子程序设置光标位置
sub dx,dx ;置0
mov ah,9 ;置9号子程序
int 21h ;用int 21h的9号子程序输出字符串
mov dl,49 ;完成输出后重设列号;准备移动光标
Cursor_s: mov ah,0 ;0号子程序
int 16h ;用int 16h,读取键盘输入符号
cmp ah,1ch ;判断是否读到“Enter”键的扫描码
je Cursor_Ok ;读到则转到结束,否则执行下一条代码
cmp ah,4bh ;判断是否读到“←”的扫描码
jne Cursor_R ;未读到,转Cursor_R
dec dl ;读到,则光标位置自减1,左移1
jmp short Cursor_L
Cursor_R: cmp ah,4dh ;判断是否读到“→”的扫描码
jne Cursor_L ;未读到,则转Cursor_L
inc dl ;读到,则光标位置自增1,右移1
Cursor_L: mov ah,2 ;置光标,设置2号子程序
sub bh,bh ;第0页
mov dh,12 ;第12行
int 10h ;用int 10h的2号子程序设置光标位置
jmp short Cursor_s ;转到Cursor_s,继续光标移动过程
Cursor_Ok: mov ax,4c00h
int 21h
code ends
end start
- [游客] 为啥简版的int 13h之后不用 jmp 也行。 08/31 00:14
- [hky987654321] 是的,按压F1的次数 >=15 ,有“按下“→”键会出现光斑落在年份的百位数上”的现象。 这与缓冲 08/09 11:12
- [游客] 为什么多次按F1后,按下“→”键会出现光斑落在年份的百位数上? 08/02 21:42
- [游客] 懂了。 07/30 10:54
- [hky987654321] -1就是FFh。用-1兼济了ffff:0和简洁的数据分隔这二者的需要。 [bp-2],是因为刚进入 07/29 11:43
- [游客] 也看不懂[bp-2] 07/12 10:49
- [游客] 不懂-1 07/09 17:55
- [游客] 16位现在只有教学意义,看一眼就好。 04/13 00:46
- [游客] 没搞错吧,课程2才351b 03/09 18:01
- [游客] 没想到实验14只用13条代码! 03/02 15:46