微机原理及应用-chap4-2013_第1页
微机原理及应用-chap4-2013_第2页
微机原理及应用-chap4-2013_第3页
微机原理及应用-chap4-2013_第4页
微机原理及应用-chap4-2013_第5页
已阅读5页,还剩169页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章8086指令系统4.1汇编语言指令的格式与寻址方式4.2数据传输类指令4.3算术加法类指令4.4逻辑操作类指令4.5程序转移类指令4.6字符串操作指令(了解)4.7处理器控制类指令(了解)Chap4指令系统根据设计使某型计算机所具有的指令的集合便是计算机的指令系统。指令的表达形式:机器码指令和汇编语言指令。①用二进制代码表示的指令称为机器码指令或目标代码指令。②因为机器码指令难以记忆和编程,就将指令操作功能的英文缩写作为指令的符号,称为助记符。用助记符表示的指令便于记忆和编程,但不能被计算机直接识别和执行,必须经过汇编转换为机器码后才能执行,汇编语言指令由此而得名。

4.1汇编语言指令的格式和寻址方式[标号]:(助记符)[操作数][,操作数][;注释]START:MOVAX,DATA;将数据段地址送AX寄存器1.标号是给该指令所在地址取的名字,必须后跟“:”,它可以缺省,是可供选择的标识符。2.指令助记符是指令功能的代表符号,它是指令语句中的关键字段,不可缺省,它表示本指令的操作功能。3.操作数是参加指令操作的数据,可缺省源操作数——指令中参与操作的数据,源地址目的操作数——指令操作结果,目的地址4.注释可缺省,必须用“;”指明。一、

8086汇编语言指令格式MOVBX,1000H;将1000H送BXINCCX ;将CX内容加1NOP ;空操作二、

8086的寻址方式寻址方式——寻找操作数所在地址的方式。七种立即数寻址寄存器寻址直接寻址寄存器间接寻址基址寻址变址寻址基址加变址寻址存储单元或某个寄存器e.g.MOVAL,05H;将05H送入ALMOVAX,3064H;3064H→AX,64H→AL,30H→AH1.立即数寻址操作数就在指令中,跟在操作码后面,称为立即数。在指令格式中,立即数一般为源操作数。操作数在CPU内部寄存器中,指令指定寄存器名称,存取此类操作数在CPU内部执行,速度快。2.寄存器寻址

对于16位操作数,寄存器可以是:

AX,BX,CX,DX,SP,BP,SI,DI,DS,CS,ES,SS

对于8位操作数,寄存器可以是:

AL,AH,BL,BH,CL,CH,DL,DH

可以对源操作数采用寄存器寻址,也可以对目的操作数采用寄存器寻址,还可以两者都采用寄存器寻址方式。e.g.指令执行前:(AX)=3064H (SS)=1234H

MOVSS,AX指令执行后:(SS)=3064H

(AX)保持不变。

指令执行前:指令执行后:寄存器寻址方式八位寄存器:AH,AL,BH,BH,BL,CH,CL,DH,DL十六位通用寄存器:AX,BX,CX,DX,SP,BP,SI,DI堆栈指针 SP指令指针 IP(或PC)标志位 Flags目的和源变址寄存器 DI,SI段寄存器 CS,DS,ES,SS通用寄存器 rAL或AX(取决于操作数长度)acc指令系统使用的符号:src,dest

源,目的操作数(下列寻址方式都可以用)

[BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n] [SI+n], [DI+n],[BP+n],[BX+n] [N], r

[] 存储器单元的内容(正常在数据段)ES:[] 附加存储器段的内容OPRD 操作数

Seg

段寄存器(CS,DS,ES,SS)im

立即数(n8位, nn16位,nnnn32位)

物理地址:

PA=(DS)×16﹢EA3.直接寻址注意:(1)直接寻址方式适用于处理单个变量。(2)直接寻址方式隐含的段寄存器是DS,8086允许段跨越,即允许使用CSSSES作为段寄存器,这时,必须在令中特别标明。操作数一般存放在存储器的数据段(DS段)中,而操作数的有效地址(偏移量)EA由指令给出。

e.g.MOVAX,[3100H](DS)=6000H,(63100H)=3050H则:(AX)=3050H另:可用符号地址代替数值地址。MOVAX,VALUE或MOVAX,[VALUE]VALUE——有效操作数单元的符号地址。如:VALUE在附加段中,则应指定段跨越。MOVAX,ES:VALUE或MOVAX,ES:[VALUE]直接寻址方式操作数在存储器(内存)中,操作数地址的16位偏移量包含在:BP、BX、SI、DI寄存器中。4.寄存器间接寻址(1)若选择SI、DI、BX作为间接寻址

操作数一般在现行数据段区域中,用(DS)作为段地址。即操作数物理地址为:物理地址PA=16d×(DS)+(BX)物理地址PA=16d×(DS)+(SI)物理地址PA=16d×(DS)+(DI)e.g.MOVBX,[DI](DS)=6000H(DI)=2000HPA=62000H(62000H)=50A0H(BX)=50A0H直接寻址方式:MOVBX,[2000H]寄存器间接寻址方式(2)若选择寄存器BP作为间接寻址操作数在堆栈段区域中,用SS寄存器的内容作为段地址。操作数物理地址:

