222
第 3 第第第第第第第第 教教教教 : 第第第第 第第第第第第 , 第第第第第第第第 第第 第第第第第第第第第第第第 第第第第第第 I/O 第第第第第 教教教教第第第第第第 第第第第第第第第第第第第第第第 第第第 ,, 第第第第第第第第第第第第第第第第第 第第第第第第 第第第第第第 ,一 第第第第第第第第第第第第第第第第第第第第第第 第第 I/O 第 第第第第第

第 3 章教学内容及目标

Embed Size (px)

DESCRIPTION

第 3 章教学内容及目标. 教学内容 : 工作模式,程序设计模型 , 实模式存储器寻址, 段和偏移寄存器之间的隐含关系。堆栈及其实现 、 I/O 口的组织 。 教学目标: 了解工作模式,建立起程序设计模型的基本概念,了解实模式存储器寻址的有关问题的基本概念,以便于为进一步学习汇编语言程序设计打下基础。 能够描述软件堆栈的工作原理,建立 I/O 空间的概念。. 实践教学 : 用 REGISTER 窗口观察 CPU 中各寄存器的 名称与长度, EFLAGS/FLAGS 的位意义。 教学设计 (1): - PowerPoint PPT Presentation

Citation preview

Page 1: 第 3 章教学内容及目标

第 3 章教学内容及目标教学内容 : 工作模式,程序设计模型 , 实模式

存储器寻址,段和偏移寄存器之间的隐含关系。堆栈及其实现、 I/O口的组织。

教学目标:了解工作模式,建立起程序设计模型的基本概念,了解实模式存储器寻址的有关问题的基本概念,以便于为进一步学习汇编语言程序设计打下基础。能够描述软件堆栈的工作原理,建立 I/O空间的概念。

Page 2: 第 3 章教学内容及目标

实践教学 : 用 REGISTER 窗口观察 CPU 中各寄存器的 名称与长度, EFLAGS/FLAGS 的位意义。教学设计 (1):1. 首先介绍“结构”和 3.1 节中三种工作模式的概念。2. 以 3.2 节中的图 3.1 和图 3.2 为依据,介绍程序设

计模型概念: 32 位寄存器、 16 位寄存器和 8 位寄存器。

3. 以 chap3-1.asm 为例,启动 PWB → 进入 CodeView 。点 Windows → Register ,打开 Reg 窗口,介绍 8 位寄存器、 16 位寄存器和 32 位寄存器及其引用方法。

4. 上机时查看 EFLAGS/FLAGS 的方法:在 PWB 下打开帮助内容 → Assembly → Language Overview → Processor Flag Summary 。

Page 3: 第 3 章教学内容及目标

实践教学 : 用 MEMORY 1 窗口观察 DS 段中数据的存放方式。

教学设计 (2):1. 首先介绍实地址模式存储器的大小的概念。2. 以 3.3 节中的图 3.6 为依据,介绍字数据和双

字数据在内存中的存放规律。3. 以 chap3-2.asm 为例,启动 PWB → 进入 C

odeView 。点 Windows → Memory 1 ,打开 Memory 1 窗口,验证字数据和双字数据在内存中的存放规律。

Page 4: 第 3 章教学内容及目标

4. 介绍内存分段管理,逻辑地址、物理地址及其变换5. 以 chap3-2.asm 为例,启动 PWB → 进入 Code

View 。点 Windows → Source 1 ,打开 Source 1 窗口,以 Assembly 方式显示,验证逻辑地址变换为物理地址的方法。

6. 介绍 3.4 节中的段和偏移寄存器之间的隐含关系的概念和 3.4 节中的保护模式存储器寻址的概念。

7. 课堂练习:练习题 23 。

Page 5: 第 3 章教学内容及目标

1. 首先介绍堆栈的两种实现方法和操作方式的概念。

2. 以 3.6.1 节中的图 3.13 和图 3.14 为依据,介绍硬件堆栈的工作过程。

3. 介绍 3.6.2 节中的软件堆栈的概念。 4. 以 3.6.2 节中的图 3.15 、图 3.16 和图 3.17

为依据,介绍软件堆栈的初始化、压栈操作和出栈操作的工作过程。

教学设计 (3):

Page 6: 第 3 章教学内容及目标

5. 以 chap3-3.asm 为例,启动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 16 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 16 位数据压栈操作和出栈操作的工作过程。

Page 7: 第 3 章教学内容及目标

6. 以 chap3-4.asm 为 例 , 启 动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 32 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 32 位数据压栈操作和出栈操作的工作过程。

7. 介绍 3.7 节中的 I/O 口组织的概念。

Page 8: 第 3 章教学内容及目标

第 3 章 IA-32 Intel 系列 CPU 的结构

CPU 的结构指的是从汇编语言程序员的角度所能够感受到的系统属性,诸如寄存器结构、存储器访问技术、指令系统、指令系统所支持的数据类型、 I/O 技术等。

Page 9: 第 3 章教学内容及目标

3.1 工作模式( operating mode )

IA-32 Intel 系列 CPU 支持 3 种工作模式: 保护模式( protected mode )、 实地址模式( real-address mode )、 系统管理模式( system management mod

e )。

Page 10: 第 3 章教学内容及目标

Windows 操作系统环境下使用 CPU 的何种工作模式?

使用保护模式。 在这种模式下,全部的指令与结构特性都

可以使用,处在保护模式下的 Windows 操作系统所使用的存储器模型是“ flat” 。

Page 11: 第 3 章教学内容及目标

在上电( power-up )之后, 32 位 CPU首先进入何种工作模式?

通常,在上电( power-up )或者系统复位( reset )之后, IA-32 Intel 系列 CPU总是首先进入实地址模式,然后再切换到保护模式。

Page 12: 第 3 章教学内容及目标

在实地址模式下, CPU 仅支持与该模式有关的存储器模型,例如“ tiny” 、“ small”…… ,但“ flat” 存储器模型不能用。 CPU 仅能访问 00000H ~ FFFFFH 之间的内存区域。

Page 13: 第 3 章教学内容及目标

3.2 程序设计模型( programming model )

CPU 所具有的程序可见寄存器的组合称

之为程序设计模型。

Page 14: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.1 8086ÓëIA-32 IntelϵÁÐCPUµÄ³ÌÐòÉè¼ÆÄ£ÐÍ

32λ¼Ä´æÆ÷Ãû

16λ¼Ä´æÆ÷Ãû

CS

DS

ES

SS

FS

GS

EAX

EBX

ECX

EDX

ESP

EBP

EDI

EIP

EFLAGS

AX

BX

CX

DX

SP

BP

DI

SI

IP

FLAGS

ESI

Page 15: 第 3 章教学内容及目标

32 位寄存器:通用寄存器: EAX 、 EBX 、 ECX 、 EDX 、 ESP 、 EBP 、 EDI 、 ESI ,共 8 个。指令指针寄存器: EIP 。标志寄存器: EFLAGS 。 “E” : Extensive ,因此上述寄存器称为扩展

寄存器。

Page 16: 第 3 章教学内容及目标

哪些 CPU 能够寻址扩展寄存器? 80386 以上的 CPU 。

段寄存器: CS 、 DS 、 ES 、 SS 、 FS 、 GS , 共 6 个,每个长度为 16 位。

Page 17: 第 3 章教学内容及目标

16 位寄存器:

通用寄存器: AX 、 BX 、 CX 、 DX 、 SP 、 BP 、 DI 、 SI ,共 8 个。指令指针寄存器: IP 。标志寄存器: FLAGS 。

Page 18: 第 3 章教学内容及目标

8 位寄存器:AH 、 AL 、 BH 、 BL 、 CH 、 CL 、 DH 、

DL ,共 8 个,如图 3.2 所示。

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.2 4¸ö16λ¼Ä´æÆ÷ÔÊÐí

ÓÃ×÷8¸ö8λ¼Ä´æÆ÷

BL

AL

DH

CH

BH

AHAX

BX

CX

DX DL

CL

Page 19: 第 3 章教学内容及目标

双字( Double Word )数据: 32 位长,如 32 位寄存器的内容。字( Word )数据: 16 位长,如 16 位寄存器的 内容。字节( Byte )数据: 8 位长,如 8 位寄存器的 内容。

Page 20: 第 3 章教学内容及目标

通用寄存器:

如下表所示。

Page 21: 第 3 章教学内容及目标

寄存器 操 作EAX 偏移地址AX 字乘,字除,字 I/OAL 字节乘,字节除,字节 I/O ,换码, 10 进制算术AH 字节乘,字节除BP 寻址堆栈区( SS 段),指向栈内任意单元

EBX 寻址数据区( DS 段)BX 换码

ECX 在字符串和循环操作中用作计数器CX 在字符串和循环操作中用作计数器CL 在移位和循环操作中用作计数器

EDX 乘,除DX 字乘,字除,间接 I/OESP 堆栈指针寻址堆栈区( SS 段),指向栈顶SP 堆栈指针寻址堆栈区( SS 段),指向栈顶ESI 指向 DS 段中数据的指针,指向源字符串的指针SI 指向 DS 段中数据的指针,指向源字符串的指针

EDI 指向 DS 段中数据的指针,指向目的字符串的指针DI 指向 DS 段中数据的指针,指向目的字符串的指针

表 3.1 通用寄存器的隐含引用

Page 22: 第 3 章教学内容及目标

指令指针 EIP/IP ( Instruction Pointer )寄存器的用途:

※ 工作于实地址模式下的时候,使用 16 位 IP ,※ 工作于保护模式下的时候,使用 32 位的 EI

P 。※ EIP/IP 承担着指令寻址的功能,即 EIP/IP 的内容指向将要执行的下一条指令所

在存储单元的偏移地址,以便于 CPU 可以正确地从内存 CS 段取指令并执行指令。

※ 指令指针由 CPU 的硬件更新。

Page 23: 第 3 章教学内容及目标

EIP/IP 是控制指令(程序)流向的寄存器,下列 5 种情况影响着其内容的更新:

1. 计算机加电之后, CPU 中执行复位( reset )功能的硬件会把 reset 向量打入 IP (此时处于实地址模式下)。此后, CPU 硬件就会从此单元取出第 1条指令执行。这第 1条指令往往是一条无条件转移指令 JMP,转向系统初始化程序段去执行。

2. 在顺序执行指令期间, CPU 硬件会自动增量 EIP/IP 的内容,以便使其指向下条指令的偏移地址。

Page 24: 第 3 章教学内容及目标

3. 在转移执行指令期间,转移类指令会更新 EIP/IP 的内容,使其指向转移目标地址,以便从转移目标处执行。4. 过程调用的时候,指令 CALL 可以更新 EIP/I

