第6章 8086 8088汇编语言程序设计
- 格式:doc
- 大小:50.50 KB
- 文档页数:4
8086汇编语⾔程序设计——第⼀个程序本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。
Intel8086指令系统中有100多条指令,利⽤这些指令可以编写出复杂的程序实现更多功能。
汇编语⾔是直接控制计算机硬件⼯作的最简便的语⾔。
学习了汇编语⾔可具有在CPU寄存器级上进⾏控制和操作的能⼒,可获得直接对计算机硬件底层编程的经验。
⼀个计算的例⼦例 *编写⼀个汇编语⾔程序,实现下列公式计算。
假设X=4,Y=5汇编指令如下:如果在DEBUG下⽤A命令输⼊这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能⽤T命令执⾏。
D:\dos〉DEBUG-AMOV AL,4ADD AL,5MOV BL,8IMUL BLMOV BL,4MOV BH,0SUB AX,BXMOV BL,2IDIV BLMOV [0],ALMOV [1],AH采⽤DEBUG的A命令输⼊程序的做法明显不⽅便,⼀是⽆法给出变量名即符号地址,⼆是调试修改程序不便。
1. 编写⼀个完整的汇编语⾔源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。
伪指令与C语⾔等⾼级语⾔中的说明性语句的含义类似,起到说明作⽤。
⽤记事本gedit或者vi编写,保存到dos⽬录下注释符号为;号2. 汇编、链接、执⾏汇编语⾔源程序既可以⽤⼤写字母也可以⽤⼩写字母书写。
汇编语⾔程序建⽴及汇编过程如图所⽰。
⽤户编写的源程序要经汇编程序MASM汇编(翻译)后⽣成⼆进制⽬标程序,⽂件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接⽣成可执⾏程序,⽂件名默认与源程序同名、扩展名为.EXE。
注意:源程序⼀定要和MASM和LINK⽂件放在同⼀个⽂件夹中。
执⾏MASM和LINK命令时需要按多次回车。
3. 在DEBUG下执⾏程序MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。
第二章答案Tarzan 版题2.1 8086/8088通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门用途?哪些寄存器可作为存储器寻址方式的指针寄存器?答:8086/8088通用寄存器的通用性表现在:这些寄存器除了各自规定的专门用途外,他们均可以用于传送和暂存数据,可以保存算术逻辑运算中的操作数和运算结果;8个通用寄存器的专门用途如下:AX 字乘法,字除法,字I/OBX 存储器指针CX 串操作或循环控制中的计数器DX 字乘法,字除法,间接I/OSI 存储器指针(串操作中的源指针)DI 存储器指针(串操作中的目的指针)BP 存储器指针(存取堆栈的指针)SP 堆栈指针其中BX,SI,DI,BP可作为存储器寻址方式的指针寄存器题2.2 从程序员的角度看,8086/8088有多少个可访问的16位寄存器?有多少个可访问的8位寄存器?答:从程序员的角度看,8086/8088有14个可访问的16位寄存器;有8个可访问的8位寄存器;题2.3 寄存器AX与寄存器AH和AL的关系如何?请写出如下程序片段中每条指令执行后寄存器AX的内容:MOV AX,1234HMOV AL,98HMOV AH,76HADD AL,81HSUB AL,35HADD AL,AHADC AH,ALADD AX,0D2HSUB AX,0FFH答: MOV AX,1234H AX=1234HMOV AL,98H AX=1298HMOV AH,76H AX=7698HADD AL,81H AX=7619HSUB AL,35H AX=76E4HADD AL,AH AX=765AHADC AH,AL AX=D15AHADD AX,0D2H AX=D22CHSUB AX,0FFH AX=D12DH题2.4 8086/8088标志寄存器中定义了哪些标志?这些标志可分为哪两类?如何改变这些标志的状态?答: 8086/8088标志寄存器中定义了9个标志,如下:CF: Carry FlagZF: Zero FlagSF: Sign FlagOF: Overflow FlagPF: Parity FlagAF: Auxiliary Carry FlagDF: Direction FlagIF: Interrupt-enable FlagTF: Trap Flag这些标志可分为两类,分别为:1、运算结果标志;2、状态控制标志;采用指令SAHF可把AH中的指定位送至标志寄存器低8位SF、ZF、AF、PF、CF;采用CLC可清除CF,置CF到0采用STC可置CF到1采用CLD可置DF到0采用sTD可置DF到1采用CLI可置IF到0采用STI可置IF到1另外,在某些指令执行过程中会改变部分标志的状态;题2.5 请说说标志CF和标志OF的差异。
《汇编语言程序设计》复习题一、填空题1、8086CPU内部结构按功能分为两部分,即 BU(执行部件)和 BIU(总线接口部件)。
2、CPU中的总线接口部件BIU,根据执行部件EU的要求,完成CPU与主存储器或I/0端口之间的数据传送。
3、8086中的BIU由四个 16 位段寄存器、一个 16 位指令指针、 6 字节指令队列、 20 位地址加法器和总线控制电路组成。
4、8086/8088的执行部件EU由 8 个通用寄存器、 1 个专用寄存器、一个标志寄存器和 ALU 等构成。
5、根据功能不同,8086的标志位可分为状态标志和控制标志。
6、8086/8088构成的微机中,每个主存单元对应两种地址:段基值和偏移量。
7、8086CPU具有 20 根地址线,直接寻址能力可达 1M 。
8、逻辑地址由段基值和偏移量组成,其中的段基值是由段寄存器存储。
9、计算机的指令由操作码和地址码两部分组成。
10. 零地址指令是不带地址码的机器指令,其操作数是由隐含指定提供的。
11. 8088CPU中共有 14 个寄存器,这些寄存器为 16 位。
12. F标志寄存器共有9个标志位,除OF、SF、AF和CF外,还有 DF 、 IF 、 TF 、▁ ZF 和 PF ,其中用于记录是否产生进位的标志位是 CF 。
13. 标号和变量所具有的三种属性分别为段属性、偏移量属性和类型属性。
14. 操作数有三种类型,分别为常数操作数、寄存器操作数和存储器操作数。
15. 一个源程序中可以包含代码段、数据段堆栈段及附加段。
其中代码段是源程序中必不可少的,其它的段可有可无。
16. SEGMENT/ENDS称为段定义伪指令;ASSUME称为段寻址伪指令;NAME/END称为模块定义伪指令;源程序结束伪指令为 END ;过程定义伪指令为 PROC/ENDP 。
数据定义伪指令为 DB 、 DW 、DD 。
17. 一般DOS系统功能调用的步骤为:(1) 送入口参数到指定寄存器;(2)送功能号至AH ;(3)软中断指令INT 。
《汇编语言程序设计》复习资料一、基本概念1、8088/8086CPU内部寄存器有__14____个,其中的AX、BX、CX、DX是通用寄存器,SP、BP、DI、SI 是基址和变址寄存器,CS、DS、ES、SS、是段寄存器,此外还有指令指针寄存器 IP 和标志位寄存器 FLAGS 两个控制寄存器,所有寄存器都是 16 _位寄存器,每个寄存器可以存放 16 位二进制数。
2、8088/8086CPU的标志位寄存器中有9个标志位,其中的DF、IF、TF是控制标志,OF、SF、ZF、CF、AF、PF 是状态标志。
3、8088/8086CPU有三组总线,它们是数据总线、控制总线和地址总线;地址总线是 20 条,因此它可以寻址的范围是 1M 字节。
通常将 1024 字节称为1K,将 1024K 字节称为1M。
4、8088/8086CPU的存储器采用分段方式管理,每个段最多可以有 64K 字节,全部存储空间可以分成 16 个大小为64K且互相不重叠的段。
5、采用分段方式管理的存储单元的地址分成物理地址和逻辑地址两种,逻辑地址由段地址和偏移地址两部分构成,段地址是每个存储器段的起始地址;偏移地址则是相对于每个段第一个存储单元的偏移值。
段地址存放在段寄存器中,由于8088/8086CPU的段寄存器是16位寄存器,因此在段寄存器中存放的是段地址的 16 位;而CPU对数据的存取是按物理地址进行的,物理地址和逻辑地址间的关系是__ 物理地址=段地址 16D(或10H)+ 偏移地址___。
6、存储器中,数据是以字节为单位存放的,它是一个 8位二进制数,16位二进制数是 2个字节,又称为字;每个存储单元可以存放一个字节;一个字则占用两个存储单元,存放时要将低字节放在地址较小的存储单元中。
7、计算机的指令由操作码字段和操作数字段构成,它们分别给出计算机所要执行的操作和执行操作所要的操作数。
8、指令操作数通常可以存放在指令中,也可以存放在CPU的寄存器中,大多数存放在存储器中,它们分别称为立即数、寄存器操作数和存储器操作数。
汇编语言程序设计课后习题答案(第二版_沈美明)(无删减)第一章1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数: (1) 369 (2) 10000 (3) 4095 (4) 32767 答:(1) 369=1 0111 0001B=171H(2) 10000=10 0111 0001 0000B=2710H (3) 4095=1111 1111 1111B=FFFH(4) 32767=111 1111 1111 1111B=7FFFH1.2 将下列二进制数转换为十六进制数和十进制数:(1) 10 1101 (2) 1000 0000 (3) 1111 1111 1111 1111 (4) 1111 1111 答:(1) 10 1101B=2DH=45 (2) 1000 0000B=80H=128(3) 1111 1111 1111 1111B=FFFFH=65535 (4) 1111 1111B=FFH=2551.3 将下列十六进制数转换为二进制数和十进制数: (1) FA (2) 5B (3) FFFE (4) 1234 答:(1) FAH=1111 1010B=250 (2) 5BH=101 1011B=91(3) FFFEH=1111 1111 1111 1110B=65534 (4) 1234H=1 0010 0011 0100B=46601.4 完成下列十六进制数的运算,并转换为十进制数进行校核: (1) 3A+B7 (2)1234+AF (3) ABCD-FE (4) 7AB×6F 答:(1) 3A+B7H=F1H=241 (2) 1234+AFH=12E3H=4835 (3) ABCD-FEH=AACFH=43727 (4) 7AB×6FH=35325H=2178931.5 下列各数均为十进制数,请用8位二进制补码计算下列各题,并用十六进制数表示其运算结果。
8086/8088汇编语言程序设计
6.1.1汇编语言的语句格式
汇编语句分为指令语句和汇编命令语句。
指令语句的格式如下:
(标号:)(前缀指令)助记符(操作数);(注释)
其中()中的内容是可以省略的,多个操作数间是以逗号隔开的。
汇编命令语句不汇编成机器代码,它仅仅在汇编过程中告诉汇编程序应如何编译汇编命令式为汇编程序在编译时用的。
汇编命令语句用四个字段组成,格式如下:
(名字)助记符(操作数);(注释)
当伪指令是数据定义的伪指令时,它称为变量。
6.1.2 标号、变量及表达式
标号是用符号表示的地址。
标号有3个属性:段地址、偏移地址和类型。
标号的段地址和偏移地址是指标号对应的指令首字节所在的段地址和段内的偏移地址。
标号的类型属性有两种:NEAR和FAR类型。
在转移和调用指令中常将标号作为转移目标地址使用。
变量是与一个数据项的第一字节相对应的标识符。
它表示该数据项第一字节在现行段中的偏移量。
变量有3个属性:段地址(SEG)、偏移地址(OFFSET)、类型(TYPE)。
表达式由运算符和运算对象组成。
运算符有算术、逻辑、关系运算符和汇编语言特定的运算符(分析、合成等)运算对象可以是常数、变量和标号,也可以是操作数,还可以是构成程序的段、偏移量或圆括号内的偏移量。
6.1.3 伪指令
伪指令共有20条,常用有以下几条:
(1)赋值伪指令EQU, 利用EQU指令可用标号来代表数据、数据地址或程序地址。
伪指令EQU有两种格式,即
A. 名称EQU 表达式
B. 名称EQU 被定义过的名称或标号
(2)定义变量(分配存储单元)伪指令,就是给变量分配内存的伪指令。
这些伪指令是DB, DW, DD, DQ, DT。
A. 当用DW定义地址表达式时,地址表达式中的变量名称表示该变量的第一个存储单元的偏移地址。
B. 当用DD定义地址表达式时,低字节用预置偏移地址,高位字用于预置段地址。
C. 地址表达式中的变量或标号可与常数值相加减。
对于变量来说运算结果的
类型不变;对标号来说,运算结果仍表示原标号段中的偏移地址。
D. 变量或标号不能相加,但可相减,结果是没有属性的纯数值。
(3)定义存储单元类型伪指令(PTR)。
这类指令不单独使用,而是和指令结合起来使用。
利用这些伪指令,对存储单元指定数据类型。
(4)段定义伪指令
A. 段定义伪指令SEGMENT/ENDS主要是用来定义段的名称和范围,还可指明段的定位类型、组合类型和分类名。
段定义伪指令的格式是:
段名1 SEGMENT [定位类型][组合类型][分类名]
┆
段名1 ENDS
当定义数据段、附加数据和堆栈段时,在SEGMENT/ENDS伪指令中间的语句,只能包括伪指令语句,不能包括指令语句。
只有当SEGMENT/ENDS定义代码段时,中间的语句才能为指令语句以及与指令有关的伪指令语句。
由SEGMENT/ENDS所定义的段小于64KB。
B. OGR伪指令。
该指令用来规定目标程序存放单元的偏移量。
它的格式如下:
ORG 表达式
该指令前面不能带标识符。
C. ASSUME 伪指令。
该指令语句用来告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段。
该指令的格式为:ASSUME 段寄存器名:段名符[,段寄存器名:段名符,…] ASSUME语句只能安排在代码段内,一般应排在代码段作为首指令。
(5)定义过程的伪指令有PROC, ENDP, NEAR和FAR。
一个过程可以被其他程序所调用,它的最后一条指令总是返回指令,返回到主程序。
定义过程的伪指令总是成对出现的,在这两条伪指令间的内容就作为一个过程,即一个子程序。
(6)定义结构的伪指令STRUC/ENDS。
定义结构伪指令的格式如下:
结构名称STRUC
┆由DB, DW, DD伪指令所组成的语句序列字段
标识符
结构名称ENDS
结构定义并不保留任何存储空间,也不为任何存储单元赋值,它仅仅是一种模式。
因而在引用结构和其字段之前,必须为结构分配空间或赋值。
要给结构分配存储空间或赋值,必须有一个引用该结构的语句,其格式如下:变量结构名称<赋值说明>
访问结构的方法是:变量名,字段名
(7)源程序结束伪指令END。
该指令表明了源程序的终结,其格式如下:
END 表达式(表达式通常就是程序第一条指令的语句标号)
6.1.4 分支程序设计
程序的分支主要是靠条件转移指令来实现。
这里需要注意的是条件转移语句都是近程跳转。
若程序所要转移的地址超出其范围时,需利用一条无条件转移语句作为中转。
6.1.5 循环程序设计
循环程序设计主要用于某些需要重复进行的操作,主要使用循环指令LOOP,LOOPZ或LOOPNZ或条件转移指令。
循环程序的设计可分为设置循环初始状态、循环体和循环控制条件三部分。
(1)设置循环初始状态主要是指设置次数的计数初值,以及其他为能使循环体正常工作而设置的初始状态等。
(2)循环体是循环操作(重复执行)的部分,包括循环的工作部分及修改部分。
循环的工作部分是实现程序功能的主要程序段;循环的修改部分是指当程序循环执行时,对一些参数如地址、变量的有规律的修正。
(3)循环控制部分是循环程序设计的关键。
每个循环程序必须选择一个控制循环程序运行和结束的条件。
6.1.6 子程序设计
子程序可以被调用,且该子程序完成确定的功能后便返回调用程序处。
(1)过程的定义和调用,过程的定义格式为:
过程名PROC属性
┆
RET
过程名ENDP
调用过程时只要在CALL指令后写上该过程名即可。
属性字段用来指明过程的类型属性是NEAR还是FAR。
RET指令总是放在过程体的末尾,用来返回主程序。
(2)寄存器内容的保护和恢复。
即保护现场和恢复现场,通常是用堆栈压入指令和弹出指令来实现。
必须注意:并不是过程中用的所有寄存器内容都要保护(只有那些子程序和主程序都要用的寄存器才予以保护)。
例如,若用寄存器在主程序和过程间传递参数就不需要保护。
(3)主程序和过程间的参数传递。
主程序调用过程时,必须先把过程所需的初始数据(即入口参数)设置好,过程执行完毕返回主程序时也必须将过程运行所得的结果(即出口参数)送给主程序。
过程入口参数传入和出口参数的送出称为主程序和过程间的参数传送。
参数传送的方法主要有以下4种:
A. 用CPU内部的寄存器传送参数。
B. 当过程和主程序同在一个代码段时,过程可以直接访问该代码段中的变量(即参数)。
C. 通过地址表传送变量地址。
该方法是将所有变量的偏移地址顺序存放在一张地址表中,然后通过寄存器将地址表的地址传送给过程,进入过程后可用寄存器间接寻址方式从地址表中取出变量地址,以便访问所需变量。
D. 通过堆栈传送参数或参数地址。
该方法是:调用过程前在主程序中用PUSH指令将参数地址压入堆栈;进入过程后再用基址寄存器BP从堆栈中取出这些参数地址,并送寄存器,以便寄存器间接寻址方式访问所需变量。
4. 过程的重入。
保证子程序可重入性的方法,通常也是将每次调用子程序时所用到的参数和中间结果逐层压入堆栈,以达到每次调用的结果都能正确保存的目的。
5. 过程的嵌套、递归的调用。
过程嵌套的层次是没有限制的,只要堆栈空间允许即可,但当嵌套层次较多时,应特别注意寄存器内容的保护和恢复,以免发生冲突。
6.1.7 宏指令、宏定义、宏调用
宏定义的格式为:
宏指令名 MACRO(形式参数)
┆
ENDM
其调用的格式为:宏指令名(实际参数)
当具有宏指令调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。
宏展开实际上是用宏定义时设计的宏体去代替相应的宏指令名,并且用实际参数一一取代形式参数。