PA=(SS)×16+(BP)e.g.MOV[BP],AX执行前:(SS)=1000H, (BP)=3000H, (AX)=1234H执行后:PA=13000H(13000H)=1234H寄存器间接寻址方式(3)用SI、DI、BX、BP作为间接寻址允许段跨越指令中可以指定段跨越前缀来取得其他段中的数据。e.g.MOVES:[DI],AXMOVDX,DS:[BP]这种寻址方法可以用于表格处理。操作数的有效地址是一个基址寄存器的内容和指令中指定位移量(displacement)之和。EA=BXBP+8位位移量16位位移量5.基址寻址(BX,BP)

用BX寄存器进行基址寻址时,默认的段寄存器为数据段DS。用BP寄存器进行基址寻址时,默认的段寄存器为堆栈段SS。

e.g.MOVAX,COUNT[BP]MOVAX,[COUNT+BP]MOVAX,COUNT+[BP]

COUNT为16位位移量。指令执行前:(SS)=5000H,(BP)=3000H,COUNT=2040H,(AX)=1234H指令执行后:

EA=5040HPA=55040H(55040H)=5548H(AX)=5548H

基址寻址方式

MOVAX,COUNT[BP]操作数的有效地址是一个变址寄存器的内容和指令中指定的8位或16位位移量之和,变址寄存器名均有指令指定。EA=SIDI+8位位移量16位位移量6.变址寻址(DI,SI)

所用寄存器为SI和DI,它们分别称为源变址寄存器和目的变址寄存器。这两个寄存器中的内容在串操作指令执行过程中会自动修改,以指向下一个操作数。默认为段寄存器为DS。e.g.MOVAX,[DI+COUNT]orMOVAX,COUNT[DI]执行指令前:

(DS)=3200H,COUNT=0456H,(DI)=1094H(334EAH)=67H(334EBH)=45H执行指令后:

EA=14EAH PA=334EAH (AX)=4567H变址寻址方式

MOVAX,COUNT[DI]操作数有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。EA=SIDI+8位位移量16位位移量BXBP+7.基址加变址寻址e.g.MOVAX,MASK[BX][DI]MOVAX,MASK[BX+DI]MOVAX,[MASX+BX+DI]执行指令前:(DS)=3000H(BX)=1346H(DI)=0500HMASK=1234H(32A7AH)=4050H执行指令后:EA=2A7AHPA=32A7AH(AX)=4050H基址加变址MOVAX,[MASK+BX+DI]用途:这种寻址方式为堆栈处理提供方便:

(BP)

栈顶(一般BP可指向栈顶)从栈顶到数组的首地址可以用位移量表示(MASK).

变址寄存器(SI)或(DI)——指向数组中某个元素。……低地址高地址[BP]栈顶DI位移量A(0)A(1)A(2)A(n)8086寻址方式小结立即数寻址寄存器寻址直接寻址寄存器间接寻址基址寻址变址寻址基址加变址寻址可执行目标文件:“.EXE”目标代码文件:“.OBJ”,没有确定的物理地址,“.ASM”若有错,给出信息源程序文件:“.ASM”“.asm”——编辑edit汇编得到结果,观察结果是否正确,错误链接若干.OBJ调试MS-DOS下7.1概述附:(1)DOS命令行操作过程:C:\WINDOWS\>cd\C:\>cd

masn(进入masn文件夹)C:\MASN>edit(编辑源文件)C:\MASN>masm

文件名.asm

(汇编,生成.obj目标文件)C:\MASN>link文件名.obj

(链接,生成.exe可执行文件)C:\MASN>debug文件名.exe(调试可执行文件)-u(反汇编,记录数据段段基址的值)-g(连续执行)-d数据段段基址:0(显示数据段数据)-q(退出DEBUG)c:\masm>exit(退出命令行操作)************************************************datasegment

;数据段开始xdb4

ydb3

zdb?

dataends;数据段结束*************************************************codesegment;代码段开始assumecs:code,ds:datastart:mov

ax,data

;主程序开始

mov

ds,ax

;数据段段基址→DS

mov

al,x

;x→al(al=4)

addal,y

;al+y→al(al=7)

mov

z,al

;al→z(x+y=7→z)

addz,30h;结果转换为ASCII码(z=37h)

mov

dl,z;z→dl(dl=37h)

movah,2;ah=2

int21h;2号调用,显示输出结果

movah,4ch;4ch号调用,

int21h;过程终止返回操作系统

codeends

;代码段结束**********************************************************

endstart;主程序结束7.2伪指令和宏指令格式:[名字]定义符[参数1][;注释]一、伪指令语句无冒号作用:指导汇编程序进行汇编,不产生目标代码,不占用内存功能:提供如下信息:如何分段,段的定义,段间关系,模块定义,模块间关系,数据定义,开始汇编,结束汇编不可缺省常数、字符串、常量名、变量名,标号,专用符号1.符号定义伪指令2.数据定义伪指令3.段定义伪指令4.段寄存器说明伪指令5.过程定义伪指令6.模块定义伪指令7.定位伪指令伪指令等值语句

符号名EQU表达式表达式类型:常数或数值,地址,变量、标号、寄存器、指令助记符1.符号定义伪指令(EQU,=)e.g.COUNTEQU5NUMEQUCOUNT+5e.g.ADDREQUDS:[DI+7]e.g.LABLEEQUSTART+BETCNTEQUBXCBDEQUSUB注:EQU定义的符号名不能被重新定义

