zoukankan      html  css  js  c++  java
  • 第14章 端口

    cpui可以直接读写3个地方的数据

    1)cpu内部的寄存器

    2)内存单元

    3)端口

    这一章,我们讨论端口的读写

    对端口的读写不能用mov、push、pop等内存读写指令。

    端口的学些指令只有两条:

    in和out

    分别用于从端口读取数据和往端口写入数据。

    访问端口:

    in  al,60h;从60h号端口读入一个字节。

    执行时与总线相关的操作:

    1)cpu通过地址线将地址信息60h发出。

    2)cpu通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读取数据。

    3)端口所在的芯片将60h端口中的数据通过数据线送入cpu。

    注意:在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时用al,访问16位端口时用ax

     14.2  CMOS  RAM芯片

    pc机中有一个CMOS  RAM芯片,其有如下特征:

    1)包含一个实时钟和一个有128个存储单元额RAM存储器。

    2)该芯片靠电池供电。

    所以,关机后其内部的实时钟仍可正常工作,RAM中的信息不丢失。

    3)128个字节的RAM中,内部实时钟占用0~0dh单元来保存时间信息,其余大部分单元用于保存系统配置信息,供系统启动时BIOS程序读取。

    BIOS也提供了相关的程序,使我们可以在开机的时候配置CMOS RAM中的系统信息。

    4)该芯片内部有两个端口,端口地址为70h和71h

    cpu通过这两个端口读写CMOS  RAM

    5)70h为地址端口,存放要访问的CMOS  RAM单元的地址,71h为数据端口,存放从选定的CMOS  RAM单元中读取的数据,或要写入到其中的数据。

    可见,cpu对CMOS   RAM的读写分两步进行。

    比如:读CMOS  RAM的2号单元:

    1、将2送入端口70h

    2、从71h读出2号单元的内容。

    14.3 shl和shr指令

    shl和shr是逻辑移位指令

    shl逻辑左移指令,功能为:

    1)将一个寄存器或内存单元中的数据向左移位。

    2)将最后移出的一位写入CF中。

    3)最低位用0补充。

     如果移动位数大于1时,必须将移动位数放在cl中。

    比如:

     将x逻辑左移一位,相当于执行x=x*2

    shr逻辑右移指令,它和shl所进行的操作刚好相反

    1)将一个寄存器或内存单元中的数据向右移位

    2)将最后移出的一位写入CF中。

    3)最高位用0补充

    将x逻辑右移一位,相当于执行x=x/2

    14.4  CMOS  RAM中存储的时间信息。

    在CMOS  RAM中,存放着当前时间:

    秒:00H

    分:02H

    时:04H

    日:07H

    月:08H

    年:09H

     比如:

    数值26,用BCD码表示为:0010 0110

    可见,一个字节可表示两个BCD码

    则CMOS  RAM存储时间信息的单元中,存储了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。

    比如:00010111b表示14.

    编程:在屏幕中间显示当前的月份。

    分析:这个程序主要做两部分的工作。

    1)从CMOS RAM的8号单元读出当前月份的BCD码

    要读取CMOS RAM的信息,我们首先要向地址端口70h写入要访问的单元的地址:

    mov  al,8

    out  70h,al

    然后从数据端口71h中取得指令单元中的数据;

    in  al,71h

    2)将用BCD码表示的月份以十进制的形式显示到屏幕上。

    我们可以看出,BCD码值=十进制码值,则BCD码值+30h=十进制数对应的ASCII码。

    从CMOS RAM的8号单元读出的一个字节中,包含了用两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。

    比如:00010100b表示14

    ;编程:在屏幕中间显示当前的月份
    
    assume cs:code
    code segment
    start:mov al,4
          out 70h,al
          in al,71h
          mov ah,al
          mov cl,4
          shr ah,cl
          and al,00001111b
    
          add ah,30h
          add al,30h
    
          mov bx,0b800h
          mov es,bx
          mov byte ptr es:[160*12+40*2],ah  ;显示月份的十位数码
          mov byte ptr es:[160*12+40*2+2],al;显示月份的个位数码
    
          mov ax,4c00h
          int 21h
    
    code ends
    end start
  • 相关阅读:
    windows 物理内存获取
    windbg-.process切换进程(内核)
    cnetos 6.7彻底解决vmware NAT网络问题
    优秀的博客链接地址
    使用Spring MVC统一异常处理实战
    active mq 配置
    socket demo程序
    flume 中的 hdfs sink round 和roll
    软链接与硬链接
    flume A simple example
  • 原文地址:https://www.cnblogs.com/fate-/p/12984077.html
Copyright © 2011-2022 走看看