910 likes | 1.11k Views
微型机系统与接口技术自学部分. 只作扩展知识用. 本电子课件包含 2011 版第 3, 6, 7, 8 章自学部分. 东南大学计算机科学与工程学院. 第 3 章 80x86 汇编语言程序设计. 3.6 宏定义、宏调用与宏展开(自学). 宏定义是源程序中一段有独立功能的程序代码。将这一段程序定义为一条宏指令,并具有一个相应的宏指令名,在程序中就可以多次调用它,调用时只需要引用一个宏指令名来代替这一段程序就可以了。在汇编的时候,汇编程序会自动将这个宏指令扩展成整段程序。. 宏定义 宏定义有两种格式 : 1 、简单宏定义 宏名 MACRO
E N D
微型机系统与接口技术自学部分 只作扩展知识用 本电子课件包含2011版第3, 6, 7, 8章自学部分 东南大学计算机科学与工程学院
3.6 宏定义、宏调用与宏展开(自学) 宏定义是源程序中一段有独立功能的程序代码。将这一段程序定义为一条宏指令,并具有一个相应的宏指令名,在程序中就可以多次调用它,调用时只需要引用一个宏指令名来代替这一段程序就可以了。在汇编的时候,汇编程序会自动将这个宏指令扩展成整段程序。
宏定义 宏定义有两种格式: 1、简单宏定义 宏名 MACRO …… ;宏体 …… ;宏体 ENDM 简单宏定义示例 CRLF MACRO MOV AH, 02H MOV DL, 0DH ;回车 INT 21H MOV DL, 0AH ;换行 MOV AH, 02H INT 21H ENDM
2、带形参的宏定义 宏名 MACRO <形参表> …… ;宏体 …… ;宏体 ENDM 带形参的宏定义示例 MULTIPLY MACRO OPR1, OPR2, RESULT PUSH DX PUSH AX MOV AX, OPR1 IMUL OPR2 MOV RELUST, AX MOV RESULT+2, DX POP AX POP DX ENDM
宏调用 宏调用有两种格式: 1、对简单的宏定义的调用:宏名 2、带形参的宏定义的调用:宏名<实参表> 宏调用示例 CRLF MULTIPLY CX, VAR, XYZ[BX] MULTIPLY 240, BX, SAVE
宏扩展(宏展开) 宏扩展——汇编程序对汇编源程序汇编时将宏体 插入到宏调用处 MULTIPLY宏扩展示例 + PUSH DX + PUSH AX + MOV AX, CX + IMUL VAR + MOV XYZ[BX],AX ;实参替换形参 + MOV XYZ[BX]+2,DX + POP AX + POP DX 说明: 汇编程序在所展开的指令前加‘+’号以示区别
宏指令与子程序的区别 子程序 宏指令 程序执行期间 在汇编期间展开 由主程序调用 它只占有自身 与调用次数有关,每调用一次 大小的空间 就把宏定义体展开一次 执行时需增加时间 直接执行宏体 上的额外开销
宏定义的进一步讨论: 1、宏定义可以无变元 2、变元可以是操作码 宏定义: FOO MACRO P1, P2, P3 MOV AX, P1 P2 P3 ENDM 宏调用: FOO WORD_VAR, INC, AX 宏展开: + MOV AX, WORD_VAR + INC AX
3、变元可以是操作码的一部分,必须用&作为分隔符3、变元可以是操作码的一部分,必须用&作为分隔符 宏定义: LEAP MACRO COND, LAB J&COND LAB ENDM 宏调用: LEAP C, THERE 宏展开: + JC THERE
4、变元是ASCII串 宏定义: MSGGEN MACRO LAB, NUM, XYZ LAB&NUM DB ‘HELLO MR.&XYZ’ ENDM 宏调用: MSGGEN MSG, 1, TAYLOR 宏展开: + MSG1 DB ‘HELLO MR.TAYLOR’
5、宏定义体内允许使用标号, 此时,须使用LOCAL伪操作 宏展开: + CMP VAR, 0 + JGE ??0000 + NEG VAR + ??0000: …… + CMP BX, 0 + JGE ??0001 + NEG BX + ??0001: 宏定义: ABSOL MACRO OPER LOCAL NEXT CMP OPER, 0 JGE NEXT NEG OPER NEXT: ENDM 宏调用: ABSOL VAR …… ABSOL BX
6、宏定义中可以使用宏调用,(必须先定义后调用)6、宏定义中可以使用宏调用,(必须先定义后调用) 宏定义: DIF MACRO X, Y MOV AX, X SUB AX, Y ENDM DIFSQR MACRO OPR1, OPR2, RESULT PUSH DX PUSH AX DIF OPR1, OPR2 IMUL AX MOV RESULT, AX POP AX POP DX ENDM
3.7在VC++中嵌入汇编语言指令(自学) 本节类容适合在Visual C++5.0/60中使用 格式1:_asm { 汇编语言指令 } 格式2:_asm 汇编语言指令 说明:1)格式1中{ }内可以是1条也可以是多条汇编指令 2)格式2只能跟一条汇编语言指令 3)有些版本的VC需要使用__asm(两个下划线)
嵌入汇编示例1 _asm { mov eax, 01h mov dx, 0xD007 out dx, eax } 嵌入汇编示例2 _asm mov eax, 01h _asm mov dx, 0xD007 _asm out dx, eax
在_asm中使用汇编语言的注意事项: • 嵌入式汇编支持80486的全部指令系统。VC++5/6还支持MMX指令集。 • 对于不支持的指令,VC提供_emit伪指令进行扩展#define cpi_id _asm _emit 0x0F _asm _emit 0XA2 _asm { cpu_id} //使用C++的宏 • 嵌入式汇编代码可以使用MASM的表达式来产生一个数值或地址 • 嵌入式汇编行可以采用C++或MASM的注释风格 • 嵌入式汇编可以使用C++的数据类型和数据对象,但是不能使用MASM的伪指令和操作符定义数据,如DB, DW, DUP等
嵌入式汇编不支持MASM的宏指令,也不支持大部分MASM伪指令嵌入式汇编不支持MASM的宏指令,也不支持大部分MASM伪指令 • 用汇编语言编写的函数中,不必保存EAX/EBX/ECX/EDX/ESI和EDI寄存器,但是必须保存函数中使用的其他寄存器 • 嵌入式汇编代码可以使用LENGTH(返回数组元素个数)、 TYPE(返回 C++类型或变量的大小)、 SIZE(LENGTH×TYPE)操作符。 对于数据 int iarray[8](int类型是32位,4字节),则: LENGTH iarray 返回8 TYPE iarray 返回4 SIZE iarray 返回32
在_asm中使用C++语言的注意事项: • 嵌入式汇编代码可以使用C++的符号(包括标号、变量、函数名)、常量(包括符号常量、枚举成员)、宏和预处理指令、注释、类型名及结构、联合的成员。 • 每一个汇编语句只能包含一个C++符号,且不能使用和MASM保留字相同的C++符号,也不识别struct和union关键字 • _asm中引用函数前必须在程序说明其原型 • 嵌入式汇编语句中可以使用汇编语言格式表示整数常量,也可以采用C++的格式(如0x37a)
嵌入式汇编语言中不能使用C++专用操作符,如<<,可以使用两种语言都有的操作符嵌入式汇编语言中不能使用C++专用操作符,如<<,可以使用两种语言都有的操作符 • 嵌入式汇编中可以引用包含该_asm作用范围内的任何符号(包括变量),它通过使用变量名引用C++的变量 • 嵌入式会变中的标号的作用范围为定义它的函数中有效,汇编转移指令和C++的goto指令都可以跳到_asm块内或块外的标号 • _asm块中定义的标号对大小写不敏感,汇编语言指令跳转到C++中的标号也大小写不敏感,但C++的goto语句跳转的标号大小写敏感
int array[6] struct first_type { char *carray; int same_name; } ftype; struct second_type { int same_name; } stype _asm { mov array[6], dx mov ebx,OFFSET ftype mov ecx, [ebx].carray mov esi, [ebx]ftype.same_name } 使用C++数据举例
嵌入式汇编举例: #include <iostream.h> int power2(int, int); void main(void) { cout<<"2的6次方乘5等于:\t"; cout<<power2(5,6)<<endl; } int power2(int num, int power) { _asm { mov eax, num ; 取第一个参数 mov ecx, power ; 取第二个参数 shl eax, cl ; 计算EAX=EAX×(2CL) } // 返回值存于EAX }
汇编语言通过参数名就可以引用参数,采用return返回出口参数,也可以不写return,编译时可能有警告。汇编语言通过参数名就可以引用参数,采用return返回出口参数,也可以不写return,编译时可能有警告。 • 返回值的约定: • ≤32位的数据扩展到32位,存放在EAX中返回 • 4~8字节的返回值存放在EDX.EAX中返回 • 更大的字节数据将它的地址指针存放在EAX中返回
6.3.6 USB2.0的补充——OTG技术(自学) USB On-The-Go(OTG)是对USB 2.0规范的有益的扩充。这类设备既可以作为USB设备与PC机相连,又可以作为USB主机连接其它USB设备。因此,这类设备可以抛弃PC,直接进行设备与设备之间的点对点(pear to pear)通信。 • USB On-The-Go 在USB 规范基础上增加了以下几点 • 双重功能。设备既可用作主机也可用作外设 • 主机交流协议HNP 用于转换USB 主机和外设功能 • 对话请求协议 • 除小和大功率之外增加了微功率选择 • 超小连接器
mini-B 插头 mini-A 插头 VBUS D+ D- VCC VCC GND ID ‘0’: Master A设备 ‘1’: Slave B设备 USB On-The-Go 设备定义了一个新的称之为mini-AB 的袖珍插孔,它能接入mini-A 和mini-B 插头。连接器的不同定义设备的初始功能。
两个OTG RTR(主/从双角色)设备相连,可以用主机交流协议(HNP)随时切换主机角色。步骤如下: • A设备发出SET_FEATURE命令后,B设备可请求总线控制权。 • A设备挂起总线,通知B设备可占用总线。 • B设备发送信号,断开A设备连接。 • A设备启动D+线本方的上拉电阻,将D+置高。此时A设备成为外设,B设备成为主机。 • B设备完成对总线控制后,启动D+线本方的上拉电阻,放弃对总线的控制。 • 在以上电平变换的同时,通过软件实现真正的对总线的控制权变化。
6.3.7 开发具有USB功能的设备的先期准备(自学) 1.分清开发的设备类型 • 嵌入式USB主机 • USB Hub • 基于HID(人机接口设备)的USB设备 • USB OTG设备 2.选择合适的控制芯片 • 内嵌USB模块和嵌入式CPU核的SOC芯片 • 内嵌单片机内核的USB控制芯片 • 可与其它嵌入式CPU相连的单独USB控制芯片
3.一般的开发步骤 • 根据选择的器件和要实现的功能,设计相关电路。 • 编制软件(根据不同应用,设计其中部分或全部软件)。- 设备驱动程序(对USB设备,或OTG设备)- USB主机设备的控制程序(对主机或OTG设备,如完成枚举功能等)- 主机和设备的角色切换驱动(对OTG设备)- 编写相关的PC端软件 4.目前常见的控制芯片 • OTG芯片:ISP1362,OTG243 • 主机/设备芯片: SL811HS,ISP1161 • 设备芯片:PDIUSBD12,ISP1581 • HUB芯片:GL652USB
6.3.8 USB 3.0概览(自学) • 最高速为4.8Gbps • 采用全双工传输 • 接口由4线改成8线 • 增加的4线路用于数据发送或接收 • USB 3.0 的供电力提高到了每个端口900mA • 与USB2.0和USB1.1向下兼容
6.4 PCI-Express总线 (自学) 6.4.1 PCI-Express总线的主要性能特点 PCI Express为互连设备提供高速、高性能、点对点、双/单工、差动信令链路。数据从一组信号线上发送,而在另一组信号线上接收。采用设备间的点对点串行连接。 将两台设备连接在一起的一个PCI Express互连称为一条链路。一条×1的链路有一条通道,即每个方向上有一对差动信号,共4个信号。
1、串行的点对点互连 2、使用差动信号 3、使用交换器来互连多台设备 4、采用基于数据包的协议 5、具有更高的数据传输速率(2.5Gbit/s的单向单线连接传输速率) 6、拥有存储器地址空间、IO地址空间和配置地址空间 7、采用层次结构 8、热插拔支持 9、与PCI兼容的软件模型
(1)根联合体 集成了多种控制器,替CPU产生事务请求,它还可以代表CPU发起配置事务请求、生成存储器和I/O请求和锁定事务请求。 根联合体发送数据包离开其端口,或从其端口接收数据并转发至存储器。 根联合体初始化用来形成请求者或完成者的设备ID,通常由总线号、设备号和功能号组成。根联合体的总线、设备及功能号都被初始化全为0。
(2)交换器 交换器利用基于存储器、I/O或配置地址的路由方法转发数据包。 交换器根据下面3种路由机制之一转发这些数据包:地址路由、ID路由或隐式路由。 交换器能实现两种仲裁机制:端口仲裁和VC仲裁,并且依据仲裁机制确定将入端口数据包转发至出端口的优先级。交换器支持锁定请求。
(3)端点 端点可以作为请求者发起事务,或者作为完成者对事务做出响应。 端点有PCI Express端点和传统端点两种。传统端点支持I/O事务,而且可以作为完成者支持锁定事务语义,还可以利用消息请求产生传统中断信号,但另外还必须支持产生利用存储器写事务的MSI。 PCI Express端点必须在可预取存储地址空间内支持64位存储器寻址能力。 两种类型的端点都实现了0类 PCI配置头,并且作为完成者对配置事务做出响应。
6.4.3 PCI Express事务简介 事务:为请求者和完成者之间完成一次信息传送需要完成的一系列一个或多个数据包传送的过程。 PCI Express事务可以分成4大类:存储器事务、I/O事务、配置事务和消息事务。
6.4.4 PCI-Express的层次结构 PCI Express 设备A PCI Express 设备B 设备核心 设备核心 PCI Express 核心逻辑接口 PCI Express 核心逻辑接口 发送 接收 发送 接收 事务层 事务层 数据链路层 数据链路层 物理层 物理层
(1)设备核心/软件层 设备核心是由根联合体核心逻辑或诸如以太网控制器、SCSI控制器、USB控制器等端点核心逻辑组成。 设备核心逻辑与本地软件一起提供PCI Express设备生成TLP所需的必要信息。 (2)事务层 事务层主要负责生成出站TLP流量和接收入站TLP流量。 (3)数据链路层 数据链路层的主要功能是保证在各链路上发送和接收数据包时数据的完整性。 (4)物理层 TLP和DLLP类型的数据包从数据链路层发送至物理层,并通过物理链路传送。物理层也从链路上接收数据包并将其发送至数据链路层。
7.5 串行中断(自学) 串行中断分离部件 SERIRQ 2个8259 部件 … INTR 串行中断驱动部件 PIRQx … ICH8 IRQ14,15 7.5.1 串行中断结构 INTR SERIRQ SIO LPC47B27X IRQx ICH8 CPU … PIRQx IRQ14,15
SERIRQ包含IRQ0, 1, 3~15, PIRQA#~PIRQD#, SMI#和IOCHK#。但实际上并不支持IRQ0、8、13中断。实际的IRQ14、IRQ15实际上也不从SERIRQ中传到南桥。 SERIRQ线采用同步单线传输结构。 • 遵循PCI信号使用的三态协议。 • S-取样阶段 信号为低电平。 • R-恢复阶段 信号为高电平。 • T-翻转状态 信号被释放 SERIRQ上信息分帧传输。
7.5.2 帧结构 1.开始帧 • 操作模式: • 连续的(ICH8单独产生开始帧) • 静态的(一个串行IRQ设备来启动开始帧) 长度:4、6或8个时钟宽度(设备31的0号功能配置空间的64H处串行IRQ控制寄存器位1和位0决定). 2.停止帧 长度:2或3个时钟宽度。(由SERIRQ配置寄存器决定) 含义:2—SERIRQ设备触发下次开始帧; 3—ICH8触发下次开始帧。
3.数据帧 长度:21个时钟宽度。 驱动:需请求中断的设备在自己的数据帧中将SERIRQ驱动: • IRQ0~15在没有中断请求的时候将SERIRQ线驱动为低电平 • PCI INT[A:D]#,SMI#和IOCHK#在有中断请求的时候将SERIRQ线驱动为低电平 • 否则都将SERIRQ线变为三态,由上拉电阻将他们驱动到高电平 。 所谓自己的数据帧是指在21个时钟中数据帧号和本设备的IRQ号码相等那一数据帧。外设要在SERIRQ的上升沿开始计算帧。
7.6 APIC(自学) 处理器0 处理器1 处理器核心 处理器核心 Local APIC Local APIC LINT0/ INTR LINT0/ INTR 模块 模块 LINT1/ NMI LINT1/ NMI PICCLK APIC 时钟 PICD1 PICD0 I/O APIC 模块 INTIN 23 INTIN 0 系统中断请求 7.6.1 APIC子系统组成 1.组成 Local APIC、I/O APIC和APIC总线。 返回下页
Local APIC: 转上页 包含了8259A和8254的功能。 响应的中断: I/O APIC送来的系统中断请求; 经APIC总线送来的处理器间中断请求(IPI); 本地的中断请求(定时、错误、计数、连线)。 I/O APIC: 多达24个中断; 中断优先级与中断号独立; 不需要中断响应周期。 可选择某个或一组处理器中的一个为目标处理器。
APIC总线: 组成:APICD0、APICD1、APICCLK。 类型:串行同步总线。 串行时序:不同时钟先高位,后低位;同一时钟D1高位,D0低位。 内容:EOI命令和短消息。 应用:连接的每个模块均有自己的ID(固定); 每个模块均有自己的仲裁ID(可变,初值来自模块ID)。
2.APIC中断类型 系统中断: 经I/O APIC模块引脚送入的中断请求。 交中断请求指定的目标处理器处理。 本地中断: 定时、计数、错误、INTR及NMI。 只能由本地处理器处理。 处理器间中断: 电平撤消初始化、初始化、启动、远程读、SMI、NMI等。 交目标处理器处理。
7.6.2 I/O APIC的寄存器 1.直接访问寄存器 INDR:[R/W]存放需访问的间接寄存器编号。 DATR:[R/W]间接访问寄存器访问结果。 IRQPAR:[W]存放置位方式产生的中断向量号。 EOIR:[W]存放正在服务(将结束)的中断向量号。 2.间接访问寄存器 IDR:[R/W32B]存放模块自己的固定的ID。 VERR:[R32B]存放有无IRQ声明和重定向寄存器数。 ARBIDR:[R32B]存放模块的仲裁ID。 BOOT_CONFIGR:[R/W32B]存放中断传递方式。