等号语句

符号名=表达式e.g.NUM=6NUM=NUM+2注:与EQU区别在于符号名可以重新定义

数据定义语句符号名Dn

表达式DB、DW、DD、DQ、DT字节、字、双字、4字、5字的变量。

2.数据定义伪指令(DB,DW,DD,DQ)表达式类型:(1)数值常数:十进制、八进制、十六进制、二进制等,缺省形式是十进制;存储为二进制补码形式(2)字符常量,用单引号括起来,被存储的是该字符的ASCII码;(3)符号常量,必须是预先已定义的符号;(4)符号“?”,表示预留空间,内容不定;

e.g.定义赋初值的变量

xxDB1,-1,0fcH

yyDW1,-1,0fcH

zzDD1,-1,0fcH注意:(1)DB定义的数据,每个数据元素占据1个存储单元;DW定义的数据,每个数据元素占据2个存储单元;(2)字数据存储时,低字节存储在低地址单元中,高字节存储在高地址单元中;e.g.定义字符串变量(只能用DB定义)str1DB'TsingHua'str2DB'INPUT:',0dH,0aH,'$'注意:3个及其以上的字符,只能用DB定义str1DW‘abcd’;错str2DD‘abcd’;错str1DW‘ab’,‘cd’;对,每组字符串中前一字符作高字节,后一字符作低字节。str2DD‘ab’;对,前一字符存放于第二字节,后一字符存放于第一字节,两个高字节存放00H。str1str25473696e67487561494e5055543a0d0a24‘T’‘s’‘i’‘n’‘g’‘H’‘u’‘a’‘I’‘N’‘P’‘U’‘T’‘:’0dH0aH‘$’e.g.利用DW伪指令可存放偏移地址,DD伪指令可存放偏移地址和段地址

XXDWOFFSETXLISTDDLABELOFFSETX为XX在其段内的偏移地址LABEL为双字,一字为偏移地址,一字为段地址当e.g.表达式中出现‘?’,分配并保留存储空间

ABCDB?,?DEFDW?,50,?----32H00H--ABCDEFe.g.D1DB3DUP(11,?)D2DW2DUP(4,?)D3DB2DUP(‘AB’,2,DUP(8))0BH-0BH-0BH-D104H00H--04H00H--D241H42H08H08H41H42H08H08HD3

数据复制语句重复的次数重复的内容nDUP(表达式)段名

SEGMENT

[定位类型][组合类型][‘类别’]…段名

ENDS

[定位类型]说明段的起始地址应有怎样的边界值BYTE:********************B,即段可以从任何地址开始;WORD:*******************0B,即段的起始地址必须为偶地址;PARA:****************0000B,即段从节边界开始,每16个字节为1小段,所以,其起始地址必为16的倍数。PAGE:************00000000B,即段从页边界开始,每256个字节为1页,所以,其起始地址必为256的倍数。

3.段定义伪指令PUBLIC:将同类别名段组装在一起形成一个逻辑段;STACK:与PUBLIC一样,只用于堆栈段。在汇编及连接后,系统自动为SS及SP分配值,在可执行程序中,SP初值指向栈底。COMMON:同名段从同一个内存地址开始装入。所以,各个逻辑段将发生覆盖。连接以后,该段长度取决于同名段中最长的那个,而内容有效的是最后装入的那个。MEMORY:与PUBLIC同义,只不过MEMORY定义的段装在所有同名段的最后。若连接时出现多个MEMORY,则最先遇到的段按组合类型MEMORY处理,其他段组合类型按PUBLIC处理。ATexp:段地址为表达式exp的值(长度为16位)。此项不能用于代码段。e.g.AT7000H;定位的段地址为7000H,不用于代码段[组合类型]说明程序连接时的段合并方法[‘类别’]:不能与程序中变量、标号和其它符号名相同。汇编程序链接时只使同类别的段发生关联,并组成段组的名字,如‘STACK’,‘CODE’。ASSUME

段寄存器名:段名[,段寄存器名:段名…]

e.g.ASSUMEDS:DSEG,CS:CSEG,ES:ESEG,SS:SESGe.g.ASSUMECS:CODE,DS:DATA,ES:DATAAttention:该伪指令只是指示各逻辑段使用段寄存器的情况,并没有对段寄存器的内容进行赋值。DS、ES的值必须在程序段中用指令语句进行赋值,而CS、SS由系统负责设置,程序中也可对SS进行赋值,但不允许对CS赋值。4.段寄存器说明伪指令例

用程序实现1234H+5678H

dataSEGMENTvalueDW1234H,5678HresultDW?

dataENDS

codeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给DS赋值

MOVDS,AXMOVAX,value;取数

ADDAX,value+2;两数相加

MOVresult,AX;保存结果

MOVAH,4CH;返回DOSINT21H

codeENDSENDstart34H12H78H56H--

value

result注意:PROC与ENDP必须成对出现;NEAR时表示段内调用,FAR表示段间调用,未指定时,认为是NEAR一个过程中可以有一个以上的返回指令RET,它们不必放在过程的最后。调用时Call过程名过程名

PROC

类型属性[FAR,NEAR]…

RET…过程名

ENDP

5.过程(子程序)定义伪指令注意:NAME和END成对出现程序开始可以用NAME或TITLE为模块取名字标号指示程序开始执行的起始地址,如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用END而不必指定标号。NAME模块名