P 的内容,使其指向过程的入口地址,以便执行被调用的过程。过程执行完之后,返回地址( CALL 指令的后续指令的地址)打入 EIP/IP ,以便接着从返回地址处继续执行。

5. 当发生中断请求的时候, CPU 的中断管理硬件会把中断向量(中断服务程序的入口地址)打入 IP ,以便执行中断服务程序。中断服务程序执行完之后,断点(返回)地址打入IP ,以便接着从断点处继续执行。

Page 25: 第 3 章教学内容及目标

标志寄存器 EFLAGS/FLAGS 的功能:

用来指示 CPU 的状态,同时也可以控制它的操作。

当 CPU 工作于保护模式下的时候,使用 EFLAGS;当 CPU 工作于实地址模式下的时候,使用 FLAGS 。图 3.3 示出了标志寄存器 EFLAGS 和 FLAGS 及其各个二进制位所代表的意义 。

Page 26: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

Aͼ3.3 FLAGS¼Ä´æÆ÷ºÍEFLAGS¼Ä´æÆ÷

01234567891011121314151617181920212231

FLAGS

EFLAGS

CF1PF0AF0ZFSFTFIFDFOFIOPLNT0RFVMACVIFVIPID

¡«

¡«0 0

Page 27: 第 3 章教学内容及目标

状态标志: CF 、 PF 、 AF 、 ZF 、 SF 、 OF 共 6 个, 这些状态标志位指示着 CPU 执行算术和逻辑指

令操作结果的相应属性。

Page 28: 第 3 章教学内容及目标

各个状态标志的功能如下:CF ( Carry Flag ):进位标志。 当执行算术指令操作结果的最高有效位输出

了进位或借位时, CF 为 1 。否则, CF 为 0 。 该标志在多字节加法和减法中使用。该标志也可以指示无符号数算术操作的溢出状态。循环指令也可以通过把某个内存或寄存器中的位放入 CF而隔离它。

Page 29: 第 3 章教学内容及目标

PF ( Parity Flag ):奇偶校验标志。 如果 PF= 1 ,说明结果的低 8 位中含有偶数个 1 。否则, PF= 0 。

该标志可以用来检查数据传送错误。该标志在现代程序设计中已很少使用,它是早期 Intel CPU 在数据通信环境中校验数据的一种手段。今天,奇偶校验常常由数据通信设备完成,不再需要由 CPU完成。

Page 30: 第 3 章教学内容及目标

AF ( Auxiliary Flag ):辅助标志或半进位标志。

当使用 BCD 码进行算术操作的时候,如果AL 寄存器的位 3 向高位输出了进位或借位,AF 为 1 。否则, AF 为 0 。

使用 BCD 码进行算术操作的指令 DAA 和 DAS要测试此标志位。

Page 31: 第 3 章教学内容及目标

ZF ( Zero Flag ):零标志位。 当执行算术或逻辑指令操作的结果为 0

时, ZF 为 1 。否则, ZF 为 0 。 条件转移类指令常常需要测试此标志位

的状态,以决定是否改变程序的流向。

Page 32: 第 3 章教学内容及目标

SF ( Sign Flag ):符号标志。 该标志位的状态与操作结果最高有效位的状态相同,即当操作结果最高有效位为 1时, SF 为 1 。否则, SF 为 0 。

该标志位可以用来指出带符号整数(用补码表示)运算结果的正 /负情况(最高有效位为 0 时,表示该数为正;最高有效位为 1 时,表示该数为负)。

Page 33: 第 3 章教学内容及目标

OF ( Overflow Flag ):溢出标志。 溢出标志在带符号整数进行加或减操作时

可能出现。如果 OF 为 1 ,说明产生了算术溢出。此种情况意味着有效数字已丢失了,因为计算结果的长度已超出了硬件的表示能力。如果结果为正数太大,或者结果为负数太小时,均会发生溢出。在这种情况下,可利用 INTO 指令产生一个内部中断来处理。

Page 34: 第 3 章教学内容及目标

字符串操作控制标志: 1 个。DF ( Direction Flag ):方向标志。 当 DF 为 1 时,字符串操作指令( MOVS 、

CMPS 、 SCAS 、 LODS 、 STOS )对 DI 和SI 的内容执行自动减量操作,以便于字符串处理从高地址到低地址。当 DF 为 0 时,字符串操作指令对 DI 和 SI 的内容执行自动增量操作,以便于字符串处理从低地址到高地址。

STD 指令可以置“ 1”DF , CLD 指令可以置“ 0”DF 。

Page 35: 第 3 章教学内容及目标

系统控制标志: TF 、 IF 共 2 个。TF ( Trap Flag ):陷阱标志。 陷阱标志能够激活芯片上调试功能,以便对程序进

行查错和改错。当 TF 为 1 时,会使 CPU 进入单步方式,以进行调试。当 TF 为 0 时,则禁止陷阱特性。

在单步方式下, CPU 每执行完一条指令之后,就自动产生一个内中断。此时,中断服务程序会显示出 CPU 各寄存器的内容,程序员通过查看 CPU 各寄存器以及相关内存变量的内容,可判断出各条指令的执行结果是否正确,从而达到调试的目的。

Page 36: 第 3 章教学内容及目标

在 MASM6.1x 中内嵌的 CodeView 中就有这样的功能。 没有指令能够对 TF 进行置 1 和清 0 操作。 置 1 的方法是:首先用 PUSHF 指令把 (FLAGS) 推入堆栈,然后把栈上的 TF置 1 ,即执行 ([SP])OR 0100H 操作,然后用 POPF 指令再弹回 FLAGS 。 TF清 0 由中断服务程序负责,方法与置 1类似,只是清 0 执行

( [SP]) AND FEFFH 操作。

Page 37: 第 3 章教学内容及目标

IF ( Interrupt-enable Flag ):中断开放标志。

当 IF 为 1 时,允许 CPU识别并响应可屏蔽的外部中断请求(从 CPU 的 INTR引脚进入)。当 IF 为 0 时,禁止这些中断。

IF 位的状态不影响非屏蔽外部中断和内中断。指令 STI 可以对 IF 进行置 1 操作,指令 CLI可以对 IF 进行清除操作。

Page 38: 第 3 章教学内容及目标

段寄存器:段寄存器, 16 位长,共有 6 个,它们指定了 6 个当前可寻址的存储器段。

8086 CPU 可以使用代码段寄存器 CS ( Code Segment )、数据段寄存器 DS ( Data Segment )、堆栈段寄存器 SS ( Stack Segment )、附加段寄存器 ES ( Extra Segment ) 4个段寄存器。80386 以上的 CPU还可以使用另外 2 个附加段寄存

器 FS 和 GS 。

Page 39: 第 3 章教学内容及目标

代码段 CS : 代码段是一个存储器区域,这里保存 CP

U 所使用的程序代码。 全部指令都从当前代码段中取出,偏移量

由指令指针 EIP/IP提供。

Page 40: 第 3 章教学内容及目标

实地址模式下, CS定义一个 64KB 存储器段的起点,即 CS 的内容指向代码段的起始地址,也称代码段的基地址;

保护模式下, CS 的内容是一个指针,

称之为选择字( selector )。选择字可以选择一个描述代码段起始地址和长度的描述符( descriptor )。

实地址模式下,代码段限制为 64KB 长;

保护模式下,代码段可以达到 4GB 长。

Page 41: 第 3 章教学内容及目标

数据段 DS : 数据段是包含指令使用的大部分数据的

存储区域。其段内偏移地址按指令的寻址方式的指定,再经计算后得到。

实地址模式下,数据段限制为 64KB 长;

保护模式下时,数据段可以达到 4GB 长。

Page 42: 第 3 章教学内容及目标

大部分操作数通常是从当前数据段取出,这取决于偏移地址的来源所涉及到的指针。

对于操作数寻址来说, DS 是默认段。如果需要从 ES 、 FS 、 GS 中寻址操作数时,可以在指令前面加上跨段前缀。

Page 43: 第 3 章教学内容及目标

堆栈段 SS : 堆栈段寄存器定义堆栈用的存储区。 其段内偏移地址由 ESP/SP 、 EBP/BP提供。 使用 ESP/SP只能寻址栈顶数据,使用 EBP/B

P 可以寻址堆栈段内任意位置上的数据。 在过程调用中,常常利用堆栈传递参数。

Page 44: 第 3 章教学内容及目标

附加段 ES : 附加段是为字符串操作指令存放目的操作

数而附加的一个数据段,也可以用来存放一般的操作数。

Page 45: 第 3 章教学内容及目标

FS 和 GS : 这两个段寄存器与 DS 、 ES 一样,可以

用来确定数据段,以便把数据段的数量扩展到 4个。

因此, CPU 可以访问 4种不同类型的数据结构。 FS 和 GS 仅在 80386 以上的 CPU中才能使用。

Page 46: 第 3 章教学内容及目标

实践教学 : 用 MEMORY 1 窗口观察 DS 段中数据的存放方式。

教学设计 (2):1. 首先介绍实地址模式存储器的大小的概念。2. 以 3.3 节中的图 3.6 为依据,介绍字数据和双

字数据在内存中的存放规律。3. 以 chap3-2.asm 为例,启动 PWB → 进入 C

odeView 。点 Windows → Memory 1 ,打开 Memory 1 窗口,验证字数据和双字数据在内存中的存放规律。

Page 47: 第 3 章教学内容及目标

4. 介绍内存分段管理,逻辑地址、物理地址及其变换5. 以 chap3-2.asm 为例,启动 PWB → 进入 Code

View 。点 Windows → Source 1 ,打开 Source 1 窗口,以 Assembly 方式显示,验证逻辑地址变换为物理地址的方法。

6. 介绍 3.4 节中的段和偏移寄存器之间的隐含关系的概念和 3.4 节中的保护模式存储器寻址的概念。

7. 课堂练习:练习题 23 。

Page 48: 第 3 章教学内容及目标

3.3 实地址模式存储器寻址memory addressing in real address mode

实地址模式存储器寻址操作方式只允许 CPU 寻址第一个 1MB 的存储器空间。

其物理地址范围是: 00000H ~ FFFFFH 。

Page 49: 第 3 章教学内容及目标

3.3.1 实地址模式存储器组织( memory organization in real address mode )

字数据的高位字节总是存放在高地址存储器单元中,字数据的低位字节总是存放在低地址存储器单元中,如图 3.6 所示。

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.6 ×ÖÊý¾Ý5502H´æ´¢ÔÚ

ÄÚ´æµØÖ·724HÖÐ

724H

