第14章 端口

第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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值