…END[标号]6.模块定义伪指令功能:指定其后的程序段或数据块的起始地址的偏移量。数值表达式的值是一个无符号数。ORG数值表达式自动排版语句

PAGE行数,行字数建立标题语句

TITLE标题建立小标题语句

SUBTIL小标题7.定位伪指令(ORG)8.列表伪指令1.宏定义和宏名字(宏指令)宏名字MACRO[形式参数1,形式参数2,…]…ENDM宏定义:为需要多次重复书写的程序段确立(定义)一个名字。宏调用:经过宏定义的程序段在此后重复书写时用宏名字代替。宏展开:汇编时,汇编程序遇到宏名字将其对应的宏体展开。宏体二、宏指令语句

宏指令是程序中具有独立功能的一段程序代码。在汇编语言中,如果需要多次使用同一段程序,可以将这个程序段定义(宏定义)为一个宏指令,然后每次需要时,即可简单地用宏指令名来代替(宏调用),避免重复书写,也使程序简洁、易读。e.g.实现两个八位二进制数相乘,结果送BX所指单元MULTPLYMACROOPR1,OPR2PUSHAXMOVAL,OPR1IMULOPR2MOV[BX],AXPOPAXENDM宏名字形式参数宏体宏调用…MULTPLY3AH,06H…MULTPLY0C2H,6BH…宏展开…PUSHAXMOVAL,3AHIMUL06HMOV[BX],AXPOPAX…

注意:宏调用前必须进行宏定义宏调用与子程序调用完全不同

子程序在执行时,每调用一次都要保护和恢复返回地址及寄存器的内容等,这些操作都额外增加了时间。因而导致CPU执行程序的时间长,速度慢。而宏指令在执行时不存在保护和恢复返回地址及寄存器内容的问题,执行的时间短,速度快。因而从程序执行时间长短这个角度来说,宏指令优于子程序。

当要重复执行的程序不长,重复次数又多时,速度是主要问题,通常用宏指令;而要重复执行的程序较长,重复次数又不是太多时,额外操作所附加的时间就不明显了,节省内存空间应视为主要问题,通常采用子程序结构。8086的指令系统8086的指令系统中共有92种基本指令,可以分成6个功能组:1. 数据传输2. 算术运算3. 逻辑运算和移位指令4. 程序转移5. 字符串操作(了解)6. 处理器控制(了解)八位寄存器:AH,AL,BH,BH,BL,CH,CL,DH,DL十六位通用寄存器:AX,BX,CX,DX,SP,BP,SI,DI堆栈指针 SP指令指针 IP(或PC)标志位 Flags目的和源变址寄存器 DI,SI段寄存器 CS,DS,ES,SS通用寄存器 rAL或AX(取决于操作数长度)acc指令系统使用的符号:src,dest

源,目的操作数(下列寻址方式都可以用)

[BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n] [SI+n], [DI+n],[BP+n],[BX+n] [N], r

[] 存储器单元的内容(正常在数据段)ES:[] 附加存储器段的内容OPRD 操作数

Seg

段寄存器(CS,DS,ES,SS)im

立即数(n8位, nn16位,nnnn32位)功能:

负责把数据、地址或立即数传送到寄存器或存储单元。特点:

它是计算机最基本、最重要的一种操作,使用比例最高。种类(分四种):4.2数据传送指令通用传送指令输入输出指令目标地址传送指令标志位传送指令8086提供方便灵活的通用的传送操作,适用于大多数操作数。一、

通用传送指令

通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数的指令。通用传送指令包括:

1、传输指令MOV 2、堆栈操作指令PUSHPOP 3、交换指令XCHG 4、换码指令XLAT

MOV dest, src;(dest)

(src)

目的 源 目的

源1.MOV功能:(1)把一个字节(B)或一个字(W)操作数由源传送至目的。(2)实现:

寄存器

寄存器/存储器立即数

寄存器/存储器寄存器/存储器

段寄存器①CPU内部寄存器之间的数据的任意传送(除了代码段寄存器CS和指令指针IP以外)。MOVDL,CH ;8位寄存器

8位寄存器MOVAX,DX;16位寄存器

16位寄存器MOVSI,BP;16位寄存器

16位寄存器MOVDS,BX ;通用寄存器段寄存器MOVAX,CS

;段寄存器

通用寄存器

段寄存器之间不能传送。 MOVES,DS;错

MOVAX,DS MOVES,AX;对。立即数传送至CPU内部通用(专用)寄存器组

用于给寄存器(AX、BX、CX、DX、BP、SP、SI、DI)赋初值。

不能直接给段寄存器赋值例: MOVCL,04H ;立即数

8位寄存器MOVAX,03FFH ;立即数

16位寄存器MOVWORDPTR[SI],057BH;立即数存储器MOVBYTEPTRMEM,5;立即数存储器例:MOVDS,2000H错。MOVAX,2000HMOVDS,AX对

CPU内部寄存器(除CS和IP外)与存储器(所有寻址方式)之间数据传送。可以实现一字节或一个字的传送。MOVMEM,AX ;累加器

存储器,直接寻址MOVMEM,DS;段寄存器

存储器,直接寻址MOV[BX],CX;寄存器

存储器,基址寻址MOVAX,[SI];存储器