725H 55H

02H

¡« ¡«

¡« ¡«

Page 50: 第 3 章教学内容及目标

3.3.2 内存的分段管理技术( segment management technology of memory )

※ 在实地址模式下,段基地址的低 4 位全为 0 。※ 在任意时刻,程序可以访问如下四个段的 内容: 当前代码段 CS 、当前数据段 DS 、 当前堆栈段 SS 、当前附加段 ES 。 ※ 每个段都会由操作系统指派一个基地址, 基地址是该段在内存空间的起始单元的地址;

Page 51: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A ͼ3.8 ÎïÀí´æ´¢Æ÷Öжεķֲ¼

50000H

40000H

30000H

20000H

10000H

ÀëÉ¢

ÍêÈ«Öصü

²¿·ÖÖصüÁÚ½Ó

¶Î E

¶Î B

¶Î A

¶Î C ¶Î D

¡« ¡«

¡« ¡«

Page 52: 第 3 章教学内容及目标

3.3.3 逻辑地址与物理地址 物理地址( physical address ):指物理内

存所能够接收的地址信息, CPU 和存储器单元之间的所有信息交换都必须使用物理地址。

逻辑地址( logical address ):所谓逻辑地址是指人们在程序设计时所使用的地址。

Page 53: 第 3 章教学内容及目标

逻辑地址的书写格式:段基地址∶偏移量

偏移量( offset ):是目标单元距离段首址的字节距离。段基地址和偏移量都是无符号的 16 位(二进制)数,段内第一个单元所对应的偏移量为 0H 。

逻辑地址变换为物理地址的方法:

物理地址 =(段基地址)×10H + 偏移量

Page 54: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A ͼ3.12 Âß¼ µØÖ·±ä»»ÎªÎïÀíµØÖ·µÄÑ°Ö··½·¨

10000H

1F000H

1FFFFH

10000H 1000H

F000HÆ«ÒÆÁ¿

¶Î»ùµØÖ· ¶Î¼Ä´æÆ÷

20λÎïÀíµØÖ·1F000H

£«

¡ ¡

¡ ¡

¡« ¡«

¡« ¡«

Page 55: 第 3 章教学内容及目标

在实地址模式下,由于偏移量的长度为 16 位,所以存储器段长为 64KB 。因此,一旦知道段的起始地址,再加上 FFFFH 就可以得到段的结束地址。

表 3.2给出了几个段寄存器的内容及由每个段基地址选择的存储器段的起始地址和结束地址。

Page 56: 第 3 章教学内容及目标

段寄存器的内容 段起始地址 段结束地址

2000H 20000H 2FFFFH

2001H 20010H 3000FH

2100H 21000H 30FFFH

AB00H AB000H BAFFFH

1234H 12340H 2233FH

表 3.2 段寄存器的内容及其所能选择的存储器段的起始地址和结束地址

Page 57: 第 3 章教学内容及目标

3.4 段和偏移寄存器之间的隐含关系 (implied re

lationship between segments and offset registers )

隐含:指的是无须在指令中显式地指明使用何 种组合方式, CPU 的硬件可以自动地按系 统设定的组合方式实现所要求的功能。

Page 58: 第 3 章教学内容及目标

代码段寄存器 CS总是和指令指针 EIP/IP隐含组合,用于寻址程序中的下一条指令。

代码段寄存器 CS 的内容定义代码段的起点,

指令指针 EIP/IP 指示代码段内下条指令的偏移量。

组合 CS∶EIP 或 CS∶IP 寻址 CPU欲执行的下条指令。

例如,如果 CS=1400H , IP=1200H ,则 CPU 从存储器的 14000H+1200H 单元,即 15200H 单元取下一条指令。

Page 59: 第 3 章教学内容及目标

堆栈指令 PUSH/POP 总是在当前堆栈段 SS 进行操作,堆栈指针 ESP/SP含有栈顶的偏移量。

因此,当使用 PUSH/POP 指令访问堆栈的时候,总是使用隐含组合 SS∶ESP或 SS∶SP 。

Page 60: 第 3 章教学内容及目标

另外一类用来访问当前堆栈段 SS 的隐含组合是 SS : EBP 或 SS : BP ,但此时不能使用 PUSH/POP 指令,而要使用 MOV指令。例,如 SS=2000H , BP=3000H ,则如下的 MOV指

令MOV AX , [BP]

可以寻址堆栈段 SS 中的 23000H号存储器单元。

Page 61: 第 3 章教学内容及目标

操作数的有效地址 EA ( Effective Address ): 是指存储器操作数对当前数据段的偏移量。 跨段前缀的用法:告知 CPU哪个段寄存器可用来 访问后续指令中所引用的变量。例如: MOV ES∶[BX], AX

注意,在实地址模式下,只能使用扩展寄存器的最右 16 位寻址存储器段内的某个单元。不能将大于 FFFFH的数放入到偏移寄存器中。

Page 62: 第 3 章教学内容及目标

访问存储器的类型 隐含段基址 可替代的段基址 偏移量

取指令 CS 无 IP

PUSH/POP 堆栈操作

SS 无 SP

存储器变量 DS CS 、 ES 、 SS EA ( 8/16 位数)

源字符串 DS CS 、 ES 、 SS SI

目标字符串 ES 无 DI

MOV堆栈操作 SS CS 、 DS 、 ES EA : BP 、 8/16位数

表 3.3 实地址模式下段寄存器与偏移量之间的组合方式

Page 63: 第 3 章教学内容及目标

访问存储器的类型 隐含段基址 可替代的段基址 偏移量

取指令 CS 无 EIP

堆栈操作 SS 无 ESP

存储器变量 DS CS 、 ES 、 SS EA ( 8/32 位数)

源字符串 DS CS 、 ES 、 SS ESI

目标字符串 ES 无 EDI

MOV堆栈操作 SS CS 、 DS 、 ES EA : EBP 、 8/32 位数

一般数据 FS 无 EA

一般数据 GS 无 EA

表 3.4 保护模式下段寄存器与偏移量之间的组合方式

Page 64: 第 3 章教学内容及目标

3.5 保护模式存储器寻址( memory addressing in protected mode )

对于保护模式存储器寻址操作方式来说,其物理地址范围是:

00000000H ~ FFFFFFFFH , 其存储容量为 4GB 。

Page 65: 第 3 章教学内容及目标

保护模式与实地址模式之间的主要区别有两点:

一是访问段内存储单元所使用的偏移量的长度不同。实地址模式使用 16 位的段内偏移量,因此最大段长为 64KB 。保护模式使用 32 位的段内偏移量,因此最大段长可达 4GB 。

二是段寄存器的使用不同。保护模式下的段基地址不再像实地址模式那样由段寄存器提供,而是改由段描述符( descriptor )提供。

Page 66: 第 3 章教学内容及目标

作业:23. CPU 工作于实地址模式下时,对于下列

寄存器组合,试计算出要寻址的操作数所在的存储单元地址。

( a ) DS∶DI=210DH∶000AH( b) DS∶SI=3D61H∶0F01H( c ) SS∶SP=4D1BH∶00BFH( d ) SS∶BP=6359H∶036BH

Page 67: 第 3 章教学内容及目标

1. 首先介绍堆栈的两种实现方法和操作方式的概念。

2. 以 3.6.1 节中的图 3.13 和图 3.14 为依据,介绍硬件堆栈的工作过程。

3. 介绍 3.6.2 节中的软件堆栈的概念。 4. 以 3.6.2 节中的图 3.15 、图 3.16 和图 3.17

为依据,介绍软件堆栈的初始化、压栈操作和出栈操作的工作过程。

教学设计 (3):

Page 68: 第 3 章教学内容及目标

5. 以 chap3-3.asm 为例,启动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 16 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 16 位数据压栈操作和出栈操作的工作过程。

Page 69: 第 3 章教学内容及目标

6. 以 chap3-4.asm 为 例 , 启 动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 32 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 32 位数据压栈操作和出栈操作的工作过程。

7. 介绍 3.7 节中的 I/O 口组织的概念。

Page 70: 第 3 章教学内容及目标

3.6 堆栈及其实现( stack and it’s implementation )

堆栈的实现有两种方法 : 一种是硬件堆栈, 另一种是软件堆栈。

堆栈最主要的操作方式是 : 按“后进先出 LIFO(Last In First Out)” 的原则,进行存取操作。

Page 71: 第 3 章教学内容及目标

3.6.1 硬件堆栈( hardware stack)

硬件堆栈的实现是: 利用 CPU 中一组专门的寄存器作为堆栈存储

区。

Page 72: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.13 Ó²¼þ¶ÑÕ»µÄÈëÕ»²Ù×÷

¶ÑÕ»

ÀÛ¼ÓÆ÷

1

1

1

2

2

1

2

3

3 8

8

7

6

5

4

3

2

1¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

Õ»¶¥

Õ»µ×

µÚÒ»´ÎÈëÕ»ºó µÚ¶þ´ÎÈëÕ»ºó µÚÈý´ÎÈëÕ»ºó µÚ°Ë´ÎÈëÕ»ºó¡ ¡

Page 73: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.14 Ó²¼þ¶ÑÕ»µÄ³öÕ»²Ù×÷

¶ÑÕ»

ÀÛ¼ÓÆ÷

5

6

7

3

4

5

6 18

7

6

5

4

3

2

1

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

Õ»¶¥

Õ»µ×

µÚÒ»´Î³öÕ»ºó µÚ¶þ´Î³öÕ»ºó µÚÈý´Î³öÕ»ºó µÚ°Ë´Î³öÕ»ºó¡ ¡

4

3

2

1

1

2

Page 74: 第 3 章教学内容及目标

3.6.2 软件堆栈( software stack) 软件堆栈 : 位于内存中。 软件堆栈的特点: 软件堆栈的栈顶地址是浮动的,即栈顶相对于数据移动,而不采用数据移动的方法。

        

Page 75: 第 3 章教学内容及目标

段寄存器 SS 的功能: 存放堆栈段的基地址。栈指针 SP 的功能: 堆栈指针 SP 指向栈顶单元,即 SP 中含有堆栈的栈顶地址偏移量,换句话说,SP 中含有栈顶距离堆栈段基地址之间的字节距离。

Page 76: 第 3 章教学内容及目标

IA-32 Intel 系列 CPU 中软件堆栈的生成方法: 按自底向上的方式生成,此时栈底地址大于

栈顶地址。堆栈的初始化操作: 以图 3.15 为例。在应用程序装入内存之后,

