2.22k likes | 2.41k Views
第 3 章教学内容及目标. 教学内容 : 工作模式,程序设计模型 , 实模式存储器寻址, 段和偏移寄存器之间的隐含关系。堆栈及其实现 、 I/O 口的组织 。 教学目标: 了解工作模式,建立起程序设计模型的基本概念,了解实模式存储器寻址的有关问题的基本概念,以便于为进一步学习汇编语言程序设计打下基础。 能够描述软件堆栈的工作原理,建立 I/O 空间的概念。. 实践教学 : 用 REGISTER 窗口观察 CPU 中各寄存器的 名称与长度, EFLAGS/FLAGS 的位意义。 教学设计 (1):
E N D
第3章教学内容及目标 教学内容:工作模式,程序设计模型,实模式存储器寻址, 段和偏移寄存器之间的隐含关系。堆栈及其实现、I/O口的组织。 教学目标:了解工作模式,建立起程序设计模型的基本概念,了解实模式存储器寻址的有关问题的基本概念,以便于为进一步学习汇编语言程序设计打下基础。能够描述软件堆栈的工作原理,建立I/O空间的概念。
实践教学:用REGISTER窗口观察CPU中各寄存器的 名称与长度,EFLAGS/FLAGS的位意义。 教学设计(1): • 首先介绍“结构”和3.1节中三种工作模式的概念。 • 以3.2节中的图3.1和图3.2为依据,介绍程序设计模型概念:32位寄存器、16位寄存器和8位寄存器。 • 以chap3-1.asm为例,启动PWB → 进入CodeView。点Windows → Register,打开Reg窗口,介绍8位寄存器、16位寄存器和32位寄存器及其引用方法。 • 上机时查看EFLAGS/FLAGS的方法:在PWB下打开帮助内容 → Assembly → Language Overview → Processor Flag Summary。
实践教学:用MEMORY 1窗口观察DS段中数据的存放方式。 教学设计(2): • 首先介绍实地址模式存储器的大小的概念。 • 以3.3节中的图3.6为依据,介绍字数据和双字数据在内存中的存放规律。 • 以chap3-2.asm为例,启动PWB → 进入CodeView。点Windows → Memory 1,打开Memory 1窗口,验证字数据和双字数据在内存中的存放规律。
4.介绍内存分段管理,逻辑地址、物理地址及其变换4.介绍内存分段管理,逻辑地址、物理地址及其变换 5.以chap3-2.asm为例,启动PWB → 进入CodeView。点Windows → Source 1,打开Source 1窗口,以Assembly方式显示,验证逻辑地址变换为物理地址的方法。 6.介绍3.4节中的段和偏移寄存器之间的隐含关系的概念和3.4节中的保护模式存储器寻址的概念。 7.课堂练习:练习题23。
教学设计(3): 1.首先介绍堆栈的两种实现方法和操作方式的概念。 2. 以3.6.1节中的图3.13和图3.14为依据,介绍硬件堆栈的工作过程。 3. 介绍3.6.2节中的软件堆栈的概念。 4. 以3.6.2节中的图3.15、图3.16和图3.17为依据,介绍软件堆栈的初始化、压栈操作和出栈操作的工作过程。
5. 以chap3-3.asm为例,启动PWB → 进入CodeView。点Windows → Register,设置为16位方式。点Windows → Memory 1,设置为SS∶0。练习16位数据压栈操作和出栈操作的工作过程。
6. 以chap3-4.asm为例,启动PWB → 进入CodeView。点Windows → Register,设置为32位方式。点Windows → Memory 1,设置为SS∶0。练习32位数据压栈操作和出栈操作的工作过程。 7. 介绍3.7节中的I/O口组织的概念。
第3章 IA-32 Intel 系列CPU的结构 CPU的结构指的是从汇编语言程序员的角度所能够感受到的系统属性,诸如寄存器结构、存储器访问技术、指令系统、指令系统所支持的数据类型、I/O技术等。
3.1 工作模式(operating mode) IA-32 Intel系列CPU支持3种工作模式: 保护模式(protected mode)、 实地址模式(real-address mode)、 系统管理模式(system management mode)。
Windows操作系统环境下使用CPU的何种工作模式? 使用保护模式。 在这种模式下,全部的指令与结构特性都可以使用,处在保护模式下的Windows操作系统所使用的存储器模型是“flat”。
在上电(power-up)之后,32 位CPU首先进入何种工作模式? 通常,在上电(power-up)或者系统复位(reset)之后,IA-32 Intel系列CPU总是首先进入实地址模式,然后再切换到保护模式。
在实地址模式下,CPU仅支持与该模式有关的存储器模型,例如“tiny”、“small”……,但“flat” 存储器模型不能用。CPU仅能访问00000H~FFFFFH之间的内存区域。
3.2 程序设计模型(programming model) CPU所具有的程序可见寄存器的组合称之为程序设计模型。
32位寄存器: 通用寄存器: EAX、EBX、ECX、EDX、 ESP、EBP、EDI、ESI,共8个。 指令指针寄存器:EIP。 标志寄存器:EFLAGS。 “E”:Extensive,因此上述寄存器称为扩展寄存器。
哪些CPU能够寻址扩展寄存器? 80386以上的CPU。 段寄存器:CS、DS、ES、SS、FS、GS, 共6个,每个长度为16位。
16位寄存器: 通用寄存器:AX、BX、CX、DX、 SP、BP、DI、SI,共8个。 指令指针寄存器:IP。 标志寄存器:FLAGS。
8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL,共8个,如图3.2所示。
双字(Double Word)数据:32位长,如32 位寄存器的内容。 字(Word)数据:16位长,如16位寄存器的 内容。 字节(Byte)数据:8位长,如8位寄存器的 内容。
通用寄存器: 如下表所示。
寄存器 操 作 表3.1通用寄存器的隐含引用 EAX 偏移地址 AX 字乘,字除,字I/O AL 字节乘,字节除,字节I/O,换码,10进制算术 AH 字节乘,字节除 BP 寻址堆栈区(SS段),指向栈内任意单元 EBX 寻址数据区(DS段) BX 换码 ECX 在字符串和循环操作中用作计数器 CX 在字符串和循环操作中用作计数器 CL 在移位和循环操作中用作计数器 EDX 乘,除 DX 字乘,字除,间接I/O ESP 堆栈指针寻址堆栈区(SS段),指向栈顶 SP 堆栈指针寻址堆栈区(SS段),指向栈顶 ESI 指向DS段中数据的指针,指向源字符串的指针 SI 指向DS段中数据的指针,指向源字符串的指针 EDI 指向DS段中数据的指针,指向目的字符串的指针 DI 指向DS段中数据的指针,指向目的字符串的指针
指令指针EIP/IP(Instruction Pointer)寄存器的用途: ※ 工作于实地址模式下的时候,使用16位IP, ※ 工作于保护模式下的时候,使用32位的EIP。 ※ EIP/IP承担着指令寻址的功能,即 EIP/IP的内容指向将要执行的下一条指令所在存储单元的偏移地址,以便于CPU可以正确地从内存CS段取指令并执行指令。 ※ 指令指针由CPU的硬件更新。
EIP/IP是控制指令(程序)流向的寄存器,下列5种情况影响着其内容的更新:EIP/IP是控制指令(程序)流向的寄存器,下列5种情况影响着其内容的更新: 1.计算机加电之后,CPU中执行复位(reset)功能的硬件会把reset向量打入IP(此时处于实地址模式下)。此后,CPU硬件就会从此单元取出第1条指令执行。这第1条指令往往是一条无条件转移指令JMP,转向系统初始化程序段去执行。 2.在顺序执行指令期间,CPU硬件会自动增量EIP/IP的内容,以便使其指向下条指令的偏移地址。
3. 在转移执行指令期间,转移类指令会更新EIP/IP的内容,使其指向转移目标地址,以便从转移目标处执行。 4. 过程调用的时候,指令CALL可以更新EIP/IP的内容,使其指向过程的入口地址,以便执行被调用的过程。过程执行完之后,返回地址(CALL指令的后续指令的地址)打入EIP/IP,以便接着从返回地址处继续执行。 5. 当发生中断请求的时候,CPU的中断管理硬件会把中断向量(中断服务程序的入口地址)打入IP,以便执行中断服务程序。中断服务程序执行完之后,断点(返回)地址打入IP,以便接着从断点处继续执行。
标志寄存器EFLAGS/FLAGS的功能: 用来指示CPU的状态,同时也可以控制它的操作。 当CPU工作于保护模式下的时候,使用EFLAGS;当CPU工作于实地址模式下的时候,使用FLAGS。图3.3示出了标志寄存器EFLAGS和FLAGS及其各个二进制位所代表的意义 。
状态标志: CF、PF、AF、ZF、SF、OF共6个, 这些状态标志位指示着CPU执行算术和逻辑指令操作结果的相应属性。
各个状态标志的功能如下: CF(Carry Flag):进位标志。 当执行算术指令操作结果的最高有效位输出了进位或借位时,CF为1。否则,CF为0。 该标志在多字节加法和减法中使用。该标志也可以指示无符号数算术操作的溢出状态。循环指令也可以通过把某个内存或寄存器中的位放入CF而隔离它。
PF(Parity Flag):奇偶校验标志。 如果PF=1,说明结果的低8位中含有偶数个1。否则,PF=0。 该标志可以用来检查数据传送错误。该标志在现代程序设计中已很少使用,它是早期Intel CPU在数据通信环境中校验数据的一种手段。今天,奇偶校验常常由数据通信设备完成,不再需要由CPU完成。
AF(Auxiliary Flag):辅助标志或半进位标志。 当使用BCD码进行算术操作的时候,如果AL寄存器的位3向高位输出了进位或借位,AF为1。否则,AF为0。 使用BCD码进行算术操作的指令DAA和DAS要测试此标志位。
ZF(Zero Flag):零标志位。 当执行算术或逻辑指令操作的结果为0时,ZF为1。否则,ZF为0。 条件转移类指令常常需要测试此标志位的状态,以决定是否改变程序的流向。
SF(Sign Flag):符号标志。 该标志位的状态与操作结果最高有效位的状态相同,即当操作结果最高有效位为1时,SF为1。否则,SF为0。 该标志位可以用来指出带符号整数(用补码表示)运算结果的正/负情况(最高有效位为0时,表示该数为正;最高有效位为1时,表示该数为负)。
OF(Overflow Flag):溢出标志。 溢出标志在带符号整数进行加或减操作时可能出现。如果OF为1,说明产生了算术溢出。此种情况意味着有效数字已丢失了,因为计算结果的长度已超出了硬件的表示能力。如果结果为正数太大,或者结果为负数太小时,均会发生溢出。在这种情况下,可利用INTO指令产生一个内部中断来处理。
字符串操作控制标志:1个。 DF(Direction Flag):方向标志。 当DF为1时,字符串操作指令(MOVS、CMPS、SCAS、LODS、STOS)对DI和SI的内容执行自动减量操作,以便于字符串处理从高地址到低地址。当DF为0时,字符串操作指令对DI和SI的内容执行自动增量操作,以便于字符串处理从低地址到高地址。 STD指令可以置“1”DF,CLD指令可以置“0”DF。
系统控制标志:TF、IF共2个。 TF(Trap Flag):陷阱标志。 陷阱标志能够激活芯片上调试功能,以便对程序进行查错和改错。当TF为1时,会使CPU进入单步方式,以进行调试。当TF为0时,则禁止陷阱特性。 在单步方式下,CPU每执行完一条指令之后,就自动产生一个内中断。此时,中断服务程序会显示出CPU各寄存器的内容,程序员通过查看CPU各寄存器以及相关内存变量的内容,可判断出各条指令的执行结果是否正确,从而达到调试的目的。
在MASM6.1x中内嵌的CodeView中就有这样的功能。 没有指令能够对TF进行置1和清0操作。 置1的方法是:首先用PUSHF指令把(FLAGS)推入 堆栈,然后把栈上的TF置1,即执行 ([SP])OR 0100H 操作,然后用POPF指令再弹回FLAGS。 TF清0由中断服务程序负责,方法与置1类似,只是清0执行 ([SP])AND FEFFH 操作。
IF(Interrupt-enable Flag):中断开放标志。 当IF为1时,允许CPU识别并响应可屏蔽的外部中断请求(从CPU的INTR引脚进入)。当IF为0时,禁止这些中断。 IF位的状态不影响非屏蔽外部中断和内中断。指令STI可以对IF进行置1操作,指令CLI可以对IF进行清除操作。
段寄存器: 段寄存器,16位长,共有6个,它们指定了6个当前可寻址的存储器段。 8086 CPU可以使用 代码段寄存器CS(Code Segment)、 数据段寄存器DS(Data Segment)、 堆栈段寄存器SS(Stack Segment)、 附加段寄存器ES(Extra Segment)4个段寄存器。 80386以上的CPU还可以使用另外2个附加段寄存器 FS和GS。
代码段CS: 代码段是一个存储器区域,这里保存CPU所使用的程序代码。 全部指令都从当前代码段中取出,偏移量由指令指针EIP/IP提供。
实地址模式下,CS定义一个64KB存储器段的起点,即CS的内容指向代码段的起始地址,也称代码段的基地址;实地址模式下,CS定义一个64KB存储器段的起点,即CS的内容指向代码段的起始地址,也称代码段的基地址; 保护模式下,CS的内容是一个指针,称之为选择字(selector)。选择字可以选择一个描述代码段起始地址和长度的描述符(descriptor)。 实地址模式下,代码段限制为64KB长;保护模式下,代码段可以达到4GB长。
数据段DS: 数据段是包含指令使用的大部分数据的存储区域。其段内偏移地址按指令的寻址方式的指定,再经计算后得到。 实地址模式下,数据段限制为64KB长; 保护模式下时,数据段可以达到4GB长。
大部分操作数通常是从当前数据段取出,这取决于偏移地址的来源所涉及到的指针。大部分操作数通常是从当前数据段取出,这取决于偏移地址的来源所涉及到的指针。 对于操作数寻址来说,DS是默认段。如果需要从ES、FS、GS中寻址操作数时,可以在指令前面加上跨段前缀。
堆栈段SS: 堆栈段寄存器定义堆栈用的存储区。 其段内偏移地址由ESP/SP、EBP/BP提供。 使用ESP/SP只能寻址栈顶数据,使用EBP/BP可以寻址堆栈段内任意位置上的数据。 在过程调用中,常常利用堆栈传递参数。
附加段ES: 附加段是为字符串操作指令存放目的操作数而附加的一个数据段,也可以用来存放一般的操作数。
FS和GS: 这两个段寄存器与DS、ES一样,可以用来确定数据段,以便把数据段的数量扩展到4个。 因此,CPU可以访问4种不同类型的数据结构。FS和GS仅在80386以上的CPU中才能使用。
实践教学:用MEMORY 1窗口观察DS段中数据的存放方式。 教学设计(2): • 首先介绍实地址模式存储器的大小的概念。 • 以3.3节中的图3.6为依据,介绍字数据和双字数据在内存中的存放规律。 • 以chap3-2.asm为例,启动PWB → 进入CodeView。点Windows → Memory 1,打开Memory 1窗口,验证字数据和双字数据在内存中的存放规律。
4.介绍内存分段管理,逻辑地址、物理地址及其变换4.介绍内存分段管理,逻辑地址、物理地址及其变换 5.以chap3-2.asm为例,启动PWB → 进入CodeView。点Windows → Source 1,打开Source 1窗口,以Assembly方式显示,验证逻辑地址变换为物理地址的方法。 6.介绍3.4节中的段和偏移寄存器之间的隐含关系的概念和3.4节中的保护模式存储器寻址的概念。 7.课堂练习:练习题23。
3.3 实地址模式存储器寻址memory addressing in real address mode 实地址模式存储器寻址操作方式只允许CPU寻址第一个1MB的存储器空间。 其物理地址范围是:00000H~FFFFFH。
3.3.1 实地址模式存储器组织(memory organization in real address mode) 字数据的高位字节总是存放在高地址存储器单元中, 字数据的低位字节总是存放在低地址存储器单元中, 如图3.6所示。
3.3.2 内存的分段管理技术(segment management technology of memory) ※ 在实地址模式下,段基地址的低4位全为0。 ※ 在任意时刻,程序可以访问如下四个段的 内容: 当前代码段CS、当前数据段DS、 当前堆栈段SS、当前附加段ES。 ※ 每个段都会由操作系统指派一个基地址, 基地址是该段在内存空间的起始单元的地址;