累加器,变址寻址MOVDS,MEM;存储器

段寄存器,直接寻址MOVCX,[BX][SI];存储器

累加器,基址加变址

存储单元(内存)之间不能直接传送 MOVMEM2,MEM1错

MOVAX,MEM1对

MOVMEM2,AX对注意CS和IP的使用:CS和IP不能作为目的操作数,可以作为源操作数。例: MOVCS,AX;错

MOVAX,CS;对。

MOVIP,AX;错

MOVAX,IP;对。(1)CS和IP(2)段地址的默认

BX、SI、DI寻址默认段地址寄存器为DS,

BP寻址默认段地址寄存器SS。(3)【了解】凡是遇到给SS赋值指令,系统自动禁止外部中断,执行本条指令和下条指令后,恢复对SS寄存器赋值前的中断开放情况。这样做为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程出现中断。在修改SS和SP的指令之间不要插入其他指令。(4) 所有通用传送指令不影响标志位。(除SAHF、POPF指令以外)。堆栈操作指令。(1)堆栈堆栈——按照先进后出原则组织的一段内存区域,特点:

①下推式的(规定堆栈设置在堆栈段内)改变SP的内容②随着推入堆栈内容增加,SP的值减小。③先进后出工作原则(LastInFirstOut简称LIFO)2.PUSH,POP堆栈在内存中的情况:可以用一条立即数传送指令给SP赋值,确定SP在SS段中的初始位置。例:设:(SS)=9000H,堆栈段为64KBMOVSP,0E200H;(SP)=0E200H则:整个堆栈段的物理地址范围为:90000H~9FFFFH

栈顶的物理地址为:9E200H堆栈在内存中的情况如右图所示:堆栈在内存中的情况(2)堆栈操作指令

(堆栈操作指令有两条):入栈指令格式:PUSHsrc ;(SP)

(SP)-2

;((SP)+1,(SP))

(src)修改堆栈指针,把一个字的源操作数

压入堆栈顶部e.g.PUSHAX

出栈指令

格式:POPdest ; (dest)

((SP)+1,(SP))

;(SP)

(SP)+2把现行SP所指向堆栈顶部的一个字

指定的目的操作数,同时进行修改堆栈指针的操作。

e.g.POPBX(3)堆栈用途:

存放CPU寄存器或存储器中暂时不使用的数据,使用数据时将其弹出;调用子程序,响应中断时都要用到堆栈。调用子程序(或过程)或发生中断时要保护断点的地址,子程序或中断返回时恢复断点。注意:SP——堆栈指针,始终指向栈顶。

SP初值用MOVSP,im来设定。

存放CPU寄存器或存储器中暂时不使用的数据,PUSHAX ;将(AX)入栈(AX)(AX)使用数据时将其弹出:

POPBX

调用子程序(或过程)或发生中断时要保护断点的地址,子程序或中断返回时恢复断点。子程序嵌套断点地址压入和弹出情况

应用时注意:①堆栈操作都按字操作。②PUSH,POP指令的操作数可能有三种:寄存器(通用寄存器,地址指针,变址寄存器),段寄存器(CS除外,PUSHCS合法,POPCS非法),存储器。③执行PUSH指令,(SP)-2

(SP),低字节放在低地址,高字节放在高地址。随着推入堆栈内容增加,堆栈就扩展,SP的值减少,但SP总是指向栈顶。④堆栈工作原则后进先出。

PUSH,POP指令应该成对使用,保持堆栈原有状态。堆栈应用举例:

例:用BP的基址指令代替POP指令

…MOVBP,SPPUSHAXPUSHBXPUSHCX …MOVCX,[BP-6]

MOVBX,[BP-4]MOVAX,[BP-2] …ADDSP,6例:压入堆栈的内容与弹出内容顺序相反…PUSH AXPUSHBXPUSHCX…POPCXPOPBXPOPAX 格式:XCHGdest,src ;(dest)

(src)把一个字节或一个字的源操作数与目的操作数相交换。3.交换指令XCHG

寄存器之间、寄存器和存储器之间

允许字或字节操作,不影响标志位。×存储器之间不能交换,两个操作数中必须有一个在寄存器中;×

段寄存器不能作为一个操作数;应用举例:

XCHGBL,DL XCHGAX,SI XCHGCOUNT[DI],AX

XCHG[BX],[DI] (错)

XCHGDS,AX(错)该指令不影响标志位。格式:XLAT;(AL)←((BX)+(AL))起始地址预存在BX中,AL中存放的是偏移地址。XLAT指令使用方法:

先建立一个字节表格;

表格首偏移地址存入BX;

需要转换代码的序号(相对与表格首地址位移量)存入AL;(表中第一个元素的序号为0)

执行XLAT指令后,表中指定序号的元素存于AL中。(AL)为转换的代码。4.换码指令XLATXLAT指令应用:

若把字符的扫描码转换成ASCII码;或数字0~9转换成7段数码所需要的相应代码(字形码)等就要用XLAT指令。例:内存的数据段中有一张十六进制数字的ASCII码表。

首地址为:Hex_table,欲查出表中第10个元素(‘A’)执行指令序列:MOVBX,OFFSETHex_tableMOVAL,0AHXLAT假设: (DS)=0F000H,

Hex_table=0040H

