本文共 3106 字,大约阅读时间需要 10 分钟。
输入输出指令用来完成I/O端口与累加器之间的数据传送,指令中给出I/O端口的地址值。当执行输入指令时,把指定端口中的数据读入累加器中;当执行输出指令时,则把累加器中的数据写入指定的端口中。
指令格式:
IN AL, 端口地址或IN AX, 端口地址
端口地址存放在DX寄存器中
IN AL, DX 或IN AX, DX
指令格式:
OUT AL, 端口地址或OUT AX, 端口地址
端口地址存放在DX寄存器中
OUT AL, DX 或OUT AX, DX
如下所示,读取系统的月份并显示。
assume cs:code, ds:data, ss:stackdata segment db 128 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segment start: mov ax, stack mov ss, ax mov sp, 128 call init_reg call show_month mov ax, 4C00H int 21H;====================================================init_reg: mov bx, 0B800H mov es, bx ret;==========================================================show_month: mov al, 8 ; 月的内存地址 out 70H, al ; 1 2 1 + 30H '0' in al, 71H ; 0001 0010 ah 0000 0001B mov ah, al shr ah, 1 shr ah, 1 shr ah, 1 shr ah, 1 and al , 00001111B add ah, 30H add al, 30H mov di, 160 * 10 + 40 * 2 mov es:[di], ah mov es:[di + 2], al ret code endsend start时间信息的
秒 | 分 | 小时 | 日 | 月 | 年 |
---|---|---|---|---|---|
0 | 2 | 4 | 7 | 8 | 9 |
BCD 码
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 |
以下是在DOSBOX中显示系统当前时间并实时刷新的程序代码
; 以年/月/日 时: 分: 秒的 形式显示当前的日期和时间assume cs:code, ds:data, ss:stackdata segment db 128 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segment TIME_STYLE db 'YY/MM/DD HH:MM:SS', 0 ; y = year m = month d = day ; h = hour m = minute s = secondTIME_CMOS db 9, 8, 7, 4, 2, 0 start: mov ax, stack mov ss, ax mov sp, 128 call init_reg call show_clock mov ax, 4C00H int 21H;====================================================show_clock: call show_time_styleshowTime: mov si, OFFSET TIME_CMOS mov di, 160 * 10 + 30 * 2 mov cx, 6 showDate: mov al, ds:[si] out 70H, al in al, 71H mov ah, al ; 0011 0000 shr ah, 1 shr ah, 1 shr ah, 1 shr ah, 1 and al, 00001111B add ah, 30H add al, 30H mov es:[di], ah mov es:[di + 2], al inc si add di, 6 loop showDate jmp showTime ; 键盘中断 ret ;=====================================================init_reg: mov bx, 0B800H mov es, bx mov bx, cs mov ds, bx ret;==========================================================show_string: push dx push ds push es push si push di showString: mov dl, ds:[si] cmp dl, 0 je showStringRet mov es:[di], dl add di, 2 inc si jmp showString showStringRet: pop di pop si pop es pop ds pop dx ret;==========================================show_time_style: mov si, OFFSET TIME_STYLE mov di, 160 * 10 + 30 * 2 call show_string ret code endsend start
转载地址:http://hbqzi.baihongyu.com/