堆栈初始化操作即完成。 此时,( SP ) =000AH , (SS)=1D7AH 。 堆栈的状态如图 3.15 所示。 (设置好了 10 个字节大的堆栈区。此时,堆

栈中还没压入内容,此时,栈顶与栈底重合)。

Page 77: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.15 ³õʼ»¯ºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£© Õ»¶¥µØÖ·=Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

¶ÑÕ»³¤¶È

10¸öµ¥Ôª

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

X X

X X

X X

X X

X X

X X

X X

X X

X X

X X

Page 78: 第 3 章教学内容及目标

入栈操作: 先把 SP 的内容减 2 ,然后写一个字数

据到新的栈顶。 此处假设有 10A0H 、 20B0H 、 30C0H 、40D0H 等 4个字数据,使用 PUSH 指令把它们压入堆栈之后, SP 的内容由原来的 0AH减小到了 02H ,堆栈的状态如图 3.16所示。

Page 79: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.16 ѹÈë4¸ö×ÖÊý¾ÝºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£©

Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

4¸ö×ÖÊý¾Ý

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

1 0

A 0

2 0

B 0

3 0

C 0

4 0

D 0

X X

X X

Õ»¶¥µØÖ·

Page 80: 第 3 章教学内容及目标

出栈操作: 先把栈顶的字复制到寄存器中,然后再把 SP 的内容加 2 。

此处假设使用 POP 指令,把已在堆栈中的字数据 40D0H 和 30C0H弹出堆栈之后, SP 的内容由原来的 02H增加到了 06H ,堆栈的状态如图 3.17所示。

Page 81: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.17 µ¯³ö2¸ö×ÖÊý¾ÝºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£©

Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

2¸ö×ÖÊý¾Ý

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

1 0

A 0

2 0

B 0

X X

X X

X X

X X

X X

X X

Õ»¶¥µØÖ·

Page 82: 第 3 章教学内容及目标

软件堆栈的四种应用:

一是当需要利用堆栈临时保存某些数据的时候,

程序员可以在程序中设置 PUSH 和 POP 指令,以实现对堆栈的操作;

二是当调用过程的时候,需要利用堆栈保存返回地址,此操作由调用过程的指令 CALL 和返回指令 RET 共同完成;

Page 83: 第 3 章教学内容及目标

三是在调用过程以前,用 PUSH 指令把过程所需要的参数压入堆栈,进入过程后用 BP的内容通过寄存器相对寻址取出参数;

四是当有中断请求发生并被 CPU 响应之后,CPU 中的中断管理硬件会自动地把现场信息(即 CPU 中寄存器的内容)压入堆栈,中断服务完成之后,用 IRET 指令恢复现场信息。

Page 84: 第 3 章教学内容及目标

3.7 I/O 口的组织( I/O port organization )

   计算机中对 I/O端口的编址一般有两种方式:

I/O 口与内存单元统一编址;

I/O 口与内存单元编址独立。

IA-32 计算机中采用后者。

Page 85: 第 3 章教学内容及目标

I/O 口与内存单元统一编址 : 把每个 I/O 口都看作一个内存单元,每个 I

/O 口都有一个唯一的存储地址。 在采用统一编址的计算机系统中,不需要

设置专门的 I/O 指令,使用访问内存的指令也可以访问 I/O 口。

统一编址的好处是 I/O速度相对较快,缺点是 I/O 口地址要占用内存地址空间。 POWER PC采用统一编址的方法。

Page 86: 第 3 章教学内容及目标

   I/O 口与内存单元独立编址 : 把存储空间与 I/O 口空间完全分离,既

有存储空间又有 I/O空间。 在采用独立编址的计算机系统中,通常

都设有专门的 I/O 指令。这样,访问内存单元时,使用访问内存的指令;访问 I/O口时,使用访问 I/O 口的指令。

IA—32 Intel 计算机采用独立编址的方法。

Page 87: 第 3 章教学内容及目标

I/O空间可以容纳 64K的 8 位口或 32K的 16 位口。

I/O 指令包括 IN和 OUT 指令两类: IN指令数据传送方向: 数据从外围设备传送到 CPU 。 OUT指令数据传送方向: 数据从 CPU传送到外围设备。

Page 88: 第 3 章教学内容及目标

IN指令和 OUT指令及其寻址方式列于表 3.5中。

表 3.5 IN指令和 OUT 指令及其寻址方式直接寻址( 1 字节直接地址) DX 寄存器间接寻址

IN AL , 0EAH IN AX , DX

OUT 44 , AX OUT DX , AL

Page 89: 第 3 章教学内容及目标

1 、以 chap3-3.asm 为例,启动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 16 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 16 位数据压栈操作和出栈操作的工作过程。

上机验证:

Page 90: 第 3 章教学内容及目标

2. 以 chap3-4.asm 为 例 , 启 动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 32 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 32 位数据压栈操作和出栈操作的工作过程。

Page 91: 第 3 章教学内容及目标

上机实践:1. 以 chap3-2.asm 为例,启动 PWB → 进

入 CodeView 。点 Windows → Memory 1 ,打开 Memory 1 窗口,验证字数据和双字数据在内存中的存放规律。

2. 以 chap3-2.asm 为例,启动 PWB → 进入 CodeView 。点 Windows → Source 1 ,打开 Source 1 窗口,以 Assembly 方式显示,验证逻辑地址变换为物理地址的方法。

Page 92: 第 3 章教学内容及目标

本课程特点及学习方法特点:本课程知识点前后交叉,学习前面

的内容时,有时要涉及到后面未学习到的知识,可先作基本了解,到学习了后面的知识后就会更加深入地理解了。

方法:理解与记忆硬件理论,用汇编语言观察硬件动作行为以帮助理解硬件理论。

Page 93: 第 3 章教学内容及目标

课程内容(约两次课完成)3.1.2 汇编语言源程序的结构( P36 )3.1.3 伪指令( P39 )

作业:P68: 1-24 题。

(除操作题要会操作外,其它题写到作业本上)

Page 94: 第 3 章教学内容及目标

汇编语言源程序的结构 1 、 三种指令: 可执行指令(符号指令); 伪指令; 宏指令。 实质上:可执行指令、 伪指令 。 (看书 5 分钟,找答案,回答、讨论。)

Page 95: 第 3 章教学内容及目标

.model small ;select the model for memory .386 ;select 80386 cpu .stack 20h ;define the size of stack .data data1 dword 01020300dh,0h data2 byte 10h dup(0) .code start: mov ax, @data ;initialize data segment mov ds, ax lea si, data1 lea di, data2 transfer: mov ebx, [si] mov [di], ebx add si, 4 ;add 4 to si add di, 4 cmp bl, 0dh jz finished jmp transfer ;jump to transfer finished: nop .exit end start ;the source program is over

Page 96: 第 3 章教学内容及目标

2 、三部分: 头部、可执行指令、尾部。

(看书 5 分钟,找答案,回答、讨论。)

Page 97: 第 3 章教学内容及目标

3 、汇编语言行分四个字段: 名字字段、操作码字段、操作数字段、注释字段。

(看书 5 分钟,找答案,回答、讨论、总结)

Page 98: 第 3 章教学内容及目标

伪指令 1 、 CPU选择伪指令 2 、 .MODEL伪指令 3 、 END伪指令 4、段定义伪指令 * 5 、 .STARTUP伪指令 6 、 .EXIT伪指令 7、 ORG伪指令 8 、 $操作符 9、 PTR 操作符 10 、 EQU伪指令

Page 99: 第 3 章教学内容及目标

本次课程目标 初步了解存储器的分段管理,从而理解段定义伪指令的作用;学会通过观察段寄存器 CS 、 DS 、SS 、( ES )得知段的分配情况;

初步了解不同数据定义伪指令的作用,了解内存中数据段数据的存放情况;

初步掌握查看内存中不同段不同的存储单元的内容的方法;

初步掌握程序单步运行方法,及观察每次单步运行后如何观察运行结果。

进一步熟悉汇编语言源程序的编辑、汇编、链接成可执行文件的过程,及汇编语言源程序的结构。

Page 100: 第 3 章教学内容及目标

存储器结构 实地址模式下: 存储器地址空间: 00000H —— FFFFFH 。 1MB空间 如下图示。

Page 101: 第 3 章教学内容及目标

1. 存储器典型结构

2. 存储器的基本操作 对于 RAM 来讲,可读可写

对于 ROM 来讲,只能读

Page 102: 第 3 章教学内容及目标

存储器分段管理 段基地址:偏移地址 (16bit) (16bit) CS 其他寄存器 代码段 DS 数据段 SS 堆栈段 ES 附加数据

段 每段最大 64K个单元( 64KB )

Page 103: 第 3 章教学内容及目标

逻辑地址与实际地址逻辑地址: 00000H —— FFFFFH

实际地址(物理地址): 段基地址:偏移地址

Page 104: 第 3 章教学内容及目标

调试例 3.2 、观察内存 编辑、汇编、链接并调试例 3.2 ,观察内

存的逻辑地址和实际地址。

Page 105: 第 3 章教学内容及目标

.modelsmall .data DATA1 DB 1,2,3 ; 定义字节 DB 45H ; 十六进制数 DB 'A' ; A 的 ASCII 码 DATA2 DW 12,13 ; 定义字 DW DATA2 ; 存储 DATA2 的偏移量 DW 2345H ; 十六进制数 DATA3 DD 300H ; 十六进制数 ORG $+4 ; 跳过 4个地址 LISTA DB ? ; 保留一个字节 LISTB DB 10 DUP(?) ;保留十个字节 LISTC DW 100H DUP(9) ;字数组 LIST9 DD 22 DUP(?) ; 双字数组 SIXES DB 100 DUP(6) ;字节数组 .code start: mov ax,@data mov ds,ax nop .exit end start

例 3.2

Page 106: 第 3 章教学内容及目标

段定义伪指令 .data ;定义数据段 .stack xxh ;定义堆栈段 .code ;定义代码段

(注:是数据段还是附加数据段,还需通过给 DS 或 ES 的赋值指令确定。 P43 )

通过调试例 3.2, 观察各段分配情况。

Page 107: 第 3 章教学内容及目标

数据定义伪指令 表 3.6 ( P41 ) DB DW DD

读例 3.2 ,学习数据定义伪指令,并在 Codeview 下观察对应的内存单元中数据。

Page 108: 第 3 章教学内容及目标

.model small ;select the model for memory

.386 ;select 80386 cpu .stack 20h ;define the size of stack .data data1 byte 10h dup(0) .code start: mov ax, @data ;initialize data segment mov ds, ax lea si, data1 mov byte ptr [si], 23 inc si mov word ptr [si], 23 add si, 2 ;add 2 to si mov dword ptr [si], 23 .exit end start ;the source program is over

