• 端口01 零基础入门学习汇编语言67


    第十四章:端口01

     

    让编程改变世界

    Change the world by program


     

    引言

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

    (1)CPU 内部的寄存器; (2)内存单元; (3)端口。 这一章,我们讨论端口的读写。  

    端口的读写

      对端口的读写不能用mov、push、pop等内存读写指令。 端口的读写指令只有两条:in 和 out分别用于从端口读取数据和往端口写入数据。  

    我们看一下CPU 执行内存访问指令和端口访问指令时候,总线上的信息:

    (1)访问内存 (2)访问端口  

    访问内存

      mov ax,ds:[8]     ;假设执行前 (ds)=0

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

    CPU通过地址线将地址信息8发出;

    CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据;

    存储器将 8号单元中的数据通过数据线送入CPU。

     

    访问端口

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

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

    CPU通过地址线将地址信息60h发出;

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

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

     

    端口的读写

     

    动画片时间(具体内容请看视频中详解)

    [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/14_端口读写.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed] 注意:在in和out 指令中,只能使用 ax 或al 来存放从端口中读入的数据或要发送到端口中的数据。访问8 位端口时用 al ,访问16 位端口时用ax 。  

    对0~255以内的端口进行读写:

    in al,20h ;从20h端口读入一个字节

    out 20h,al ;往20h端口写入一个字节

     

    对256~65535的端口进行读写时,端口号放在dx中:

    mov dx,3f8h ;将端口号3f8送入dx

    in al,dx ;从3f8h端口读入一个字节

    out dx,al ;向3f8h端口写入一个字节

       

    CMOS RAM 芯片

     

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

    (1)包含一个实时钟和一个有128个存储单元的RAM存储器。(早期的计算机为64个字节) (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.1

     

    shl指令和shr指令

    shl指令和shr指令是逻辑移位指令,后面的课程中我们要用到移位指令,这里进行一下讲解。  

    shl逻辑左移指令

    功能为:

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

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

    (3)最低位用0补充。

      例如有如下指令:

    mov al,01001000b

    shl al,1      ;将al中的数据左移一位

    执行后 (al)=10010000b,CF=0。   如果移动位数大于1时,必须将移动位数放在cl中。 比如,指令:

    mov al,01010001b

    mov cl,3

    shl al,cl

      执行后(al)=10001000b,那请问,CF的值是多少捏? 因为最后移出一位是0,所以CF=0。   可以看出,将X逻辑左移一位,相当于执行X=X*2。 [caption id="attachment_409" align="aligncenter" width="300"] 逻辑左移[/caption]  

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

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

    将最后移出的一位写入CF中;

    最高位用0补充。

      可以看出,将X逻辑右移一位,相当于执行X=X/2。 [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/14_shl指令.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed]  

    检测点14.2

    [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LEOOTFIPBURI']视频下载[/Downlink]
  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846087.html
Copyright © 2020-2023  润新知