第七章 学习机简介
微型计算机结构
汇编语言程序设计
指令格式
寻址方式
指令系统第1节微型计算机结构概念,微型计算机结构是指微型计算机主要部件的特性布局及连接,是程序设计者必须了解的硬件资源及其资源部件,如地址空间、寄存器组、寻址方式、指令系统等。典型的微型计算机结构包括微处理器、存储器、输入 /输出三个主要部分,通过系统总线连接。
1.Intel 8086处理器的结构
2.寄存器结构
8086微处理器内部共有 14个 16位的寄存器,所有寄存器可分为四组:数据寄存器 AX,BX,CX,DX,指针及变址寄存器 SP,BP,SI,DI,段寄存器 CS、
DS,SS,ES与控制寄存器 IP,FLAGS。
(1)数据寄存器数据寄存器是用来寄存运算中的数据。它包括:
a.AX(Accumulator)是累加器,是算术运算中主要寄存器。
b.BX(Base),是基址寄存器,常对应于数据段,用于间接寻址及基址变址寻址。
c.CX(Count),是计数寄存器,在循环指令和串处理指令中用作隐含的计数器,移位指令中使用 CL作为计数器。
d.DX(Data),是数据寄存器,在双字运算时与 AX组合,作为 AX的扩展,存放高位字,AX
存放低位字。
(2)指针及变址寄存器指针及变址寄存器 SP,BP,SI,DI,除 SP
外,可像数据寄存器一样,作为存放操作数的通用寄存器,更经常、更主要的用途是存放地址,提供寻址时的偏移地址。
a.SP(Stack Pointer)是堆栈指针寄存器,用来指示栈顶的偏移地址。
b.BP(Base Pointer)是基址指针寄存器,对应于堆栈段。
c.SI(Source Index)和 DI(Destination Index),
是源变址寄存器和目的的变址寄存器,用来形成间接地址,实现基址加变址寻址。
(3)段寄存器段寄存器是用来存放当前段的段地址。
a.CS(Code Segment),代码段寄存器,用于存入代码段的段地址。
b.DS(Data Segment),数据段寄存器,用于存放数据段的段地址。
c.SS(Stack Segment),堆栈段寄存器,用于存放堆栈段的段地址。
d.ES(Extra Segment),附加数据段寄存器,
用于存放附加数据段的段地址。
(4)控制寄存器控制寄存器用以存放与程序执行有关的信息,
寄存的内容将影响或改变程序的执行流程。
a.IP(Instruction Pointer),指令指针寄存器,
又称程序计数器,是一个专用寄存器,用于存放当前要执行指令的地址。
b.OF(Overflow Flag),溢出标志位。
c.SF(Sign Flag),符号标志位。
d.ZF(Zero Flag),零标志位。
e.AF(Auxiliarty Flag),辅助进位标志位。
f.PF(Parity Flag),奇偶标志位。
g.CF(Carry Flag),进位标志位。
h.DF(Direction Flag),方向标志位。
i.IF(Interrupt Flag),中断标志位。
j.TF(Trap Flag),陷阱标志位。
3.内存组织
(1).内存地址内存的基本单元为 8位组成的一个字节,每个内存单元分配了一个唯一地址,从 0开始编址。 1MB内存地址从 00000H到 FFFFFH。
8086微机字长为 16位,16位称为 1个字
(Word),字被存储在连续 2个字节中。双字
(Double Word)被存储在连续 4个字节中,如用寄存器存放,则需一对寄存器。 如 DX,AX。
(2)段式存储管理
8086微外理器内部的 EU部件使用 16位地址,
只能进行 16位运算,为解决与存储器 20位地址的矛盾,对存储空间引入逻辑地址,分成许多逻辑段,采用段式存储管理。
采用段式存储管理,段地址与偏移地址都可直接放在 16位寄存器中,段地址放段寄存器中,偏移地址可以放通用寄存器中,虽然指令使用 16位地址,但寻址范围达到 1M字节。
(3)逻辑地址与物理地址逻辑地址是编写程序时使用的地址,由段地址与偏移地址构成。
逻辑地址常用格式,段地址:偏移地址,表示。
物理地址是内存的实际 20位地址,是存储空间的绝对地址,和存储单元一一对应,采用 5位十六进制数表示。
物理地址只有被转换成物理地址才能访问内存。
物理地址 =段地址 X16+偏移地址。
也就是说,将段地址左移 4位,加上偏移地址,
即可得到物理地址。转换工作由总线接口部件的地址加法器完成。
(4)I/O空间是微处理器另一块独立的
64KB大小的物理地址空间,用地址总线的低 16位作为 8位 I/O端口的寻址线。
4.堆栈技术
(1)堆栈描述堆栈是内存中一块特定区域,是一片先进后出、后进先出的存储空间,堆栈段中数据由高地址到低地址顺序存放。
堆栈一端是固定的,另一端是浮动的,固定的一端称为堆栈栈底,浮动的一端称为堆栈栈顶,是堆栈的操作端。由堆栈段寄存器
SS指示堆栈段地址,堆栈栈底及堆栈长度由椎栈指针寄存器 SP的初值指出,堆栈栈顶也由堆栈指针寄存器 SP的值指出。
堆栈为空时,栈顶与栈底相同。
(2)堆栈操作堆栈操作遵循,先进后出、后进先出,的原则,包括压入操作 (PUSH)和弹出操作 (POP)。
堆栈操作过程中,SP的值不断变化,但总是指向堆栈栈顶位置。
堆栈操作总是对字数据进行。
压入操作用于数据进栈,保存信息。
弹出操作用于数据出栈,恢复信息。
堆栈操作有专用的指令完成,也可以由子程序调用指令实现。
第2节汇编语言程序设计
1.开发环境典型的汇编语言开发环境包括编辑程序、汇编程序、连接程序及调试程序。
a.编辑程序用于建立汇编程序,可用任何字处理软件完成。
b.汇编程序用于将汇编程序汇编成目标代码程序,常用的有 Mricrosoft公司的 MASM 5.0与 MASM 6.0,目标代码程序文件扩展名为 OBJ。
c.连接程序用于将目标代码程序连接装配成可执行程序,
目标代码程序既可以是汇编程序产生的,也可以是其他编译程序产生的,常用的是 Microsoft公司的 LINK程序。执行程序文件扩展名为 EXE。
d.调试程序用于跟踪程序的执行情况,查找程序中的逻辑错误,Microsoft公司的 DEBUG,CodeView与 Borland公司的 Turbo Assembler都是不错的调度工具。
2.一般过程进行程序设计实际要做两件事,一是对数据进行描述,二是对操作进行描述。
程序设计的过程应严格遵循软件工程的规范,
汇编语言程序设计的一般过程可简化为分析问题、设计算法、编制程序、分析结果四步,
如下图所示:
3.基本方法程序设计的基本方法是结构化程序设计方法。
结构化程序由顺序结构、选择结构、循环结构三种基本结构组成。
结构化程序设计方法的基本思想是,自顶向下、逐步求精,。在设计阶段,合理分解;
在编码阶段,读者至上。
结构化程序设计方法就是模块化程序设计。
第3节指令格式
1.机器语言指令格式机器语言中使用二进制代码指令,
为了满足不同的功能要求,减少指令长度,提高指令的使用效率,8086指令系统采用 1~ 6个字节组成的变字长指令格式,由操作码、寻址方式、操作数三部分组成,如下图所示:
通常指令的第 1字节为操作码,规定指令的操作类型。
第 2字节为操作数,规定操作数的寻址方式。第 3~
6字节是可变字节,指出存储器操作数地址的位移量或产即数。
W位,指示操作数的类型。
D位,指示操作数的传送方向。
REG字段,指定一个寄存器操作数,见下表。它作为源操作数还是作为目的操作数同 D位规定。
MOD字段,用来指定另一个操作数的寻址方式。
R/M字段,受 MOD字段控制。
2.汇编语言指令格式汇编语言以机器语言指令作为基础,使用与机器语言指令基本相对应的符号助记指令。
符号助记指令由操作助记符和若干操作数组成。
操作数分为数据操作数与转移地址操作数两大类。
数据操作数包括立即操作数、寄存器操作数、存储器操作数,I/O操作数四种。数据操作数通常有两个,一个为源操作数,一个为目的操作数。
汇编语言指令的基本格式:
a.操作助记符
b.目的操作数,源操作数第4节寻址方式概念,寻址方式给出操作数或操作数地址的计算方法,对转移指令形成程序的转移地址。根据寻址方式计算出操作数地址存取操作数的过程称为寻址操作。
1.数据寻址方式数据寻址包括立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、
基址变址寻址、基址变址相对寻址等方式。
(1)立即寻址立即寻址指的是操作数直接包括在指令中。
这样的操作数称为立即数,可以是 8位的,
也可以是 16位的 。
(2)寄存器寻址寄存器寻址指的是操作数放在指令指定的寄存中。
(3)直接寻址直接寻址指的是操作数的偏移地址直接出现在指令中,书写时加上中括号以表示是偏移地址。默认段寄存器 DS,允许段超越。
(4)寄存器间接寻址寄存器间接寻址指的是操作数的偏移地址在基址寄存器 BX,BP,或变址寄存器 SI,DI中。
使用 BX,SI,DI,默认段寄存器 DS;使用 BP,
默认段寄存器 SS。允许段超越。
(5)寄存器相对寻址寄存器相对寻址指的是操作数的偏移地址是一个基址寄存器或变址寄存器的内容加上指令中给出的8位或16位位移量。
(6)基址变址寻址基址变址寻址指的是操作数的偏移地址是一个基址寄存器内容加上一个变址寄存器的内容。
(7)基址变址相对寻址基址变址相对寻址指的是操作数的偏移第5节指令系统每台计算机都拥用自己的指令系统,指令系统是程序的底层支撑。不同类型计算机提供的指令数量、格式、功能不尽相同。
大多数指令必须遵守以下基本规则:
(1)目的操作数与源操作数的类型必须匹配,
一般8位对8位,16位对16位。
(2)目的操作数不能立即操作数
(3)目的操作数与源操作数不能同时为存储器操作数。串操作指令除外
(4)目的操作数与源操作数不能同时为段寄存器。
1.通用数据传送指令
(1)数据传送指令MOV
格式:MOV DOPD,SOPD
功能:将一个字节或字操作数从SOPD传送至DOPD。
说明:
a.CS不能作为目的的操作数,立即数不能直接传送到段寄存器中,SOPD、DOP
D不能同时为存储器操作数,不能在段寄存器之间直接传送。
b.不影响标志寄存器。
(2)数据交换指令XCHG
格式:XCHG DOPD,SOPD
功能:交换DOPD与SOPD内容说明:不影响标志寄存器
(3)查表转换指令XLAT
格式,XLAT[OPD]
功能:从 BX作为表头的表中找到序号为 AL的字节数据送 AL中,[BX+AL ]--AL。
说明:XLAT指令可以很方便地将一种代码转换成另一种代码。
(4)堆栈操作指令PUSH和POP
格式,PUSH SOPD
POP DOPD
功能:对字数据进行操作,PUSH指令将数据压入堆栈,POP指令将数据弹出堆栈。
说明:
(1)操作数可以是立即数以外的寻址方式,POP指令不可以使用 CS,不影响标志位。
(2)压入时 SP-2-SP,弹出时 SP+2--SP。
(3)PUSH指令和 POP指令一般要成对使用,进栈必须出栈,堆栈指针必须保持平衡与稳定,这是使用堆栈的一个重要原则。
2.地址传送指令
(1)传送偏移地址指令 LEA
格式,LEA REG16,MEM
功能:将 MEM的偏移地址传送至指定寄存器中。
说明:该指令通常用来设置偏移地址初值,以便从此地址开始存取多个数据。
(2)传送偏移地址与数据段地址指令
LDS
格式,LDS REG16,MEM32
功能:将 MEM32中低字内容送 REG16,高字内容送 DS。
说明:
a.MEM32存放的双字一般是某个程序或变量的逻辑地址。
b.该指令为访问非当前数据段作地址准备,常指定
SI寄存器。
(3)传送偏移地址与数据段地址指令 LES
格式,LES REG16,MEM32
功能:与 LDS指令完全类似,只是将高字内容送 ES。
说明:该指令为访问附加数据段作地址并准备。
3.标志传送指令
(1)取标志指令 LAHF
格式,LAHF
功能:将 FLAGS的低字节送 AH,即取 SF,ZF、
AF,PF及 CF等 5个状态位送入 AH对应位中。
(2)置标志指令 SAHF
格式,SAHF
功能:将 AH内容送 FLAGS的低字节,即以 AH
对应内容修改 SF,ZF,AF,PF及 CF等 5个状态位。
(3)标志压入堆栈指令 PUSHF
格式,PUSHF
功能:将 FLAGS内容压入堆栈,该指令不影响状态标志位。
(4)标志弹出堆栈指令 POPF
格式,POPF
功能:将 SP所指栈顶字内容送 FLAGS,即以栈顶字内容修改标志寄存器。
说明,PUSHF,POPF指令可用于保护调用过程前标志寄存器的内容。
4.输入输出指令
(1)输入指令 IN
格式,IN DOPD,SOPD
功能:由指定端口输入数据至累加器。
说明:
a.输入 8位数据,DOPD为累加器 AL;输入 16
位数据,DOPD为累加器 AX。
b.SOPD为端口地址。
(2)输出指令 OUT
格式,OUT DOPD,SOPD
功能:将累加器中数据输出到指定端口。
说明:
a.SOPD为累加器 AL(8位数据输出时 )或累加器
AX(16位数据输出时 )。
b.DOPD为端口地址。
5.处理器控制指令
(1)清置标志位指令
CLC和 STC指令用于清、置进位标志 CF。
CLD和 STD指令用于清、置方向标志 DF。
CLI和 STI指令用于清、置断标志位 IF。
清是清 0,置是置 1。
(2)外同步指令停机指令 HLT,使 CPU进入暂停状态,这个状态可被允许的外部中断清除掉。
等待指令 WAIT,用来使 8086处理器与协处理器同步。
交权指令 ESC,使其他处理器可以使用 8086
的寻址方式。
封锁总线指令 LOCK,可放在任何指令前面的单字节前缀,应用于共享资源的多处理器系统中。
(3)空操作指令空操作指令 NOP,除 IP加 1,不进行任何操作。