例 3.3

Page 109: 第 3 章教学内容及目标

例 3.4 .model small ;select the model for memor

y nine equ 9 ten equ 10 .code start: mov al,nine add al,ten .exit end start ;the source program is over

Page 110: 第 3 章教学内容及目标

作业继续 P69: 1-24题。

Page 111: 第 3 章教学内容及目标

本次课程内容及目标教学内容:3.2 IA-32 CPU 的工作模式3.3 IA-32 CPU 的程序设计模型实践教学 : 实验 3 ,用 REGISTER 窗口观察 CPU 中各寄存器的名称与长度, EFLAGS/FLAGS 的位意义。教学目标:了解工作模式,建立程序设计模型的基本概念。作业:P68: 25-42 题。(除操作题要会操作外,其它题写到作业本上)

Page 112: 第 3 章教学内容及目标

本次课程内容及目标教学内容:3.4 实地址模式存储器寻址

实践教学 : 实验, exp3-2, 用 MEMORY1 窗口观察 DS 段中数据存放方式。教学目标:了解实模式存储器寻址的有关问题的基本概念,以便于为进一步学习汇编语言程序设计打下基础。作业: P70: 43-57 题。(除操作题要会操作外,其它题写到作业本上)

Page 113: 第 3 章教学内容及目标

教学设计 : 1. 首先介绍实地址模式存储器的大小的概念。 2. 以图 3.6 ,介绍字数据和双字数据在内存

中的存放规律。 3. 以 exp3-2.asm 为例,启动 PWB → 进入

CodeView 。 点 Windows → Memory 1 ,打开 Memory 1 窗口,验证字数据和双字数据在内存中的存放规律。

Page 114: 第 3 章教学内容及目标

4. 介绍内存分段管理,逻辑地址、物理地址及其变换。

5. 以 chap3-2.asm 为 例 , 启 动 PWB → 进入 CodeView 。点 Windows → Source 1 ,打开 Source 1 窗口,以 Assembly 方式显示,验证逻辑地址变换为物理地址的方法。

6. 介绍段和偏移寄存器之间的隐含关系的概念。

7. 课堂练习:练习题 53 。

Page 115: 第 3 章教学内容及目标

3.4 实地址模式存储器寻址memory addressing in real address mode 实地址模式存储器寻址操作方式只允许 CPU

寻址第一个 1MB 的存储器空间。 其物理地址范围是: 00000H ~ FFFFFH 。 CPU只需要使用 20条地址线( A0-A19)即

可。 实地址模式存储器组织(实验) 内存的分段管理技术 逻辑地址与物理地址(实验)

Page 116: 第 3 章教学内容及目标

实地址模式存储器组织( memory organization in real address mode )

字数据的高位字节总是存放在高地址存储器单元中, 字数据的低位字节总是存放在低地址存储器单元中, 如下图所示。

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.6 ×ÖÊý¾Ý5502H´æ´¢ÔÚ

ÄÚ´æµØÖ·724HÖÐ

724H

725H 55H

02H

¡« ¡«

¡« ¡«

Page 117: 第 3 章教学内容及目标

实验: 编辑、汇编、链接、调试 Exp3-2 : • 用 MEMORY 1 窗口观察 DS 段中数

据的存放方式。

Page 118: 第 3 章教学内容及目标

内存的分段管理技术( segment management technology of memory ) ※ 对内存采用分段管理的技术;※ 实地址模式下,任意时刻最多可以分为四个

段,即:当前代码段、当前数据段、当前堆栈段、当前附加段。

※ 每个段都会由操作系统指派一个基地址, 基地址是该段在内存空间的起始单元的地址; 实地址模式下,段的划分要求段基地址的低 4

位全为 0 。

Page 119: 第 3 章教学内容及目标

※ 四个段的段基址的前 4 位 16 进制分别置于四个段寄存器中,

它们是:代码段寄存器 CS 、数据段寄存器 DS 、

堆栈段寄存器 SS 、附加段寄存器 ES 。※ 每个段的最大长度为 64KB 。所以对段

内的存储单元的寻址需要用一个 16 位二进制地址实现,这个地址被称为偏移地址。

Page 120: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A ͼ3.8 ÎïÀí´æ´¢Æ÷Öжεķֲ¼

50000H

40000H

30000H

20000H

10000H

ÀëÉ¢

ÍêÈ«Öصü

²¿·ÖÖصüÁÚ½Ó

¶Î E

¶Î B

¶Î A

¶Î C ¶Î D

¡« ¡«

¡« ¡«

Page 121: 第 3 章教学内容及目标

逻辑地址与物理地址

物理地址( physical address ): 指物理内存所能够接收的地址信息, CP

U 和存储器单元之间的所有信息交换都必须使用物理地址,实地址模式下,物理地址是用 20 位二进制(或 5 位 16 进制)表示的。

逻辑地址( logical address ): 所谓逻辑地址是指人们在程序设计时所

使用的地址。

Page 122: 第 3 章教学内容及目标

逻辑地址的书写格式: 段基址∶偏移量

偏移量( offset ): 又称为偏移地址,是目标单元距离

段基址(段首单元地址)的字节距离。段基址和偏移量都是无符号的 16 位(二进制)数,段内第一个单元所对应的偏移量为 0H 。

逻辑地址变换为物理地址的方法: 物理地址 =(段基地址)×10H + 偏移量

Page 123: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A ͼ3.12 Âß¼ µØÖ·±ä»»ÎªÎïÀíµØÖ·µÄÑ°Ö··½·¨

10000H

1F000H

1FFFFH

10000H 1000H

F000HÆ«ÒÆÁ¿

¶Î»ùµØÖ· ¶Î¼Ä´æÆ÷

20λÎïÀíµØÖ·1F000H

£«

¡ ¡

¡ ¡

¡« ¡«

¡« ¡«

Page 124: 第 3 章教学内容及目标

实地址模式下,是通过 CPU 内部硬件自动完成由逻辑地址到物理地址的转换的。

参见图 3.12 (P57)。

Page 125: 第 3 章教学内容及目标

在实地址模式下,由于偏移量的长度为 16位二进制,所以存储器段长为 64KB 。知道段的起始地址,再加上 FFFFH 就可以得到段的结束地址。

段寄存器的内容 段起始地址 段结束地址

2000H 20000H 2FFFFH

2001H 20010H 3000FH

2100H 21000H 30FFFH

AB00H AB000H BAFFFH

1234H 12340H 2233FH

Page 126: 第 3 章教学内容及目标

实验 以 chap3-2.asm 为例,启动 PWB

→ 进入 CodeView 。点 Windows → Source 1 ,打开 Source 1 窗口,以 Assembly 方式显示,验证逻辑地址变换为物理地址的方法。

Page 127: 第 3 章教学内容及目标

3.5 段和偏移寄存器之间的隐含关系 (implied rel

ationship between segments and offset registers )

隐含:指的是无须在指令中显式地指明使用何

种组合方式, CPU 的硬件可以自动地按系

统设定的组合方式实现所要求的功能。

Page 128: 第 3 章教学内容及目标

CS 和 EIP/IP 隐含组合, 用于寻址程序中的下一条指令: CS 的定义代码段的起点, EIP/IP 指示代码段

内下条指令的偏移量。 CS∶EIP 或 CS∶IP 寻址 CPU欲执行的下条

指令。

Page 129: 第 3 章教学内容及目标

例如, 如果 CS=1400H , IP=1200H ,则 C

PU 从存储器的 14000H+1200H 单元,即15200H 单元取下一条指令。

Page 130: 第 3 章教学内容及目标

当使用 PUSH/POP 指令访问堆栈的时候,总是使用隐含组合:

SS∶ESP 或 SS∶SP

Page 131: 第 3 章教学内容及目标

另外一类用来访问当前堆栈段 SS 的隐含组合是:

SS : EBP 或 SS : BP , 但此时不能使用 PUSH/POP 指令,而要使用

MOV指令。

Page 132: 第 3 章教学内容及目标

例如: SS=2000H , BP=3000H ,则如下的 MOV

指令 MOV AX , [BP]

可以寻址堆栈段 SS 中的 23000H 号存储器单元。

Page 133: 第 3 章教学内容及目标

访问存储器的类型 隐含段基址 可替代的段基址 偏移量

取指令 CS 无 IP

PUSH/POP 堆栈操作

SS 无 SP

存储器变量 DS CS 、 ES 、 SS EA ( 8/16 位数)

源字符串 DS CS 、 ES 、 SS SI

目标字符串 ES 无 DI

MOV堆栈操作 SS CS 、 DS 、 ES EA : BP 、 8/16位数

表:实地址模式下段寄存器与偏移量之间的组合方式

Page 134: 第 3 章教学内容及目标

练习( P70 ): 53. CPU 工作于实地址模式下时,对于下列寄存

器组合,试计算出要寻址的操作数所在的存储单元地址。

( a ) DS∶DI=210DH∶000AH ( b) DS∶SI=3D61H∶0F01H ( c ) SS∶SP=4D1BH∶00BFH ( d ) SS∶BP=6359H∶036BH

Page 135: 第 3 章教学内容及目标

教学设计: 1. 简介三种工作模式。 2. 以图 3.1 和图 3.2 ,介绍程序设计模型概念:

32 位寄存器、 16 位寄存器和 8 位寄存器。 3. 以实验 3 为例,启动 PWB → 进入 CodeView 。

点 Windows → Register ,打开 Reg 窗口,介绍 8位寄存器、 16 位寄存器和 32 位寄存器及其引用方法。

4. 上机学习 EFLAGS/FLAGS 的方法:在 PWB 下打开帮助内容 → Assembly → Language Overview → Processor Flag Summary 。

Page 136: 第 3 章教学内容及目标

3.2 IA-32CPU 的工作模式 ( operating mode )

IA-32 Intel 系列 CPU 支持 3 种工作模式: 保护模式( protected mode )、 实地址模式( real-address mode )、 系统管理模式 SMM ( system management

mode )。

Page 137: 第 3 章教学内容及目标

CPU 所处的工作模式不同,能够使用的指令、存储器模式及其他的结构特性也不同:

保护模式下: 全部的指令和结构特性均能使用; 可以使用任何的存储类型; CPU 可以访问 4GB 或 64GB 的内存区域。

Page 138: 第 3 章教学内容及目标

实地址模式下: IA-32CPU 以 16 位的 CPU运行,与独立的

16 位的 CPU 不同的是,它允许使用 32 位的寄存器;

此时“ flat” 存储器模型不能用; CPU 仅能访问 00000H—FFFFFH 之间的内

存区域(即最低地址区域的 1MB )。

