端口读写
在pc系统中,CPU可定位的端口数量为64k个,地址范围为0~65535。对端口的读写只能采用 in 和 out ,分别表示从端口读取数据和往端口写入数据。
在 in 和 out 指令中,只能采用 al 和 ax 来存放从端口中读到的数据或发送到端口中的数据。在0~255以内的端口进行读写时,端口号直接给出;在256-65535以内的端口,端口号放在 dx 中。
例:
in al,60h 从端口60h中读入一个字节
out 60h,al 往端口60h中写入一个字节
mov dx,3fdh 用dx中的值表示端口号
in al,dx 从端口3fdh中读入一个字节
out dx,al 往端口3fdh中写入一个字节
检测点14.1
(1)读取CMOS RAM中2号单元的内容
mov al,2
out 70h,al 将2输入到CMOS的地址端口中,表示接下来在2号单元中读写数据
in al,71h 从CMOS数据端口的2号单元中读取数据内容
(2)向CMOS RAM的2号单元中写入0
mov al,2
out 70h,al
mov al,0
out 71h,al
71h 端口用来读写数据;70h端口用来存放要访问的单元地址。
shl和shr指令
shl 和 shr 指令是逻辑移位指令,它们的功能是:
(1)将一个寄存器或内存单元中的数据向左/右移位
(2)将最后移除的一位写入CF中
(3)最低/高位补0
如:mov al,01001000b shl al,1 执行后的结果为(al)=10010000b,CF=0;
mov al,01001000b shr al,1 执行后的结果为(al)=00100100b,CF=0;
如果移动位数大于1,必须将移动位数放在cl中。
如:mov al,01110001b mov cl,3 shl al,cl 执行后的结果为:(al)=10001000b,CF=1。
检测点14.2
编程:用加法和移位指令计算(ax)=(ax)*
10。【(ax)*
10=(ax)*
2+(ax)*
8】
注意:左移一位相当于乘二,右移一位相当于除二。
body:shl ax,1
mov bx,ax
shl ax,1
shl ax,1
add ax,bx
bodyend: nop
实验14
编程,以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
assume cs:code
data segment
db '00/00/00 00:00:00' 保存输出格式(共17个字节)
db 9,8,7,4,2,0 CMOS中的对应内存地址
data ends
code segment
mov ax,data
mov ds,ax
mov cx,6
mov bx,17 保存标号d的偏移地址到bx中
mov si,0
s: mov al,[bx]
out 70h,al
in al,71h 得到对应内存地址处的内容
mov dl,al
push cx
mov cl,4
shr dl,cl dl中存储高位BCD码
pop cx
add dl,30h 由BCD码转换为ASC码形式(+30h)
and al,00001111b al中存储低位BCD码
add al,30h
mov [si],dl
mov [si+1],al
add si,3
inc bx
loop s
mov si,0
得到ds:si为源地址
mov ax,0b800h
mov es,ax
mov di,160*12+(40-17)*2 设置es:di为目的地址用来显示字符串
cld
mov cx,17 17为需要传送的字节数
rep movsb
mov ax,4c00h
int 21h
code ends
end start