java打印对象内存地址 分布式事务 事务消息 分布式事务 几种解决方案 分布式事务-Seata 分布式事务-Seata 分布式事务-LCN-TCC 分布式事务-LCN 分布式事务-消息队列-定时任务-本地事件表 Zuul网关实战02 Zuul网关实战01 灰度发布落地实战2 灰度发布落地实战1 Gsnova on Heroku build Systemd Debian system initialization manage multi id_rsa ubuntu 64bits cannot run 32bits app REHL power auditing Debug Assembly for ARMv8 on QEMU ARM体系结构--寄存器 Run Debian iso on QEMU ARMv8 QEMU ARM64 guide cross compiler install buildroot install QEMU install python入门--数据结构 python入门--内置数据类型 python入门--类 异常 python入门--条件表达式 方法 python入门--数字 字符串 数组 RTC驱动分析 块设备驱动 TCP UDP socket 触摸屏驱动 USB驱动 LED按键中断 LCD 驱动 驱动信号 根文件系统 实验 内核实验 字符设备驱动程序 绪论 uboot 实验 LCD 实验 系统时钟和UART 中断控制器 Nand Flash控制器 MMU 实验 储存管理器实验 GPIO实验 点亮LED 编译加载驱动 制作烧写内核 dnw替代方法 MINI2440 TQ2440安装配套Linux 使用NFS 制作烧写跟文件系统 grub引导Windows 烧写裸版程序-linux Ubuntu 网络没有 eth0 Linux自动挂载 烧写裸板程序 电路基础 Mac词典 Vim插件 Assembly 综合研究 Assembly 指令总结 Assembly 直接定址表 Assembly 使用BIOS进行键盘输入和磁盘读写 Assembly 外中断 Assembly 端口 Assembly int指令 Assembly 内中断 Assembly 标志寄存器 Assembly 转移指令的原理 Assembly Call和ret指令 Assembly 数据处理两个基本问题 Assembly 灵活定位内存地址 Assembly 包含多个段的程序 Assembly [bx] loop Assembly 第一个程序 Assembly 寄存器 (内存访问) Assembly 寄存器 AWS VPN with EC2 hidden file in picture(linux) Assembly 基础 idea shortcuts 常用快捷键 idea plugin folder install ruby and jekyll

Assembly 端口

2014年10月02日

各种存储器和CPU的地址线、数据线、控制线相连。CPU在操控他们的时候,把它们都当做内存来对待(内存地址空间)

在PC机中,和CPU通过总线相连的芯片除各种存储器外,还有:

  1. 各种接口卡(比如,网卡、显卡)上的接口芯片,他们控制接口卡进行工作
  2. 主板上的接口芯片,CPU通过他们对部分外设进行访问
  3. 其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理

在这些芯片中,都有一组可以由CPU读写的寄存器。这些寄存器他们在物理上可能处于不同的芯片中,但是他们在以下两点上相同;

  1. 都和CPU的总线相连,当然这种连接是通过他们所在的芯片进行的
  2. CPU对他们进行读或写的时候都通过控制线向他们所在的芯片发出端口读写命令

从CPU的角度,将这些寄存器都当做端口,对他们进行统一编址,从而建立了一个统一的端口地址空间。每一个端口在地址空间中都有一个地址。

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

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

###端口的读写 在访问端口的时候,CPU通过端口地址来定位端口。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口地址的范围为:0~65535

端口的读写只有2条指令:in 和 out,分别从端口读取数据和往端口写入数据

in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。

访问8位端口时用al,访问16位端口时用ax

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

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

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

mov dx,3f8h	;将端口号3f8h送入dx
in al,dx	;从3f8h端口读入一个字节
out dx,al	;向3f8h端口写入一个字节

###CMOS RAM芯片 芯片特征:

  1. 包含一个实时钟和一个有128个存储单元的RAM存储器(早期的计算机为64个字节)
  2. 该芯片靠电池供电,所以,关机后起内部的实时钟仍可正常工作,RAN中的信息不丢失
  3. 128个字节的RAM中,内部实时钟占用0~0dh 单元来保存时间信息,其余大部分单元用于保存系统配置信息,供系统启动时 BIOS程序读取
  4. 该芯片内部有两个端口,端口地址为:70h和71h。CPU通过这两个端口来读写CMOS RAM
  5. 70h为地址端口,存放要访问CMOS RAM单元的地址;71h为数据端口,存放从选定的CMOS RAM单元中读取的数据,或要写入到其中的数据

例:编程,读取CMOS RAM的2号单元的内容

mov al,2
out 70h,al
in al,71h

例:编程,向CMOS RAM的2号单元写入0

mov al,2
out 70h,al
mov al,0
out 71h,al

###shl和shr指令 他们是逻辑移位指令

shl是逻辑左移指令:X逻辑左移一位,相当于X=X * 2

  1. 将一个寄存器或内存单元中的数据向左移位
  2. 将最后移出的一位写入CF中
  3. 最低位用0补充
mov al,01001000b
shl al,1	;将al中的数据左移1位

执行后,(al)=10010000b,CF=0

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

mov al,01010001b
mov cl,3
shl al,cl

shr是逻辑右移指令,和shl所进行的操作相反,X逻辑右移一位,相当于X=X / 2

mov al,10000001b
shr al,1	;将al中的数据右移一位

执行后(al)=01000000b,CF=1

###CMOS RAM中存储的时间信息 存放着当前的时间:年、月、日、时、分、秒。这6个信息的长度都为1个字节,存放单元为:

秒:0

分:2

时:4

日:7

月:8

年:9

这些数据以BCD码的方式存放,BCD码是以4位二进制数表示十进制数码的编码方法:

十进制数码 0 1 2 3 4 5
对应的BCD码 0000 0001 0010 0011 0100 0101

一个字节可以表示两个BCD码,则CMOS RAM存储时间信息的单元中,存储了两个BCD码表示的两位十进制数,高4位的BCD码表示十位,低4位的BCD码表示个位。比如,00010100b表示14

BCD码值=十进制数码值,则BCD码值+30H=十进制数对应的ASCII码

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

源代码