Page 139: 第 3 章教学内容及目标

系统管理模式: 当外部系统管理中断引脚信号 SMI被激活

的时候, CPU就会进入系统管理模式; 此时, CPU 存储当前正在运行任务的全部现场并转去执行系统管理中断程序,可以进行电源管理、系统硬件管理、系统安全管理等;

在该程序结束时执行 RSM 指令从系统管理模式返回, CPU恢复系统管理中断发生前的状态。

Page 140: 第 3 章教学内容及目标

Q1 : Windows 操作系统环境下使用 CPU的何种工作模式?

使用保护模式。 在这种模式下,全部的指令与结构特性都

可以使用,处在保护模式下的 Windows 操作系统所使用的存储器模型是“ flat” 。

Page 141: 第 3 章教学内容及目标

Q2 :在上电( power-up )之后, 32 位 CPU 首先进入何种工作模式?

通常,在上电( power-up )或者系统复位( reset )之后, IA-32 Intel 系列 CPU 总是首先进入实地址模式,然后再由程序切换到保护模式。

Page 142: 第 3 章教学内容及目标

3.3 IA-32 CPU 的程序设计模型( programming model ) Q3 :何谓程序设计模型: CPU 所具有的程序可见寄存器的组合称

之为程序设计模型。 在用汇编语言进行程序设计的时候,允许利用符号指令引用 CPU 所具有的程序可见寄存器。

Page 143: 第 3 章教学内容及目标

IA-32 CPU 的程序设计模型 概述; 通用寄存器; 实验 指令指针寄存器; 标志寄存器; 段寄存器; 实验

Page 144: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

Aͼ3.1 8086ÓëIA-32 IntelϵÁÐCPUµÄ³ÌÐòÉè¼ÆÄ£ÐÍ

×¢£ºFS¡¢GSºÍ¿Õ°×ÇøÓòµÄ¼Ä´æÆ÷Ö»´æÔÚÓÚIA-32 IntelϵÁÐCPUÖÐ

32λ¼Ä´æÆ÷Ãû

16λ¼Ä´æÆ÷Ãû

CS

DS

ES

SS

FS

GS

EAX

EBX

ECX

EDX

ESP

EBP

EDI

EIP

EFLAGS

AX

BX

CX

DX

SP

BP

DI

SI

IP

FLAGS

ESI

概述

Page 145: 第 3 章教学内容及目标

32 位寄存器: 通用寄存器: EAX 、 EBX 、 ECX 、 EDX 、 ESP 、 EBP 、 EDI 、 ESI ,共 8 个。 指令指针寄存器: EIP 。 标志寄存器: EFLAGS 。 注:“ E”——“ 扩展( Extensive )”,因此上

述寄存 器称为扩展寄存器。

Page 146: 第 3 章教学内容及目标

Q4 :哪些 CPU 能够寻址扩展寄存器 : 80386 以上的 CPU 。

Page 147: 第 3 章教学内容及目标

16 位寄存器:

通用寄存器: AX 、 BX 、 CX 、 DX 、 SP 、 BP 、 DI 、 SI ,共 8 个。 指令指针寄存器: IP 。 标志寄存器: FLAGS 。 段寄存器: CS 、 DS 、 ES 、 SS 、 FS 、

GS ( 6 个段寄存器均为 16 位的)

Page 148: 第 3 章教学内容及目标

8 位寄存器: AH 、 AL 、 BH 、 BL 、 CH 、 CL 、 DH 、

DL , 共 8 个,如图 3.2 所

示。

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.2 4¸ö16λ¼Ä´æÆ÷ÔÊÐí

ÓÃ×÷8¸ö8λ¼Ä´æÆ÷

BL

AL

DH

CH

BH

AHAX

BX

CX

DX DL

CL

Page 149: 第 3 章教学内容及目标

注意:双字( Double Word )数据: 32 位长,如 32 位寄存器的内容。 字( Word )数据: 16 位长,如 16 位寄存器的内容。 字节( Byte )数据: 8 位长,如 8 位寄存器的内容。

Page 150: 第 3 章教学内容及目标

通用寄存器 8个 32 位的通用寄存器: EAX 、 EBX 、 ECX 、 EDX 、 ESP 、 EBP 、 EDI 、 E

SI; 8个 16 位的通用寄存器: AX 、 BX 、 CX 、 DX 、 SP 、 BP 、 DI 、 SI; 8个 8 位通用寄存器: AH 、 AL 、 BH 、 BL 、 CH 、 CL 、 DH 、

DL 。

Page 151: 第 3 章教学内容及目标

通用寄存器除了可以在大多数的指令中作为通用目的的使用外,还常常赋予它们一些专门的用途,称为通用寄存器的隐含使用。

Page 152: 第 3 章教学内容及目标

通用寄存器的隐含( implied )使用是指:

有些引用通用寄存器的指令中,不必显式地指出所引用的通用寄存器名, CPU的硬件可以自动地找到它。

如下表 3.7所示。

Page 153: 第 3 章教学内容及目标

寄存器 操 作EAX 偏移地址AX 字乘,字除,字 I/OAL 字节乘,字节除,字节 I/O ,换码, 10 进制算术AH 字节乘,字节除BP 寻址堆栈区( SS 段),指向栈内任意单元

EBX 寻址数据区( DS 段)BX 换码

ECX 在字符串和循环操作中用作计数器CX 在字符串和循环操作中用作计数器CL 在移位和循环操作中用作计数器

EDX 乘,除DX 字乘,字除,间接 I/OESP 堆栈指针寻址堆栈区( SS 段),指向栈顶SP 堆栈指针寻址堆栈区( SS 段),指向栈顶ESI 指向 DS 段中数据的指针,指向源字符串的指针SI 指向 DS 段中数据的指针,指向源字符串的指针

EDI 指向 DS 段中数据的指针,指向目的字符串的指针DI 指向 DS 段中数据的指针,指向目的字符串的指针

表 3.7 通用寄存器的隐含引用

Page 154: 第 3 章教学内容及目标

一些通用寄存器的特有名称:累加器: AX / EAX 基址寄存器: BX / EBX 计数器寄存器: CX / ECX 数据寄存器: DX / EDX 堆栈指针寄存器: SP / ESP 基址指针寄存器: BP / EBP 源变址寄存器: SI / ESI 目的变址寄存器: DI / EDI

Page 155: 第 3 章教学内容及目标

实验: 完成实验 3 中的一部分: 认识 IA-32 CPU 程序设计模型 (见 实验 3.doc),

通过 REGISTER 窗口观察 CPU 中各寄存器的名称与长度。

Page 156: 第 3 章教学内容及目标

指令指针 EIP/IP 寄存器( Instruction Pointer )

※ 工作于实地址模式下的时候,使用 16 位 IP , ※ 工作于保护模式下的时候,使用 32 位的 EIP 。 ※ EIP/IP 承担着指令寻址的功能: EIP/IP 的内容指向将要执行的下一条指令所

在存储单元的偏移地址,以便于 CPU 可以正确地从内存 CS 段取指令并执行指令。

※ 指令指针由 CPU 的硬件更新。

Page 157: 第 3 章教学内容及目标

EIP/IP 是控制指令(程序)流向的寄存器,下列 5种情况影响着其内容的更新:

1. 加电后或 CPU 复位后,硬件会自动将 FFFF0H值赋予指令指针(此时处于实地址模式下)。此后, CPU就会从此单元取出第 1条指令执行。这第 1条指令往往是一条无条件转移指令 JMP,转向系统初始化程序段去执行。

2. 在顺序执行指令期间, CPU 硬件会自动增量 EIP/IP 的内容,以便使其指向下条指令的偏移地址。

Page 158: 第 3 章教学内容及目标

3. 在转移执行指令期间,转移类指令会更新 EIP/IP的内容,使其指向转移目标地址,以便从转移目标处执行。

4. 过程调用的时候,指令 CALL 可以更新 EIP/IP 的内容,使其指向过程的入口地址,以便执行被调用的过程。过程执行完之后,返回地址( CALL 指令的后续指令的地址)打入 EIP/IP ,以便接着从返回地址处继续执行。

5. 当发生中断请求的时候, CPU 的中断管理硬件会把中断服务程序的入口地址打入 IP ,以便执行中断服务程序。中断服务程序执行完之后,断点(返回)地址打入 IP ,以便接着从断点处继续执行。

Page 159: 第 3 章教学内容及目标

标志寄存器 EFLAGS/FLAGS用来指示 CPU 的状态,同时也可以控制它的操作。CPU 工作于保护模式下的时候,使用 EFLAGS;CPU 工作于实地址模式下的时候,使用 FLAGS 。 分为:状态标志;

字符串操作控制标志; 系统控制标志。

Page 160: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

Aͼ3.3 FLAGS¼Ä´æÆ÷ºÍEFLAGS¼Ä´æÆ÷

01234567891011121314151617181920212231

FLAGS

EFLAGS

CF1PF0AF0ZFSFTFIFDFOFIOPLNT0RFVMACVIFVIPID

¡«

¡«0 0

标志寄存器 EFLAGS/FLAGS

Page 161: 第 3 章教学内容及目标

状态标志: CF 、 PF 、 AF 、 ZF 、 SF 、 OF 共 6 个, 指示着 CPU 执行算术和逻辑指令操作结果的相应属性。

Page 162: 第 3 章教学内容及目标

CF ( Carry Flag ):进位标志。 当执行算术指令操作结果的最高有效位输出

了进位或借位时, CF 为 1;否则, CF 为 0 。

Page 163: 第 3 章教学内容及目标

PF ( Parity Flag ):奇偶校验标志。 PF= 1 ,说明结果的低 8 位中含有偶

数个 1;否则, PF= 0 。

Page 164: 第 3 章教学内容及目标

AF ( Auxiliary Flag ):辅助标志或半进位标志。

一般在 BCD 码算术操作时使用,如果 AL 寄

存器的位 3 向高位输出了进位或借位, AF 为1 。否则, AF 为 0 。

Page 165: 第 3 章教学内容及目标

ZF ( Zero Flag ):零标志位。 当执行算术或逻辑指令操作的结果为 0

时, ZF 为 1 。否则, ZF 为 0 。 条件转移类指令常常需要测试此标志位

的状态,以决定是否改变程序的流向。

Page 166: 第 3 章教学内容及目标

SF ( Sign Flag ):符号标志。 该标志位的状态与操作结果最高有效位的状态相同,即当操作结果最高有效位为 1 时, SF为 1 。否则, SF 为 0 。

