端口操作笔记与实验14,求优化。。

1.注意8086的内存与内存地址空间的区别:
内存:主存
内存地址空间:各种存储器和cpu的地址、数据及控制线相连,cpu操控时把它们当做内存对待,总的看成一个逻辑存储器。
2.端口实际上是各个芯片中的寄存器,cpu对它们统一编址。
3.cpu可以直接读写地方:
(1)cpu内部寄存器
(2)内存单元
(3)端口
4.cpu最多定位64KB个端口,端口地址范围:0——65535
5.端口读写必须用in、out指令
6.在in和out指令中,只能用ax或al来存放从端口读入的数据或要发送到端口中的数据
7.8位端口用al,16位端口用ax
8.对0——255以内端口读写:端口号用立即数
对256——65535的端口读写:端口号放dx中
9.cmos ram芯片
简称cmos
(1)包含一个实时钟,和128个存储单元的ram存储器
(2)电池供电,
(3)128个字节中,0——0dh:实时钟的时间信息。其余:系统配置信息
(4)两个端口:70h是地址端口,存放要访问的coms ram单元的地址。71h是数据端口,存放要读取或写入的数据。
(5)coms ram中的时间信息:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD码存放
每个信息用1个字节(两个BCD码,即两位十进制数),高四位表示十位,低四位表示个位。
10.通过上述知识点的总结,本人突然理清了以前一直比较模糊的问题。
关于cmos和bios:
(1)cmos里是ram,bios里是rom
(2)cmos只存数据,bios存程序
(3)开机进入bios,看到的是bios rom中的软件程序(此时已装入内存)。里面的参数就是cmos ram中的数据,通过bios中的程序设置cmos中的信息。

11.shl和shr:

逻辑左移和逻辑右移

shl ax,1     相当于x2

shr ax,1    相当于/2

当移动位数大于1时,位数应装入cl寄存器,左移时低位补0,右移时高位补0

cf会保存最后移出的那一位。

12.下面写出实验14的代码:

题目:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间

我用了比较笨的办法,将时间格式化到一个字符串,再调用9号dos功能显示,所以代码较长。。。

assume cs:code,ds:data
data segment
db    12 dup (0)
db    17 dup (0),’$’
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov dl,0
mov cx,3

s1:    push cx            ;读取秒、分、时
mov al,dl
out 70h,al
in al,71h
mov cl,4
mov ah,0
shl ax,cl
shr al,cl
add ah,’0′
add al,’0′
mov [bx],al
mov [bx+1],ah
add bx,2
add dl,2
pop cx
loop s1

mov cx,3
mov dl,7

s2:    push cx                ;读取日、月、年
mov al,dl
out 70h,al
in al,71h
mov cl,4
mov ah,0
shl ax,cl
shr al,cl
add ah,’0′
add al,’0′
mov [bx],al
mov [bx+1],ah
add bx,2
inc dl
pop cx
loop s2

mov si,11    ;开始拷贝到第二个db定义数据
mov di,12

mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’/’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’/’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’ ‘
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’:’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’:’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al

mov ah,2        ;置光标
mov bh,0
mov dh,5
mov dl,12
int 10h

mov dx,12        ;输出字符串
mov ah,9
int 21h

mov ax,4c00h
int 21h
code ends
end start