汇编语言笔记14-端口

转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne

CPU直接读写数据的地方

  1. CPU内部的寄存器
  2. 内存单元

    各种存储器都CPU的地址线、数据线、控制线相连CPU把它们当做内存,看作一个逻辑存储器(内存地址空间)

  3. 端口

    除了存储器外,和CPU的总线相连的还有下面3中芯片。

    (1). 各种接口卡(如网卡、显卡)上的接口芯片,它们控制接口卡进行工作;

    (2). 主板上的接口芯片CPU通过它们对部分外设进行访问;

    (3). 其他芯片,用来存储相关的系统信息,或者进行相关的输入输出处理。

    这些芯片中,都有一组可以由CPU读写的寄存器,物理上处于不同的芯片中;但是从CPU的角度看,CPU对它们进行读写操作都是通过控制线向它们所在的芯片发出端口读写命令[CPU将这些寄存器当做端口,对它们进行统一编址,从而建立了一个统一的端口地址空间,每个端口在地址空间中都有一个地址]

   

PS:寄存器的功能十分重要,CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过"端口"交换数据,外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为"端口",这种说法不太严格,但经常这样说。

  

端口的读写

  1. 端口的读写和内存的读写很像。如下图:

  2. PC系统中,CPU最多可以定位64KB个不同的端口。端口地址的范围为0~65536。

    (1). inout指令中,只能使用ax或者al来存放从端口中读入的数据或者要发送给端口中的数据;

    (2). 对于256~65536的端口号需要放在dx中。

端口号

0~255

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

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

256~65536

mov dx, 3f8h

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

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

   

shlshr指令

指令

实现功能

示例1(移动1)

示例2(移动n)

逻辑左移: shl

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

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

(3). 最低位用0补充.

mov al, 01001000b

shl al, 1

mov al, 01001000b

mov cl, 3

shl al, cl ;(必须放在cl)

逻辑右移: shr

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

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

(3). 最高位用0补充.

mov al, 01001001b

shr al, 1

mov al, 01001000b

mov cl, 3

shr al, cl ;(必须放在cl)

   

CMOS RAM芯片的操作

PC机上,微机主板上有一块可读写的RAM芯片,来保存当前系统的硬件配置和用户对某些参数的设定。该芯片靠电池供电,关机后内部的实时钟仍可以正常工作。

现在的厂商把BIOS程序做到了CMOS芯片中,当开机时就可按特定键进入CMOS设置程序对系统进行设置。所以又被人们叫做BIOS设置。

CMOS RAM芯片上还包含一个实时钟,该芯片内部有两个端口,端口地址为70h71hCPU通过这两个端口读写CMOS RAM。

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

 

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

 

 1 assume cs:code
 2 code segment
 3 start:
 4         mov al, 8
 5         out 70h, al
 6         in al, 71h
 7         
 8         mov ah, al                        
 9         mov cl, 4
10         shr ah, cl                             ; ah中为月份的十位数码值
11         and al, 00001111b                      ; al中为月份的个位数码值
12         
13         add ah, 30h                            ; 对应的ASCII码
14         add al, 30h
15         
16         mov bx, 0b800h
17         mov es, bx
18         mov byte ptr es:[160*12+40*2], ah      ; 显示月份的十位数码
19         mov byte ptr es:[160*12+40*2+2], al    ; 显示月份的个位数码
20         
21         mov ax, 4c00h
22         int 21h
23         
24 code ends
25 
26 end

 

posted @ 2012-10-26 15:34  dennis_fan  阅读(1941)  评论(1编辑  收藏  举报