该标志位可以用来指出带符号整数(用补码表示)运算结果的正 /负情况(最高有效位为0 时,表示该数为正;最高有效位为 1 时,表示该数为负)。

Page 167: 第 3 章教学内容及目标

OF ( Overflow Flag ):溢出标志。 溢出标志在带符号整数进行加或减操作

时可能出现。 如果 OF 为 1 ,说明产生了算术溢出。此种情况意味着有效数字已丢失了,因为计算结果的长度已超出了硬件的表示能力。

如果结果为正数太大,或者结果为负数太小时,均会发生溢出。

Page 168: 第 3 章教学内容及目标

字符串操作控制标志: DF DF ( Direction Flag ):方向标志。 当 DF 为 1 时,字符串操作指令( MOVS 、 CMP

S 、 SCAS 、 LODS 、 STOS )对 DI 和 SI 的内容执行自动减量操作,以便于字符串处理从高地址到低地址。

当 DF 为 0 时,字符串操作指令对 DI 和 SI 的内容执行自动增量操作,以便于字符串处理从低地址到高地址。

STD 指令可以置“ 1”DF , CLD 指令可以置“ 0”DF 。

Page 169: 第 3 章教学内容及目标

系统控制标志: TF 、 IF 。 TF ( Trap Flag ):陷阱标志。 当 TF 为 1 时,会使 CPU 进入单步方式,

以进行调试; 当 TF 为 0 时,则禁止陷阱特性。

Page 170: 第 3 章教学内容及目标

IF ( Interrupt-enable Flag ): 中断开放标志。

当 IF 为 1 时,允许 CPU识别并响应可屏蔽的外部中断请求(从 CPU 的 INTR引脚进入)。当 IF 为 0 时,禁止这些中断。

指令 STI 可以对 IF 进行置 1 操作,指令 CLI 可以对 IF 进行清除操作。

Page 171: 第 3 章教学内容及目标

段寄存器:

16 位长,共有 6 个,指定了 6 个当前可寻址的存储器段。

8086 CPU 可以使用: 代码段寄存器 CS ( Code Segment )、 数据段寄存器 DS ( Data Segment )、 堆栈段寄存器 SS ( Stack Segment )、 附加段寄存器 ES ( Extra Segment ) 4个段寄存器。 80386 以上的 CPU还可以使用另外 2 个附加段寄存器 FS 和 GS 。

Page 172: 第 3 章教学内容及目标

代码段 CS : 代码段是一个存储器区域,这里保存 C

PU 所使用的程序代码。 全部指令都从当前代码段中取出,偏移量由指令指针 EIP/IP提供。

Page 173: 第 3 章教学内容及目标

实地址模式下, CS定义一个 64KB 存储器段的起点,即 CS 的内容指向代码段的起始地址,也称代码段的基地址;

实地址模式下,代码段限制为 64KB长;保护模式下,代码段可以达到 4GB长。

Page 174: 第 3 章教学内容及目标

数据段 DS : 数据段是包含指令使用的大部分数据的存储

区域。其段内偏移地址按指令的寻址方式的指定,再经计算后得到。

实地址模式下,数据段限制为 64KB 长; 保护模式下时,数据段可以达到 4GB 长。

Page 175: 第 3 章教学内容及目标

堆栈段 SS : 堆栈段寄存器定义堆栈用的存储区。 其段内偏移地址由 ESP/SP 、 EBP/BP提供。

使用 ESP/SP只能寻址栈顶数据,使用 EBP

/BP 可以寻址堆栈段内任意位置上的数据。

Page 176: 第 3 章教学内容及目标

附加段 ES : 附加段是为字符串操作指令存放目

的操作数而附加的一个数据段,也可以用来存放一般的操作数。

Page 177: 第 3 章教学内容及目标

FS 和 GS : 用来确定数据段,以便把数据段的数量

扩展到 4个。 FS 和 GS仅在 80386 以上的 CPU 中才

能使用。

Page 178: 第 3 章教学内容及目标

实验: 完成实验 3 中的一部分: 认识 IA-32 CPU 程序设计模型 (见 实验 3.do

c),

通过 REGISTER 窗口观察上面所学寄存器的名称与长度。

上机学习 EFLAGS/FLAGS 的方法:在 PWB下打开帮助内容 → Assembly → Language Overview → Processor Flag Summary 。

Page 179: 第 3 章教学内容及目标

本次课程内容及目标教学内容:3.7 堆栈及其实现

3.8 I/O接口的组织实践教学 :

实验 3 ,用 SOURCE1 、 REGISTER 、 MEMORY1 窗口观察软件堆栈的操作。教学目标:能够描述软件堆栈的工作原理,建立 I/O空间的概念作业: P70: 58-73 题。(除操作题要会操作外,其它题写到作业本上)

Page 180: 第 3 章教学内容及目标

教学设计 : 1. 首先介绍堆栈的两种实现方法和操作方

式的概念。 2. 以图 3.13 和图 3.14 为依据,介绍硬

件堆栈的工作过程。 3. 介绍软件堆栈的概念。 4. 以图 3.15 、图 3.16 和图 3.17 为依据,

介绍软件堆栈的初始化、压栈操作和出栈操作的工作过程。

Page 181: 第 3 章教学内容及目标

5. 以实验 3 中例 2 ,启动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 16 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 16 位数据压栈操作和出栈操作的工作过程。

6. 以实验 3 中例 2 为例,启动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 32 位方式。点 Windows → Memory 1 ,设置为SS∶0 。练习 32 位数据压栈操作和出栈操作的工作过程。

7. 介绍 I/O 口组织的概念。

Page 182: 第 3 章教学内容及目标

3.7 堆栈及其实现( stack and it’s implementation )

堆栈的实现有两种方法 : 硬件堆栈, 软件堆栈。 堆栈最主要的操作方式是 : 按“后进先出 LIFO(Last In First Out)”

的原则,进行存取操作。

Page 183: 第 3 章教学内容及目标

硬件堆栈( hardware stack) 硬件堆栈的实现是: 利用 CPU 中一组专门的寄存器作为堆栈存

储区。

Page 184: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.13 Ó²¼þ¶ÑÕ»µÄÈëÕ»²Ù×÷

¶ÑÕ»

ÀÛ¼ÓÆ÷

1

1

1

2

2

1

2

3

3 8

8

7

6

5

4

3

2

1¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

Õ»¶¥

Õ»µ×

µÚÒ»´ÎÈëÕ»ºó µÚ¶þ´ÎÈëÕ»ºó µÚÈý´ÎÈëÕ»ºó µÚ°Ë´ÎÈëÕ»ºó¡ ¡

Page 185: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.14 Ó²¼þ¶ÑÕ»µÄ³öÕ»²Ù×÷

¶ÑÕ»

ÀÛ¼ÓÆ÷

5

6

7

3

4

5

6 18

7

6

5

4

3

2

1

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

Õ»¶¥

Õ»µ×

µÚÒ»´Î³öÕ»ºó µÚ¶þ´Î³öÕ»ºó µÚÈý´Î³öÕ»ºó µÚ°Ë´Î³öÕ»ºó¡ ¡

4

3

2

1

1

2

Page 186: 第 3 章教学内容及目标

软件堆栈( software stack) 软件堆栈位于内存中。 在源程序中由伪指令 ·stack xxh 定义堆

栈区的大 小; 汇编程序根据当前内存的情况在内存中分配堆栈

区 ,并将其段基地址赋予 SS 段寄存器,将存放堆栈区栈

顶 单元的偏移地址的寄存器 SP 先初始化指向堆栈底单元, 因为此时堆栈中无内容,堆栈顶与堆栈低单元重叠。 软件堆栈的特点是其栈顶地址是浮动的。

Page 187: 第 3 章教学内容及目标

段寄存器 SS 的功能: 存放堆栈段的基地址。 栈指针 SP 的功能: 堆栈指针 SP 指向栈顶单元,即 SP 中

含有堆栈的栈顶地址偏移量。

Page 188: 第 3 章教学内容及目标

IA-32 Intel 系列计算机中软件堆栈的生成方法:

按自底向上的方式生成,此时栈底地址大于栈顶地址。

Page 189: 第 3 章教学内容及目标

堆栈的初始化操作: 以下图为例。假设源程序中通过以下伪指令定

义堆栈区: · stack 0AH 经汇编后,堆栈初始化操作即完成。 假设汇编程序将堆栈区分配在 ID7A0H开始的

段,则自动赋予 SS 寄存器为 1D7AH ,同时将 SP寄存器赋予 000AH 。

堆栈的状态如图 3.15 所示。 (由于设置好了 10 个字节大的堆栈区。此时,

堆栈中还没压入内容,所以,栈顶与栈底重合, SP 指向 000AH )。

Page 190: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.15 ³õʼ»¯ºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£© Õ»¶¥µØÖ·=Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

¶ÑÕ»³¤¶È

10¸öµ¥Ôª

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

X X

X X

X X

X X

X X

X X

X X

X X

X X

X X

Page 191: 第 3 章教学内容及目标

入栈操作: SP 的内容减 2 ,然后写一个字数据到

新的栈顶。 此处假设有 10A0H 、 20B0H 、 30C0

H 、 40D0H 等 4个字数据,使用 PUSH指令把它们压入堆栈之后, SP 的内容由原来的 0AH减小到了 02H ,堆栈的状态如图 3.16 所示。

Page 192: 第 3 章教学内容及目标

PUSH 10A0H PUSH 20B0H PUSH 30C0H PUSH 40D0H

Page 193: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.16 ѹÈë4¸ö×ÖÊý¾ÝºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£©

Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

4¸ö×ÖÊý¾Ý

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

1 0

A 0

2 0

B 0

3 0

C 0

4 0

D 0

X X

X X

Õ»¶¥µØÖ·

Page 194: 第 3 章教学内容及目标

出栈操作: 先把栈顶的字复制到寄存器中,然后

SP 的内容加 2 。 此处假设使用 POP 指令,把已在堆

栈中的字数据 40D0H和 30C0H弹出堆栈之后, SP 的内容由原来的 02H增加到了06H,堆栈的状态如图 3.17 所示。

Page 195: 第 3 章教学内容及目标

POP AX POP BX

Page 196: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.17 µ¯³ö2¸ö×ÖÊý¾ÝºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£©

Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

2¸ö×ÖÊý¾Ý

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

1 0

A 0

2 0

B 0

X X

X X

X X

X X

X X

X X

Õ»¶¥µØÖ·

Page 197: 第 3 章教学内容及目标

软件堆栈的四种应用:

一是当需要利用堆栈临时保存某些数据的时候,

程序员可以在程序中设置 PUSH和 POP 指令,以实现对堆栈的操作;

