第14章 端口
在我们的计算机中有各种存储器,这些存储器对于CPU来说可以当作一个逻辑上的大的存储器,我们统称其为内存地址空间
CPU可以对三个地方数据进行读取:
1.CPU内部寄存器
2.内存单元
3.端口
端口内也有寄存器,直接受CPU的控制可以读写数据,且计算机的端口都会在寄存器中统一编址,也就是说我们可以用地址编号表示端口
14.1 端口的读写
对端口进行读写我们用的是in和out,如in al,70h表示从70h端口读入一个字节到al处,out 70h,al表示将al里的内容赋给端口70h里
上面的是8位端口即0~255,如果是16位端口256-65525的端口的话,我们用dx来放端口号,如:
mov dx,3f8h
out dx,al ;将al中的值读入dx端口中
注意!我们只能用al或者ax来进行端口和CPU之间数据的读写,当我们通过地址总线访问端口时,访问8位端口用al,16位端口则用ax
14.2 CMOS RAM 芯片
CMOS RAM 芯片是计算机里面芯片的一种,内部有实时钟,且有两个端口,分别是地址端口70h和数据端口71h
如果需要读入数据,通常先地址总线到70h告诉要读入的内存单元,再将数据传输到71h端口,然后数据会被放入对应的内存单元存放
检测点14.1
(1):
assume cs:code
code segment
start:
mov al,2
out 70h,al
in al,71h
mov ax,4c00h
int 21h
code ends
end start
(2):
assume cs:code
code segment
start:
mov al,2
out 70h,al
mov al,0
out 71h,al
mov ax,4c00h
int 21h
code ends
end start
14.3 shl和shr指令
两个很容易理解的指令:
shl 整体向左偏移 相当于×2 最后移出的一位赋给CF
shr 整体向右偏移 相当于÷2 最后移出的一位赋给CF
格式:shl(shr) al,1
将al中的数据(二进制)向左(右)移动一位
如果移动位数不止一位,需要用cl代替移动位数,如:
mov al,00000001B
mov cl,3
shl al,3
表示al向左移动3位,最后一次移出的值赋给CF
检测点14.2
assume cs:code
code segment
start:
mov ax,1
mov bx,ax
mov cl,3
shl bx,cl
add ax,ax
add ax,bx
mov ax,4c00h
int 21h
code ends
end start
14.4 CMOS RAM中存储的时间信息
在CMOS RAM中有一个实时钟,我们可以从此获取时间,存放单元为:
秒: 0 ------ 分:2 ----- 时:4------ 日:7 ------- 月:8------ 年:9
数据以BCD码的形式存放,我们可以用本章的知识对该芯片的端口进行访问获取时间再表示出来
实验14
我的思路是先将芯片取得的时间放到data段中,然后一起复制到显存中显示
assume cs:code,ds:data,ss:stack
data segment
db '00/00/00 00:00:00',9,8,7,4,2,0
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,0B800H
mov es,ax
mov ax,stack
mov ss,ax
mov si,0
mov di,17 ;芯片中存放时间的内存单元从data段中17开始
mov cx,6 ;从芯片取6次时间
s:push cx
mov al,ds:[di]
out 70h,al
in al,71h ;在这里从芯片端口取数据
mov ah,al
mov cl,4
shr ah,cl
and al,00001111B
add ah,30h
add al,30h ;想要在显存中显示需要进行+30h,ASCII码中数字和字符的差值
mov ds:[si],ah ;放到data段中,重复6次
mov ds:[si+1],al
add si,3
inc di
pop cx
loop s
mov cx,17 ;开始将data段的内容放到显存中,我们是一个一个字节复制的所以需要17次
mov si,0
mov di,160*12+30*2 ;显存地址
s1:mov al,ds:[si] ;放到显存中,我们需要用al做中间值,不然DOS会报错
mov es:[di],al
add di,2
inc si
loop s1
mov ax,4c00h
int 21h
code ends
end start