(AL)=0AH执行XLAT以后:(AL)=41H=(0F004AH), 即“A”的ASCII码。30H31H32H...39H41H42H...46H...Hex_tableHex_table+1Hex_table+2Hex_table+0AHHex_table+0BHHex_table+0FH'F''B''A''9''1''2''0'16进制数的ASCII码表输入输出指令共两条,用于CPU和外设之间的数据传送

1.IN

2.OUT

输入指令用于CPU从外设端口接收数据(读),

输出指令用于CPU向外设端口发送数据(写)。

无论接受还是发送数据,必须通过累加器AX(字)或AL(字节),又称累加器专用传送指令。

输入、输出指令不影响标志位。二、

输入输出指令

每个外设要占几个端口:数据口,状态口和控制口。每个端口像存储单元一样要赋予一个地址,称端口地址。信息交换要通过端口:在IBMPC机里,可以配接许多外部设备,每个外设与CPU之间交换数据、状态信息和控制命令,每一种信息交换都要通过一个端口来进行。端口数:外部设备最多有65536=64K个I/O端口。 由A0~A15译码形成。端口号:端口号(即外设端口地址)为

0000H~FFFFH。直接寻址方式:外设端口地址(端口号)直接用8位立即数给出,寻址范围00H~FFH(0~255)间接寻址方式:当端口地址(端口号)>255(FFH)时,只能使用间接寻址方式。必须先把端口号放到DX寄存器中,通过DX寻址。格式:INacc,port;(acc)

(port)具体形式有四种:

INAL,data8;端口地址8位,输入一个字节

INAX,data8;端口地址8位,输入一个字

INAL,DX ;端口地址16位,输入一个字节

INAX,DX ;端口地址16位,输入一个字必须通过累加器AX(字)或AL(节)输入数据。In输入指令(外设→CPU,CPU读取外设数据)格式:OUTport,acc ;(port)

(acc)具体形式有四种:

OUTdata8,AL;端口地址8位,输出一个字节

OUTdata8,AX;端口地址8位,输出一个字

OUTDX,AL;端口地址16位,输出一个字节

OUTDX,AX;端口地址16位,输出一个字必须通过累加器AX(字)或AL(字节)输出数据。Out输出指令(CPU→外设,CPU向外设写数据)例1:实现端口(28H)→(DATA_WORD)

INAX,28H MOVDATA_WORD,AX例2:从端口3FCH送一个字到AX寄存器

MOVDX,3FCH INAX,DX;(AL)←(3FCH), (AH)←(3FDH)

例3:实现将(AL)→端口(05H) OUT5,AL;(05H)←(AL)三、

目的地址传送指令8086/8088提供三条专用传输地址码指令,传送操作数的段地址和偏移地址。其中:源操作数:为内存单元目的操作数:寄存器(通用,专用)1、LEA(LoadEffectiveAddress)2、LDS(LoadpointerusingDS)3、LES(LoadpointerusingES)格式:LEAreg16,mem16;EA(reg16)功能:取有效地址(偏移地址),用于写进地址指针。把指令中指定的存储器操作数有效地址装入指定的寄存器。例:设(BX)=0400H,(SI)=003CH LEABX,[BX+SI+0F62H]执行指令后:

EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH(BX)=139EH1.LEA注意:设

(DS)=3000H BUFFER=1000H (31000H)=0040H(1)LEA指令与MOV的区别

LEABX,BUFFER

;(BX)=1000H MOVBX,BUFFER

;(BX)=0040HLEA指令与MOV等价

LEABX,BUFFER;(BX)=1000HMOVBX,OFFSETBUFFER

;(BX)=1000H(2)LEA

指令中的目标寄存器必须是16位的通用寄存器,源操作数必须是一个存储器(内存)。(3)请思考下列指令的正、误

LEADX,[BX][SI] LEADX,AX格式:LDSreg16,mem32;(reg16)←(EA) (DS)←((EA)+2))功能:将指令指定32位(4B)地址指针送指令指定寄存器和DS(取段地址和偏移地址)。将指令指定mem32单元的前两个单元内容(16位偏移量)装入指定通用寄存器,把后两个单元内容(段地址)装入到DS段寄存器。用于写远地址指针。2.LDS例:假设:

(DS)=0C000H指令: LDSSI,[0010H]执行指令后:(SI)=0180H(DS)=2000H

格式:LESreg16,mem32;(reg16)←(EA) ;(ES)←((EA)+2))功能:与LDS类似。将指令指定mem32单元的前两个单元内容(16位偏移量)装入指定通用寄存器,把后两个单元内容(段地址)装入到ES段寄存器。用于写远地址指针。3.LES例:假设:

(DS)=B000H (BX)=080AH指令: LESDI,[BX]执行指令后: (DI)=05A2H (ES)=4000H综合举例:设:

(DS)=5000HTABLE=1000H分析下列指令执行结果:

(1)MOVBX,TABLE(2)MOVBX,OFFSETTABLE(3)LEABX,TABLE(4)LESBX,TABLE(5)LDSBX,TABLE采用了隐含寄存器(AH、Flags)操作数方式。8086有四条标志传送操作指令:1. LAHF2. SAHF3. PUSHF4. POPF

四、

标志传送指令格式:LAHF;(AH)←(PSW的低字节)功能:标志寄存器低八位

(AH)。LAHF指令操作图示意1.LAHF2. SAHF