二是当调用过程的时候,需要利用堆栈保存返回地址,此操作由调用过程的指令 CALL 和返回指令 RET共同完成;

Page 198: 第 3 章教学内容及目标

三是在调用过程以前,用 PUSH指令把过程所需要的参数压入堆栈,进入过程后用BP 的内容通过寄存器相对寻址取出参数;

四是当有中断请求发生并被 CPU响应之后, CPU 中的中断管理硬件会自动地把现场信息(即 CPU 中寄存器的内容)压入堆栈,中断服务完成之后,用 IRET指令恢复现场信息。

Page 199: 第 3 章教学内容及目标

实验 完成实验 3 中的一部分: 认识软件堆栈工作原理(见 实验 3.do

c) ,

• 用 SOURCE1 、 REGISTER 、 MEMORY1 窗口观察软件堆栈的操作。

Page 200: 第 3 章教学内容及目标

本次课程内容及目标教学内容: 3.7 堆栈及其实现

3.8 I/O接口的组织

实践教学 :

例 exp(ds.ss),用 SOURCE1 、 REGISTER 、 MEMORY1窗口观察软件堆栈的操作,观察堆栈段、数据段、代码段在内存中的位置及各段内容的分配情况。教学目标:能够描述软件堆栈的工作原理,建立 I/O空间的概念;初步掌握指令和数据在内存中的存放及执行情况;进一步掌握数据定义伪指令及段定义伪指令。作业: P70: 58-73 题。(除操作题要会操作外,其它题写到作业本上)

Page 201: 第 3 章教学内容及目标

教学设计 : 1. 首先介绍堆栈的两种实现方法和操作方

式的概念。 2. 以图 3.13 和图 3.14 为依据,介绍硬

件堆栈的工作过程。 3. 介绍软件堆栈的概念。 4. 以图 3.15 、图 3.16 和图 3.17 为依据,

介绍软件堆栈的初始化、压栈操作和出栈操作的工作过程。

Page 202: 第 3 章教学内容及目标

5. 以 exp(ds.ss) 为例,启动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 16 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 16 位数据压栈操作和出栈操作的工作过程。

6. 以 exp(ds.ss) 为例,启动 PWB → 进入 CodeView 。点 Windows → Register ,设置为 32 位方式。点 Windows → Memory 1 ,设置为 SS∶0 。练习 32 位数据压栈操作和出栈操作的工作过程。

7. 以 exp(ds.ss) 为例 ,进入 CodeView, 观察堆栈段、数据段、代码段在内存中的位置及各段内容的分配情况,加深对数据定义伪指令及段定义伪指令的理解。

8. 介绍 I/O 口组织的概念。

Page 203: 第 3 章教学内容及目标

3.7 堆栈及其实现( stack and it’s implementation )

堆栈的实现有两种方法 : 硬件堆栈, 软件堆栈。 堆栈最主要的操作方式是 : 按“后进先出 LIFO(Last In First Out)”

的原则,进行存取操作。

Page 204: 第 3 章教学内容及目标

硬件堆栈( hardware stack) 硬件堆栈的实现是: 利用 CPU 中一组专门的寄存器作为堆栈存

储区。

Page 205: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.13 Ó²¼þ¶ÑÕ»µÄÈëÕ»²Ù×÷

¶ÑÕ»

ÀÛ¼ÓÆ÷

1

1

1

2

2

1

2

3

3 8

8

7

6

5

4

3

2

1¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

Õ»¶¥

Õ»µ×

µÚÒ»´ÎÈëÕ»ºó µÚ¶þ´ÎÈëÕ»ºó µÚÈý´ÎÈëÕ»ºó µÚ°Ë´ÎÈëÕ»ºó¡ ¡

Page 206: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

ͼ3.14 Ó²¼þ¶ÑÕ»µÄ³öÕ»²Ù×÷

¶ÑÕ»

ÀÛ¼ÓÆ÷

5

6

7

3

4

5

6 18

7

6

5

4

3

2

1

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

¡ ¡

Õ»¶¥

Õ»µ×

µÚÒ»´Î³öÕ»ºó µÚ¶þ´Î³öÕ»ºó µÚÈý´Î³öÕ»ºó µÚ°Ë´Î³öÕ»ºó¡ ¡

4

3

2

1

1

2

Page 207: 第 3 章教学内容及目标

软件堆栈( software stack) 软件堆栈位于内存中。 在源程序中由伪指令 ·stack xxh 定义堆

栈区的大 小; 汇编程序根据当前内存的情况在内存中分配堆栈

区 ,并将其段基地址赋予 SS 段寄存器,将存放堆栈区栈

顶 单元的偏移地址的寄存器 SP 先初始化指向堆栈底单元, 因为此时堆栈中无内容,堆栈顶与堆栈低单元重叠。 软件堆栈的特点是其栈顶地址是浮动的。

Page 208: 第 3 章教学内容及目标

段寄存器 SS 的功能: 存放堆栈段的基地址。 栈指针 SP 的功能: 堆栈指针 SP 指向栈顶单元,即 SP 中

含有堆栈的栈顶地址偏移量。

Page 209: 第 3 章教学内容及目标

IA-32 Intel 系列计算机中软件堆栈的生成方法:

按自底向上的方式生成,此时栈底地址大于栈顶地址。

Page 210: 第 3 章教学内容及目标

堆栈的初始化操作: 以下图为例。假设源程序中通过以下伪指令定

义堆栈区: · stack 0AH 经汇编后,堆栈初始化操作即完成。 假设汇编程序将堆栈区分配在 ID7A0H开始的

段,则自动赋予 SS 寄存器为 1D7AH ,同时将 SP寄存器赋予 000AH 。

堆栈的状态如图 3.15 所示。 (由于设置好了 10 个字节大的堆栈区。此时,

堆栈中还没压入内容,所以,栈顶与栈底重合, SP 指向 000AH )。

Page 211: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.15 ³õʼ»¯ºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£© Õ»¶¥µØÖ·=Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

¶ÑÕ»³¤¶È

10¸öµ¥Ôª

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

X X

X X

X X

X X

X X

X X

X X

X X

X X

X X

Page 212: 第 3 章教学内容及目标

入栈操作: SP 的内容减 2 ,然后写一个字数据到

新的栈顶。 此处假设有 10A0H 、 20B0H 、 30C0

H 、 40D0H 等 4个字数据,使用 PUSH指令把它们压入堆栈之后, SP 的内容由原来的 0AH减小到了 02H ,堆栈的状态如图 3.16 所示。

Page 213: 第 3 章教学内容及目标

mov ax,10a0h mov bx,20b0h mov cx,30c0h mov dx,40d0h push ax push bx push cx push dx

Page 214: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.16 ѹÈë4¸ö×ÖÊý¾ÝºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£©

Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

4¸ö×ÖÊý¾Ý

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

1 0

A 0

2 0

B 0

3 0

C 0

4 0

D 0

X X

X X

Õ»¶¥µØÖ·

Page 215: 第 3 章教学内容及目标

出栈操作: 先把栈顶的字复制到寄存器中,然后

SP 的内容加 2 。 此处假设使用 POP 指令,把已在堆

栈中的字数据 40D0H和 30C0H弹出堆栈之后, SP 的内容由原来的 02H增加到了06H,堆栈的状态如图 3.17 所示。

Page 216: 第 3 章教学内容及目标

POP AX POP BX

Page 217: 第 3 章教学内容及目标

1 2 3 4

A

B

C

D

4321

D

C

B

A

×¢£ºÍ¼ÖÐÂß¼ µØÖ·¡¢ÎïÀíµØÖ·¡¢´æ´¢µ¥ÔªÖеÄÄÚÈÝÒ»ÂÉΪʮÁù½øÖÆ

ͼ3.17 µ¯³ö2¸ö×ÖÊý¾ÝºóµÄ¶Ñջ״̬

Âß¼ µØÖ·

ÎïÀí

£¨SP£©

Õ»µ×µØÖ· 1D7A:000A

1D7A:0009

1D7A:0008

1D7A:0007

1D7A:0006

1D7A:0005

1D7A:0004

1D7A:0003

1D7A:0002

1D7A:0001

1D7A:0000

1D7AA

1D7A9

1D7A8

1D7A7

1D7A6

1D7A5

1D7A4

1D7A2

1D7A3

1D7A1

1D7A0

¡« ¡«

¡« ¡«

2¸ö×ÖÊý¾Ý

¸ßµØÖ·

µÍµØÖ·

µØÖ·

¶ÑÕ»»ùÖ·£¨SS£©

X X

1 0

A 0

2 0

B 0

X X

X X

X X

X X

X X

X X

Õ»¶¥µØÖ·

Page 218: 第 3 章教学内容及目标

软件堆栈的四种应用:

一是当需要利用堆栈临时保存某些数据的时候,

程序员可以在程序中设置 PUSH和 POP 指令,以实现对堆栈的操作;

二是当调用过程的时候,需要利用堆栈保存返回地址,此操作由调用过程的指令 CALL 和返回指令 RET共同完成;

Page 219: 第 3 章教学内容及目标

三是在调用过程以前,用 PUSH指令把过程所需要的参数压入堆栈,进入过程后用BP 的内容通过寄存器相对寻址取出参数;

四是当有中断请求发生并被 CPU响应之后, CPU 中的中断管理硬件会自动地把现场信息(即 CPU 中寄存器的内容)压入堆栈,中断服务完成之后,用 IRET指令恢复现场信息。

Page 220: 第 3 章教学内容及目标

实验 例 exp(ds.ss) 的编辑、汇编、连接、调试。•

• 用 SOURCE1 、 REGISTER 、 MEMORY1 窗口观察软件堆栈的操作,观察堆栈段、数据段、代码段在内存中的位置及各段内容的分配情况。

Page 221: 第 3 章教学内容及目标

.model small .386 .data DATA1 DB 45H ; 定义字节 DB 'A' ; A 的 ASCII 码 DATA2 DW 12,13 ; 定义字 DW 2345H ; 十六进制数 DATA3 DD 12345678H ; 定义双字 ORG $+4 ; 跳过 4个地址 LISTA DB 55H ; 定义一个字节 LISTB DB 10 DUP(?) ; 保留十个字节 LIST9 DD 2 DUP(9) ; 双字数组 .stack 20h .code start: mov ax,@data mov ds,ax

Page 222: 第 3 章教学内容及目标

mov ax,10a0h mov bx,20b0h push ax push bx mov ax,0h mov bx,0h pop bx pop ax mov ecx,30c0c0c0h mov edx,40d0d0d0h push ecx push edx mov ecx,0 mov edx,0 pop edx pop ecx .exit end start