格式:SAHF;(PSW的低字节)←(AH) 功能:(AH)送标志寄存器低八位。3. PUSHF

格式:PUSHF ;(SP)←(SP)-2

((SP)+1,(SP))←(PSW) 功能:标志进栈。4. POPF

格式:POPF;(PSW)←((SP)+1,(SP)) (SP)←(SP)+2

功能:标志出栈。注意:(1)标志位的影响LAHF、PUSHF不影响标志位,SAHF、POPF由装入的值确定标志位的值,即影响标志位。(2)PUSHF、POPF用于保护调用过程前(PSW),过程返回后恢复。例:

PUSHAX PUSHCX PUSHF CALLTRANS

POPFPOPCXPOPAX…内容:

8086/8088提供加、减、乘、除、转换五种基本算术操作;

利用十进制调整指令和ASCII调整指令对BCD码表示的十进制数进行算术运算;

对带符号数与无符号数进行乘、除运算。(一)加法指令(Arithmetic)(二)减法指令(Subtraction)(三)乘法指令(Multiplication)(四)除法指令(Division)(五)转换指令4.3算术运算指令特点:

大部分都影响标志位,不同指令影响不同:(1)加、减法指令影响SF,ZF,AF,PF,CF,OF;(2)加1和减1指令不影响CF;(3)乘法指令影响CF,OF;(4)除法指令使大部分标志位的状态不确定;(5)对BCD码调整指令对标志位的影响不同;(6)转换指令对标志位无影响

都可以用于字节、字的运算;

双操作数指令除源为立即数外,其余必须有一个操作数 为寄存器;单操作数指令不能为立即数。

一、

加法指令8086具有3种加法操作指令:1.ADD(Addition)加法指令2.ADC(Addwithcarry)带进位加法指令3.INC(Incrementby1)加1指令1.ADD加法指令指令格式:ADDdest,src;(dest)←(dest)+(src)Src:立即数,寄存器,存储器Dest:寄存器,存储器e.g.ADDCL,10;寄存器+立即数ADDDX,SI;寄存器+寄存器ADDAX,MEM;寄存器+存储器ADDDATA[BX],AL;存储器+寄存器ADDBYTEPTRALPHA[DI],30H;存储器+立即数特点:

可以进行8位、16位的无符号数和带符号数的加法运算;源操作数和目标操作数不能同时为存储器,不能为段寄存器;

指令影响标志位的情况:OF=1, 8位带符号数相加,和超出范围(-128~+127),16位带符号数相加,和超出范围(-32768~+32767);CF=1,8位无符号数相加,和超过255,

16位无符号数相加,和超过65535。其他条件标志(SF,AF,PF,ZF)根据定义设定。e.g. MOVAL,7EH ;(AL)=7EH MOVBL,5BH ;(BL)=5BH ADDAL,BL ;(AL)=7EH+5BH=D9H影响标志位的情况: SF=1 ,结果最高位=1ZF=0 ,结果不等于0AF=1 ,D3位向D4有进位PF=0 ,”1”的个数为奇数CF=0 ,无进位OF=1 ,和超过+127(两个正数相加,结果为负;反之亦是)格式:ADCdest,src

;(dest)←(dest)+(src)+CF

CF:

进位标志CF的现行值(上条指令CF值)特点:与ADD同。用途:主要用于多字节运算中。类型举例:

ADCCX,300 ;寄存器+立即数+CF ADCAL,BL ;寄存器+寄存器+CF ADCDX,COUNT[SI] ;寄存器+存储器+CF ADCBLOCK[DI],BX ;存储器+寄存器+CFADCBYTEPTRMEM,6 ;存储器+立即数+CF2.ADC带进位加法指令【例】设DX=4652H,执行指令ADDDX,7A08H后,DX=?,CF=?,SF=?,ZF=?,OF=?根据计算:DX=C05AH,结果不为0,ZF=0;运算结果没有进位,CF=0;运算结果的最高位为1,SF=1;加数、被加数均为正数,而结果为负数,产生溢出,OF=1。格式:INCdest

;(B/W),(dest)←(dest)+1

dest:寄存器、存储器。不能是段寄存器。功能:对指定的目标操作数+1

操作数单元。用途:用于在循环程序中修改地址指针和循环次数。标志位影响情况:影响SF,ZF,AF,PF,OF。

不影响CF。3.INC加1指令例:

INCDL ;8位寄存器+1

INCSI

;16位寄存器+1

INCBYTEPTR[BX][SI]

;存储器+1(字节操作)

INCWORDPTR[DI]

;存储器+1(字操作)

INCDS ;错操作数类型:可以是寄存器,存储器。不能是段寄存器。

8086有5条减法指令:1、SUB(Subtraction)减法指令2、SBB(Subtractionwithborrow)带进位减法指令3、DEC(Decrementby1)减1指令4、NEG(Negate)求补指令5、CMP(Compare)比较指令二、

减法指令(Subtraction)指令格式::SUBdest,src;(dest)←(dest)-(src)

Src:立即数,寄存器,存储器。

Dest:寄存器,存储器。例: SUBAL,37H ;寄存器-立即数SUBBX,DX ;寄存器-寄存器SUBCX,VAR1 ;寄存器-存储器 SUBARRAY[SI],AX ;存储器-寄存器SUBWORDPTRALPHA[BX][DI],512H;存储器减立即数1.SUB减法指令例: SBBBX,100H ;寄存器-立即数-CFSBBCX,DX ;寄存器-寄存器-CFSBBAL,DATA1[SI] ;寄存器-存储器-CFSBBDISP[BP],BL ;存储器-寄存器-CFSBBBYTEPTRALPHA[SI+6],96H;存储器-立即数-CF指令格式:SBBdest,src;(dest)←(dest)-(src)-CF

CF:进位标志CF的现行值(上条指令CF值)

Src:立即数,寄存器,存储器。

dest:寄存器,存储器。指令影响标志位、B/W数运算情况同SBB用途:用于多字节数相减2.SBB带借位减法指令指令格式:

DECdest;(B/W) (dest)←(dest)-1

dest:寄存器、存储器。不能是段寄存器。功能:对指定的目标操作数-1

操作数单元。用途:用于在循环程序中修改地址指针和循环次数。标志位影响情况:影响SF,ZF,AF,PF,OF。

不影响CF。3.DEC减1指令指令格式:

NEGdest;B/W,(dest)←0-(dest)

dest:寄存器 、存储器。操作:把操作数按位求反后末位+1。(dest)←0FFFFH-(dest)+1影响标志:AF、CF、OF、PF、SF、ZF。CF: 操作数为0时求补,CF=0;一般使CF=1.OF:对-128或-32768求补,OF=1;否则OF=0.4.NEG(Negate)求补指令MOVAX,0FF64H;(AH=0FFH,AL=64H)NEGAL;AX=0FF9CH(0-64H=9CH)SUBAL,9DH;AX=0FFFFH(9CH-9DH=0FFH)NEGAX;AX=0001H(0-0FFFFH=1H)DECAL;AX=0NEGAX;AX=0例1:

例2

设DL=78H,执行指令NEGDL后,DL=?,CF=?,SF=?,ZF=?,OF=?分析:求补有两种方法:一是将0减去源操作数;二是将源操作数求反后再加1。执行NEG指令后,OF=0。此外,计算机内部采用第一种方法,所以CF=1。

运行结果:DL=88H,CF=1,SF=1,ZF=0,OF=0。指令格式:

CMPdest,src

;B/W(dest)-(src)

结果不送,影响标志位。src:立即数,寄存器,存储器。dest:寄存器,存储器。影响标志:AF、CF、OF、PF、SF、ZF。

CMPAL,0AH ;寄存器与立即数比较CMPCX,DI ;寄存器与寄存器比较CMPAX,AREA1 ;寄存器与存储器比较CMP[BX+5],SI ;存储器与寄存器比较CMPWORDPTRALPHAGAMMA,100H;存储器与立即数比较5.CMP比较指令

用比较指令来比较两个数之间的关系:

两者是否相等,两个数中哪个大。(1)根据ZF标志,判断两者是否相等;(2) 根据CF标志,判断两个无符号数的大小;(3) 用SF、OF标志,判断两个带符号数的大小。

(1)根据Z标志,可判断两者是否相等例:CMPAX,BX

ZF=1,(AX)=(BX),两者相等

ZF=0,(AX)=(BX),两者不相等(2) 根据CF标志,判断两个无符号数的大小例:比较AX,BX寄存器,将大数

(AX)

CMPAX,BX JNCNEXT;CF=0转NEXT XCHGAX,BXNEXT:……CF=0,(AX)>(BX);CF=1,(AX)<(BX)CMP指令应用举例:带符号数找最大值思路:

第一个数取出

(AX),

取出第二个数(第二个字单元内容)与(AX)比较: (AX)>第二个数,不做交换,否则,(第二个字单元内容)

(AX)。再取第三个数,

经过99次比较,在(AX)中得到最大数。

若自BLOCK开始的内存缓冲区中,有100个带符号数。找出最大值。并存放到MAX单元中。指令助记符格式操作无符号数乘MULMUL

srcsrc为字节:AX←AL×srcsrc为字:DXAX←AX×src符号数乘IMULIMUL

src无符号数除DIVDIV

srcsrc为字节:AL←AX÷(src)的商,AH←AX÷(src)的余数src为字:AX←DXAX÷(src)的商,DX←DXAX÷(src)的余数符号数除IDIVIDIV

srcsrc可以为:reg,mem,不允许为立即数。三、

乘除指令(1)乘法指令MUL、IMUL8086/8088可实施字节与字节乘、字与字乘,指令中给出乘数,被乘数隐含。乘数可以是寄存器或内存操作数,不能为立即数。

字节乘时,被乘数隐含为寄存器AL,乘积的高8位存于寄存器AH中,低8位存于寄存器AL中。字乘时,被乘数隐含为寄存器AX,乘积的高16位存于寄存器DX中,低16位存于寄存器AX中。

乘法指令仅影响标志位OF,CF,对其它标志位无定义。无符号数乘时,当积的高8位(字节乘)或积的高16位(字乘)为0,则OF=CF=0;如果不为0,则OF=CF=1。符号数乘时,当积的高8位(字节乘)或积的高16位(字乘)是低字节(字节乘)或低字(字乘)的符号扩展时,OF=CF=0;否则,OF=CF=1。

【例】64H×0A5H(1)无符号数乘,即100×165=16500DMOVAL,64H;AL=64H=100DMOVBL,0A5H;BL=0A5H=165DMULBL;AX=4074H=16500D,OF=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论