新编1632位微型计算机原理及应用(李继灿主编)第3章课件_第1页
新编1632位微型计算机原理及应用(李继灿主编)第3章课件_第2页
新编1632位微型计算机原理及应用(李继灿主编)第3章课件_第3页
新编1632位微型计算机原理及应用(李继灿主编)第3章课件_第4页
新编1632位微型计算机原理及应用(李继灿主编)第3章课件_第5页
已阅读5页,还剩142页未读 继续免费阅读

下载本文档

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

文档简介

第3章指令系统3.1概述3.280486寻址方式3.380486标志寄存器3.4汇编语言语法规则之一3.580486基本集指令3.1概述

指令:通知CPU执行某种操作的“命令”,CPU全部指令的集合,称为指令系统指令的书写格式目标指令(机器指令)用一串0,1代码书写注意:硬件只能识别,存储,运行目标指令符号指令:用规定的助记符,规定的书写格式书写的指令大多数指令由操作码和地址码2部分组成操作码:通知CPU执行什么操作(唯一)

地址码:指令的操作对象所存放的位置(根据操作对象的多样性其表现形式很多)

教材上把地址码称为操作数3.指令的组成相应的编码规则对指令进行编码操作码的编码地址码的编码4.目标程序的生成

汇编源程序编辑、编译、链接可执行的机器指令程序(目标程序)5.指令长度486指令长度(机器指令长度)为1~16字节规定:多字节指令占用连续的内存单元,存放指令第一字节的内存地址,称为“指令地址”。CPU只能识别,存储,运行目标指令,而用机器指令编程非常困难。于是早期的专家们发明了符号指令,再经过软件把符号指令→机器指令。图示如下:6.指令存放

如:12345H单元中有一条指令MOVAX,6789H67H89HB8H12345H:操作码操作数6789HMOVAX,6789H先写操作码,再写操作数。多字节操作数连续存放。存放规律:低位字节存放在低地址单元,高位字节存放在相邻的高地址单元7.符号指令的书写格式标号:操作码助记符空格操作数助记符;注释如:NEXT:ADDAX,BX;AX+BX→AX INCSI;SI+1→SI标号:以字母开头,后跟字母,数字,下划线,长度≤31字符标号又称符号地址,代表该指令的逻辑地址。可有可无,设置是为了程序的转向注解:以“;”开头,不执行,打印程序清单时照原样打印,“系统保留字”不能做标号。 486有3类7种寻址方式立即寻址方式:获得立即数寄存器寻址方式:获得寄存器操作数存储器寻址方式:获得存储器操作数(内存操作数))学习重点:怎样在符号指令中,正确的描述各种寻址方式1.立即寻址-操作数包含在本条指令中,是指令的一部分,完整地取出该条指令,也就获得了操作数。如:MOV EAX,12345678HMOV BL,10101010B ;AAH→BLMOV CL,–4 ;FCH→CLMOV DL,’A’ ;41H→DLADDAL,0C8H MOV SI,3*5 ;15→SI上例源操作数即为立即寻址,立即数书写规定:立即数以数字开头,以A~F开头的16进制数,必须前缀0。程序员可以按自己的习惯书写立即数,各种合法的立即数经汇编后,一律自动转换成等值的二进制数,负数用补码表示。立即数的数制用后缀表示,B表示二进制数,H表示十六进制数,

D或缺省为十进制数,单引号括起来的字符编译成相应的ASCII码。可以用+–*/

组成立即数表达式2.寄存器寻址-操作数在CPU的某个寄存器中,符号指令中直接写出寄存器名称。如:MOVAX,DS ;DS内容→AXINCSI;SI+1→SI(Increase增量)DECDI ;DI–1→DI(Decrease减量)如:下述6条指令,目标操作数即为寄存器寻址

MOV EAX,12345678HMOV BL,10101010B ;AAH→BLMOV CL,–4 ;FCH→CLMOV DL,’5’ ;35H→DLADDAL,0C8H MOV SI,3*5 ;15→SI存储单元逻辑地址表达式的一般形式段寄存器:偏移地址有5种寻址方式段超越前缀助记符,访问约定的逻辑段可以省略

实模式下,物理地址=段寄存器×24+偏移地址(1)直接寻址①地址表达式的格式1:段寄存器:[偏移地址]

②地址表达式的格式2:段寄存器:变量名

用变量名代表存储单元的有效地址

如:MOV AL,ES:[2CH]从ES附加段偏移地址为2CH的单元取数→AL如:MOVAX,DS:[1234H]从数据段偏移地址为1234H的单元取一字→AX这种格式很少使用,∵通常情况下,程序员不知道某单单元的偏移地址(本书仅在P349有过一次应用) 设数据段XX字节单元的内容为11HES附加段YY字单元的内容为2233HMOVAL,DS:XX;取数据段XX字节单元的内容→AL或MOVAL,XX;∴AL=11HMOV AX,ES:YY;取ES附加段YY字单元的内容→AX或MOVAX,YY;∴AX=2233H说明:汇编语言允许为某单元起一个“名字”,这个名字就称为该单元的“变量名”,经汇编之后,变量名有段基址和偏移量两种属性。变量名是唯一的,程序中不能有重复的变量名,∴“段寄存器:”可以省略。

③间址寄存器和约定访问的逻辑段486规定:间址寄存器约定访问的逻辑段BP堆栈段16位寻址方式BX,SI,DI数据段EBP,ESP堆栈段32位寻址方式EAX~EDX,ESI,EDI数据段④举例:设数据段BUF字节单元的内容为55H,取出该数→AL解1:用BX间址

MOVAX,数据段段基址 MOVDS,AX MOVBX,BUF单元的有效地址 MOVAL,DS:[BX];AL=55H等价于:MOVAL,[BX] 由于BX间址,约定访问的是数据段,∴“DS:”可省解2:用BP间址

MOVAX,数据段段基址 MOVDS,AX MOVBP,BUF单元的有效地址 MOVAL,DS:[BP];AL=55H不能写成:MOVAL,[BP] 由于BP间址约定访问的是堆栈段,∴“DS:”不可省解3:用变量名直接寻址

MOVAX,数据段段基址 MOV DS,AX MOVAL,BUF ;AL=55H③基址寄存器和约定访问的逻辑段基址寄存器约定访问的逻辑段BP堆栈段16位寻址方式BX数据段EBP,ESP堆栈段32位寻址方式EAX~EDX,ESI,EDI数据段④举例设数据段BUF单元依次有:78H,56H,34H,12H则: MOV AX,数据段段基址 MOVDS,AX MOVBX,BUF单元有效地址 MOVDH,[BX+1];DH=56H MOVDX,[BX+2];DX=1234H12H34H56H78HBUF(4)变址寻址①有比例因子的变址寻址其地址表达式为

段寄存器:[比例因子*变址寄存器+位移量]物理地址=段寄存器×16+比例因子×变址寄存器+位移量

没有比例因子的变址寻址其地址表达式为:

段寄存器:[变址寄存器+位移量]

访问约定的逻辑段可简化为:

[变址寄存器+位移量]

物理地址=约定的段寄存器×16+变址寄存器+位移量③变址寄存器与约定访问的逻辑段变址寄存器约定访问的逻辑段适用于……SI,DI数据段无比例因子,16位寻址EBP堆栈段有比例因子,32位寻址EAX~EDX,ESI,EDI数据段②无比例因子基址加变址地址表达式:

段寄存器:[基址寄存器+变址寄存器+位移量]访问约定逻辑段:

[基址寄存器+变址寄存器+位移量]基址加变址寻址是基址寻址和变址寻址的组合,要求基址寄存器和变址寄存器都是16位或都是32位,否则(16位寻址和32位寻址混合使用)是非法指令默认的段寄存器不一致,这样的组合虽然是合法,但容易出错如:[BP+SI],[BP+DI]BP约定的逻辑段为堆栈段,而SI、DI约定的逻辑段为数据段,它们组合之后约定访问的逻辑段是谁?实验证明是堆栈段,∴这样的组合最好要加段前缀。寻址方式的学习要点:1.访问内存操作数由5种寻址方式直接寻址、间址、基址、变址、基址加变址2.关于16位寻址和32位寻址16位寻址:采用16位间址、基址、变址、基址加变址32位寻址:采用32位间址、基址、变址、基址加变址3.在实模式下,一个逻辑段的体积最大为64K,存储单元的有效地址为16位,不可能超过FFFFH,∴在实模式下运行的程序通常采用16位寻址4.关于段约定和段超越在用间址、基址、变址、基址加变址寻址内存操作数时,其地址表达式都有2种书写格式有段前缀和无段前缀①如用BP、EBP、ESP参与寻址,CPU自动认为是访问堆栈段,∴段超越前缀“SS:”可省如:MOVAL,DS:[BX]MOVAL,[BX]

④如用BX、SI、DI、EAX、EDX、ESI、EDI参与寻址非数据段,必须明确写出段超越前缀,如:MOVAL,ES:[BX]MOVAL,FS:[SI+2]5.使用段约定访问内存操作数是最常用的编程风格明确写出,不能省

3.3标志寄存器ACVMRNTIOPLODITSZAPC

D31D19D18D080486标志寄存器80486标志寄存器为32位,实际使用15位15位标志分为两类:状态标志和控制标志

状态标志记录了当前指令执行后的状态信息控制标志用来控制微处理器操作本节首先介绍6种状态标志一.状态标志1.C标志—进位/借位标志字节加/减,最高位(D7)产生进位/借位时:C标志置1,否则置0

字加/减,最高位(D15)产生进位/借位时:

C标志置1,否则置0

双字加/减,最高位(D31)产生进位/借位时:

C标志置1,否则置02.A标志—辅助进位/辅助借位标志

字节加/减,D3位产生进位/借位时:A标志置1,否则置0

字加/减,D7位产生进位/借位时:A标志置1,否则置0

双字加/减,D15位产生进位/借位时:A标志置1,否则置03.S标志—符号标志字节运算后,结果的最高位D7位为1,S标志置1,否则置0字运算后,结果的最高位D15位为1,S标志置1,否则置0双字运算后,结果的最高位D31位为1,S标志置1,否则置04.Z标志—结果标志

运算结果为全0时,Z标志置1,否则置0

5.P标志—奇偶标志(实际上是偶标志)运算结果中,“1”的个数为偶数个(没有“1”也是偶数),P标志置1,否则置06.O标志—溢出标志运算结果产生溢出,则O标志置1,否则置0二.复习:有关溢出的几个概念1.什么是溢出?运算结果超出寄存器能表示的范围,称为溢出。溢出和操作数的性质有关。8位无符号数运算,结果>255有溢出16位无符号数运算,结果>65535有溢出32位无符号数运算,结果>232_1有溢出8位有符号数运算,-128>结果>127有溢出16位有符号数运算,-32768>结果>32767有溢出32位有符号数运算,-231>结果>231_1有溢出2.CPU如何判断溢出

由于溢出和操作数的性质有关,而操作数的性质是由程序员定义的。CPU只能默认一种选择,即CPU一律默认操作数是有符号补码数,并以此来设置溢出标志。3.程序员如何判断溢出有符号数运算,判O标志,O标志为1,有溢出无符号数加/减,判C标志,C标志为1,有溢出例:下列指令执行后AL=?A.C.O.P.S.Z为何值?

MOVAL,0C8HADDAL,0C8HAL=90H,如果C8H为无符号数(值=200),则有溢出。如果C8H为有符号数(值=-56),则无溢出。这6个标志中,C.O.P.S.Z可为程序的转移提供测试条件。000010011000

100

110

01

001

10C=1S=1P=1O=0Z=01A=13.480486基本集指令分6类,为讲授方便,用N代表立即数,N8、N16、N32代表8、16、32位立即数R代表寄存器操作数,R8、R16、R32代表8、16、32位寄存器操作数M代表内存操作数,M8、M16、M32代表8、16、32位内存操作数S代表段寄存器总说明:源、目操作数不可同为内存操作数源、目操作数属性一致(长度相同)当目标操作数为间址、变址、基址、基+变址的内存操作数,而源操作数为单字节/双字节立即数,则目标操作数必须用PTR说明类型若操作数为间、变、基、基+变的内存操作数,则必须用PTR说明类型2.对于单操作数指令(如:INC,DEC)1.于双操作数指令(如:MOV,ADD,CMP)第一类、传送类本类指令执行后,不影响状态标志1.通用传送(1)数据传送MOV目,源R/M,NR/M/S,R;目标不允许是CSR/M,SR/S,M;目标不允许是CS功能:源→目,源不变,不影响6种标志CS不能做目标,不能向段寄存器写入立即数禁止2个内存单元直接传送源、目属性要一致说明:为了深入理解数值定义伪指令、学习PTR运算符的使用,请仔细阅读以下例题。【例】阅读以下程序,写出指令执行后的目标操作数。代码段: ……

MOVAX,SEG数据段段名MOVDS,AX;对DS初始化MOVBL,BNUM;BL=?

所以,BL=12H数据段经过汇编之后,设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H代码段: ……

MOVAX,SEG数据段段名MOVDS,AXMOVBX,WNUM+2;BX=?数据段经过汇编之后,WNUM:22H11H44H33H66H55H所以,BX=3344H设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代码段: ……

MOVAX,SEG数据段段名MOVDS,AXMOVEBX,DNUM+4;EBX=?数据段经过汇编之后,所以,EBX=87654321HDNUM:68H24H57H13H21H43H65H87H设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代码段: ……

MOVAX,SEG数据段段名MOVDS,AXMOVBL,BYTEPTRDNUM;BL=?数据段经过汇编之后,所以,BL=68HDNUM:68H24H57H13H设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代码段: ……

MOVAX,SEG数据段段名MOVDS,AX;对DS初始化MOVBX,WORDPTRBNUM+1;BX=?

所以,BX=5634HBNUM:12H34H56H78H90H数据段经过汇编之后,设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

代码段: ……

MOVAX,SEG数据段段名MOVDS,AX;对DS初始化MOVEBX,DWORDPTRWNUM+1;EBX=?

所以,EBX=66334411H数据段经过汇编之后,设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

WNUM:22H11H44H33H66H55H代码段: ……

MOVAX,SEG数据段段名MOVDS,AXMOVBX,WORDPTRDNUM[3];BX=?数据段经过汇编之后,所以,BX=2113H设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

DNUM:68H24H57H13H21H43H65H87H代码段:……

MOVAX,SEG数据段段名MOVDS,AX;对DS初始化MOVBX,WORDPTRFNUM;BX=?

所以,BX=5566H数据段经过汇编之后,设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

FNUM:66H55H44H33H22H11H代码段: ……

MOVAX,SEG数据段段名MOVDS,AX;对DS初始化MOVBX,3MOVBL,BNUM[BX];BL=?

所以,BL=78H数据段经过汇编之后,设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H代码段: ……

MOVAX,SEG数据段段名MOVDS,AX;对DS初始化MOVSI,OFFSETBNUMMOVBX,[SI+1];BX=?所以,BX=5634H数据段经过汇编之后,设数据段: BNUMDB12H,34H,56H,78H,90H WNUMDW1122H,3344H,5566H DNUMDD13572468H,87654321H FNUMDF112233445566H

BNUM:12H34H56H78H90H(2)符号扩展/零扩展传送指令MOVSX目标寄存器,源操作数MOVZX目标寄存器,源操作数 R,R/M说明:源操作数字长要小于或等于目标寄存器字长功能:源操作数不变MOVSX源操作数符号位向高位扩展,再送给目标MOVZX源操作数高位补零,再送给目标如:MOVDL,-16;DL=F0HMOVSXBX,DL;BX=FFF0H,DL、DH不变MOVZXBX,DL;BX=00F0H,DL、DH不变(3)有效地址传送LEA目标寄存器,源操作数R16/R32,内存地址表达式功能:计算内存单元的有效地址(不是其中的操作数)→目标LEABX,BUF;将BUF单元的有效地址→BXLEABX,[SI+5];将数据段SI+5变址的那个单元的有效地址→BX注:有效地址就是偏移地址,LEA指令等效与OFFSET运算符

LEABX,BUF等效于MOVBX,OFFSETBUF

(4)交换指令XCHG第一操作数,第二操作数R,RM,RR,M功能:完成2个操作数互换说明:段寄存器、立即数不能参加互换2个内存操作数不能互换,源、目的类型一致(5)字节交换BSWAP32位通用寄存器功能:D31~D24D23~D16D15~D8D7~D0说明:←该指令查找数据段中的字节表,即要求数据表放在数据段,每个表元素为单字节数←指令执行前:EBX或BX=表头的有效地址AL=表元素相对于表头的地址位移量功能:DS:[BX+AL]→AL或DS:[EBX+AL]→AL例:查找NUM单元中的数所对应的数码管字型码数码管外形:adbghcfe(6)查表指令XLAT表头变量名abh共阴极数码管内部结构:数码管工作示意图:锁存/驱动电路CPUD0~D7a~h数码管字型码:设D7~D0位依次驱动hgfedcba段,则:的字型码为:00111111=3FH的字型码为:00000110=06H的字型码为:01011011=5BH的字型码为:01100110=66H的字型码为:01001111=4FH的字型码为:01111101=7DH的字型码为:01101101=6DHadbghcfe的字型码为:00111001=39H的字型码为:01111001=79H的字型码为:01110001=71H的字型码为:01111111=7FH的字型码为:01101111=6FH的字型码为:01110111=77H的字型码为:01111100=7CH的字型码为:01011110=5EH的字型码为:00000111=07H解:编程时,按0~9、A~F的规律,将相应的字型码设置在数据段中:TABDB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HNUMDB××;0~15中的一个数代码段:MOVAX,SEGTABMOVDS,AXMOVBX,OFFSETTABMOVAL,NUMXLATTAB;AL=相应的字型码数据段:2.堆栈操作指令(1)基本概念堆栈例:农民存储粮食用的“粮垛”就是一个堆栈花生小麦玉米计算机中的堆栈是人为设置的一片连续内存区,用来存放数据,所存数据按先进后出规律存取。栈顶和栈底:栈顶:栈区的低地址栈底:栈区的高地址栈顶栈底低地址高地址堆栈段寄存器SS:存放堆栈段段基址堆栈指针ESP(SP):存放栈顶单元的偏移地址SS、ESP(SP)初值,由程序员赋值或DOS系统自动赋值数据进栈过程(以16位操作数进栈为例)双字节操作数高字节低字节←SPXXHXXH高8位→SS:[SP1]12H34H堆栈区数据进栈过程(以16位操作数进栈为例)XXHXXH12H←SP高8位→SS:[SP1]低8位→SS:[SP2]双字节操作数高字节低字节堆栈区12H34H数据进栈过程(以16位操作数进栈为例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP双字节操作数高字节低字节堆栈区12H34H数据进栈过程(以16位操作数进栈为例)高8位→SS:[SP1]XXHXXH12H低8位→SS:[SP2]34H←SPSP2→SP双字节操作数高字节低字节堆栈区12H34H高字节低字节堆栈区XXHXXH12H34H←SP数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位78H56H16位目标寄存器34H78H数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位高字节低字节堆栈区XXHXXH←SPSS:[SP+1]→目标高8位12H16位目标寄存器56H高字节低字节堆栈区XXHXXH12HSP+2→SP数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位SS:[SP+1]→目标高8位←SP16位目标寄存器34H56H高字节低字节堆栈区XXHXXH34H12HSP+2→SP数据出栈过程(以16位操作数出栈为例)SS:[SP]→目标(目标寄存器,目标单元)低8位SS:[SP+1]→目标高8位←SP16位目标寄存器80X86的堆栈是向低地址方向延伸的,栈顶是“浮动”的注:一次进栈、出栈的数据至少是2字节(2)堆栈指令←进栈指令PUSH源操作数N16/N32S/R16/R32/M16/M32如:PUSHWORDPTR[BX]PUSHDWORDPTR[SI+5]说明:非直接寻址的内存操作数,必须用PTR说明属性←

出栈指令

POP目标操作数R16/R32/M16/M32S(CS非法)如:PUSHAXPOPBX;BX=AX说明:非直接寻址的内存操作数,必须用PTR说明属性←

16位标志寄存器进栈/出栈PUSHFPOPF←

32位标志寄存器进栈/出栈PUSHFDPOPFD←

16位寄存器进栈/出栈PUSHA;依次把AX、CX、DX、BX、SP、BP、SI、DI压栈(共28字节)POPA;从栈顶弹出28字节依次放入DI、SI、BP、SP、BX、DX、CX、AX⑥32位寄存器进栈/出栈

PUSHAD;依次把EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI压栈 (共48字节)POPAD;从栈顶弹出48字节依次放入EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX第二类、算术运算1.二进制加法:ADD

目标操作数,源操作数2.二进制减法:SUB

目标操作数,源操作数3.二进制加进位:ADC目标操作数,源操作数4.二进制减进位:SBB目标操作数,源操作数

R/M,N/R

R,M功能:ADD:源+目→目SUB:目–源→目ADC:源+目+上条指令执行后的C标→目SBB:目–源–上条指令执行后的C标→目注:此四种操作都影响A、C、O、P、S、Z标志说明:源、目操作数的属性(长度)要一致若源为单/双字节立即数,而目标为间、变、基、基+变的内存操作数,则目标要用PTR说明如:ADD[BX],12H×ADDBYTEPTR[BX],12H√ADDWORDPTR[BX],12H√∵12H可以理解为是0012H,或00000012H,汇编程序无法肯定它的具体长度,故要用PTR说明例:实现下列多字节数运算(以232为模)56788785H+789A8785H设数据段:FIRSTDD56788785HSECONDDD789A8785HSUMDD?0F031FCHA经汇编之后:FIRSTSECOND85H87H78H56H85H87H9AH78H解1:用直接寻址,单字节加法(共需12条指令)MOVAL,BYTEPTRFIRSTADDAL,BYTEPTRSECOND;进位→C标MOVBYTEPTRSUM,AL;不影响C标MOVAL,BYTEPTRFIRST+1;不影响C标ADCAL,BYTEPTRSECOND+1;进位→C标MOVBYTEPTRSUM+1,AL解2:用直接寻址,双字节加法(只需6条指令)MOVAX,WORDPTRFIRSTADDAX,WORDPTRSECONDMOVWORDPTRSUM,AXMOVAX,WORDPTRFIRST+2ADCAX,WORDPTRSECOND+2MOVWORDPTRSUM+2,AX解3:用直接寻址,双字加法(只需3条指令)MOVEAX,FIRSTADDEAX,SECONDMOVSUM,EAX5.二进制加1:INC目标操作数6.二进制减1:DEC目标操作数7.二进制求补:NEG目标操作数R/M说明:←对于非直接寻址的内存操作数,要用PTR明确说明属性功能:INC:目+1→目;影响A、O、P、S、Z,DEC:目-1→目;不影响C标NEG:0-目→目;影响A、C、O、P、S、ZNDB0FFH,0FFH,0,0

MOVBX,OFFSETNINC[BX]

×INC

BYTEPTR

[BX];N单元为0INC

WORDPTR

[BX];N、N+1单元都为0INC

DWORDPTR

[BX];N、N+1单元都为0

;且N+2单元为1NEG的应用:求出目标操作数的负值MOVAH,5MOVAL,-6NEG

AH ;AH=-5=FBHNEG

AL ;AL=6如:数据段:代码段:不等价,执行结果不同MUL默认乘数、被乘数、乘积为无符号二进数IMUL默认乘数、被乘数、乘积为有符号二进数高位积为0,则C标、O标=0,否则为1乘数、被乘数等长,乘积为双倍长8.无符号二进数乘法:MUL乘数9.有符号二进数乘法格式1:IMUL乘数格式2:IMUL目,源操作数R16,R16/M16/N16/N8M16,R16R32,R32/M32/N32/N16/N8M32,R32说明:源、目不能同为M功能:源×目→目格式3:IMUL目,源,立即数R16/R32,与目等长的R/M,不超过目长的N功能:源×立即数→目例:实现150000×12解1:用无符号乘法MOVEAX,150000MOVEBX,12MULEBX;150000×12→EAX解2:用有符号乘法格式1MOVEAX,150000;∵EAX最高位必为0MOVEBX,12;EBX最高位也是0IMULEBX;可以用有符号乘法指令解3:用有符号乘法格式2MOVEAX,150000MOVEBX,12IMULEAX,EBX解4:用有符号乘法格式3MOVEAX,150000IMULEBX,EAX,12;12×EAX→EBX10.无符号二进数除法:DIV除数11.有符号二进数除法:IDIV除数功能:说明:★DIV默认除数、被除数、商、余数均为无符号数IDIV默认除数、被除数、商、余数均为有符号数★被除数应为除数的双倍长★

如除数太小,使商值超出范围,屏幕显示:Dividedoverflow然后自动返回DOS说明:源、目操作数不能同为M若目标为间址、变址、基址或基址加变址寻址的内存操作数,而源为8/16位立即数,则前者要用PTR说明如:CMP[BX],12×CMPBYTEPTR[BX],12√CMPWORDPTR[BX],12√12.比较指令目源,产生A、C、O、P、S、Z6个状态标志,不破坏源、目。该指令一般后跟条件转移指令。功能:CMP目标操作数,源操作数R/M,与目标等长的R/M不超过目标长的立即数由此可见,一串0、1代码,是二进数还是BCD码数,是由程序员定义的,CPU并不理解。★

指令格式中怎样表述BCD码数(在内存区如何定义BCD码数)?★假设N=01101001若N是二进数,则N=(105)10若N是BCD码数,则N=(69)1013.BCD码调整指令(1)基本概念★组合/未组合BCD码数(即压缩/未压缩BCD码数)注意:1010~1111不是BCD码组合BCD码:一字节中含有2位BCD码未组合BCD码:一字节中含有1位BCD码(高4位为0)00001001000010018位十位个位组合BCD码0000000010018位未组合BCD码如:69的BCD码数应写成69H即:MOVAL,69H;则AL=0110,1001或:MOVAL,09H;则AL=00001001MOVAH,06H;则AH=00000110若:MOVAL,69;则AL=0100,0101如:69的BCD码数定义在内存单元时即:BUFDB69H或:BUFDB09H,06H若:BUFDB69则错★BCD码数的加减运算∵BCD码数是用4位二进数代表1位十进数∴其运算法则应是:“逢十进一,减一当十”假设:N1=(0110,1001)BCDN2=(0000,1001)BCD则:N1+N2=69+09=78即结果应当等于(0111,1000)BCD★如何实现BCD码数的加法呢?指令系统中没有实现BCD码数加法的指令,只能借用ADD、ADC指令。但是ADD、ADC指令默认操作数是二进数,其运算法则是“逢二进一”,而BCD码数加法要求按“逢十进一”运算。0110,1001←BCD码数N1ADD)0000,1001

←BCD码数N20111,0010←这是二进制的和数+)0000,0110←加06H修正

事实上,N1和N2可以是任意的BCD码数,借用ADD、ADC运算后必须具体分析运算结果,然后根据不同的情况选择加06H修正,或是加60H修正,或是加66H修正。因此借用ADD、ADC指令进行BCD码数的加法还必须对结果进行修正,修正后的结果才是BCD码数的和数。举例如下:0111,1000←得到正确BCD码和数如果对于每一次BCD码数的加法都要由程序员来判断结果的话,这太麻烦了,因此指令系统中设计了一条“组合BCD码数加法调整指令DAA”由硬件进行分析,再对结果进行调整。上例编程时只需要按以下方式设计程序即可

MOVAL,69H ADDAL,09H DAA(2)BCD码数的加法及其调整规律(见下页表)笔算CPU运算加法调整

43+5598

0100,0011ADD)0101,01011001,1000C标=0,A标=0,高低四位均没有出现非法BCD码,结果正确,不修正39+4988

0011,1001ADD)0100,10011000,0010+)01101000,1000低四位有进位,即A标=1,对运算结果加06H修正

63+54117

0110,0011ADD)0101,01001011,0111+)0110,00001,0001,0111高四位出现非法BCD码数,对运算结果加60H修正

87+86173

1000,0111

ADD)1000,01101,0000,1101+)0110,01101,0111,0011因为C标=1,低四位出现非法BCD码,对运算结果加66H修正笔算CPU运算加法调整(3)BCD码调整指令①组合BCD码加法调整:DAA功能:默认操作对象为AL,并且根据具体情况对AL中的高/低4位进行修正。应用:紧跟在以AL为目标寄存器的ADD/ADC之后,但AL中必须是组合BCD码数之和。代码段:

MOVAL,BYTEPTRN1ADDAL,BYTEPTRN2DAAMOVBYTEPTRSUM,ALMOVAL,BYTEPTRN1+1ADCAL,BYTEPTRN2+1DAAMOVBYTEPTRSUM+1,AL例:计算1234+5678=?数据段:

N1DW1234HN2DW5678HSUMDW?若被减数≥减数,调整后,C标=0,AL=组合BCD码差值若被减数<减数,调整后,C标=1,AL=差值相对于模(100)10的“补数”例:计算56-78=?MOVAL,56HSUBAL,78HDAS;C=1,AL=88H;88H是“-12H”相对于模100H的补数②组合BCD码减法调整:DAS功能:默认操作对象为AL,对AL中的组合BCD差值进行修正。例:计算8+9=?MOVAL,08HADDAL,09HMOVAH,0AAA;AH=01H,AL=07H修正后:AH=和的十位数(未组合BCD码)AL=和的个位数(未组合BCD码)③未组合BCD码加法调整:AAA功能:默认操作对象为AL,对AL中的2个未组合BCD码数之和进行修正。修正前:应使AH=0如:计算9-8=?MOVAL,09HSUBAL,08HAAS;C=0,AL=01H若被减数<减数,修正后,C标=1,AH-1,AL=差值相对于模10H的“补数”④未组合BCD码减法调整:AAS功能:默认操作对象为AL,对AL中的2个未组合BCD码数之差进行修正若被减数≥减数,修正后,C标=0,AH不变,AL=未组合差值如:计算89MOVAX,0809HMULAH;AX=89的二进制数AAM;AH=07H,AL=02H⑤未组合BCD码乘法调整:AAM功能:默认操作对象为AX,对AX中的2个未组合BCD码之积(二进制数)进行修正,即:AL10,商→AH,余数→AL。修正后:AH=乘积的十位数(未组合BCD码)AL=乘积的个位数(未组合BCD码)如:计算863MOVAX,0806HAAD;AX=86的等值二进制0056HMOVBL,03HDIVBL;AL=(863)的二进制商值11100,;AH=(863)的二进制余数10MOVBL,AH;转移AH中的余数→BLAAM;AX=0208H是商值的未组合十进数⑥未组合BCD码除法调整:AAD功能:默认操作对象是AX,执行AH10+AL→AL,0→AH应用:在进行未组合BCD码数除法操作之前,用AAD指令将AX中的2位未组合BCD码数→二进数,以便后继程序用DIV指令进行二进制数除法。第三类转移和调用指令转移类指令分类按照转移条件分:无条件转移和有条件转移按照转移范围分:段内转移和段间转移按照获取转移地址的方法分:直接转移和间接转移无条件转移功能:无条件转移,执行指定标号处的指令直接间接段内JMP标号JMPSHORT标号JMP寄存器操作数JMP内存操作数段间JMP标号JMP内存操作数说明:①标号是转移地址标号。②SHORT是短转移,其转移范围相对于指令地址而言在+129~—126个单元之间。$-127:$-126:$:JMPSHORT××;非法转移

$+129:$+130:③段内“JMP标号”,在实模式下,可转移到64K代码段的任何位置。④“JMP寄存器操作数/内存操作数”的应用在程序设计中再介绍。2.条件转移

一般格式操作码助记符转移地址标号应用CMP目,源条件转移指令转移范围:转移到代码段任何位置操作码助记符隐含了转移的条件(1)按标志位的当前状态转移设转移地址标号为XYZ

JCXYZ;当前C标志为1转JNCXYZ;当前C标志为0转JZXYZ;当前Z标志为1转JNZXYZ;当前Z标志为0转JSXYZ;当前S标志为1转JNSXYZ;当前S标志为0转JPXYZ;当前P标志为1转JNPXYZ;当前P标志为0转JOXYZ;当前O标志为1转JNOXYZ;当前O标志为0转无符号数条件转移应用:CMPN1,N2;N1,N2为无符号数无符号数条件转移设:转移地址标号为XYZ

则:JAXYZ ;N1>N2转

JNAXYZ;N1≤N2转

JCXYZ;N1<N2转

JNCXYZ;N1≥N2转(3)有符号数条件转移应用:CMPN1,N2;N1,N2为有符号数(机器数) 有符号数条件转移JGXYZ;被减数的真值大于减数的真值转JGEXYZ;被减数的真值大于等于减数的真值转JLXYZ;被减数的真值小于减数的真值转JLEXYZ;被减数的真值小于等于减数的真值转(4)循环控制转移LOOPXYZ;CX-1→CX,结果不为零转LOOPZXYZ;CX-1→CX,结果不为零,且Z标为1转LOOPNZXYZ;CX-1→CX,结果不为零,且Z标为0转JCXZXYZ;测试CX,若CX=0转JECXZXYZ;测试ECX,若ECX=0转注意:循环控制转移,其转移范围相对于指令地址而言为:-126~+129例:设AL=无符号数,实现:若AL≥5转NEXT,否则不转下面的3种解法哪一种正确?①CMPAL,5JNCNEXT②MOVAH,5CMPAL,AHJNCNEXT③CMPAL,5JGENEXT若AL=0~127,则:解法1:CMPAL,5解法3:CMPAL,5JNCNEXTJGENEXT这2种解法都是正确的。例:某班级40人,某课程考试成绩存放在SCORE开始的内存单元。请统计及格人数→OK单元。思路:考试成绩应视为无符号数,把成绩依次取出和60比较,大于等于60为及格。数据段:SCOREDB××,…××;40个成绩OKDB?SCORE有效地址→BX人数→CX0→DLDS:[BX]≥60YDL→OK返回DOSNBX+1→BXCX-1→CXCX=0?NDL+1→DLY

JCNOINCDLNO:INCBXDECCXJNZLASTMOVOK,DL返回DOS强调:CMP[BX],60是错的。程序执行后应返回DOS,把控制权转交给操作系统代码段:MOVAX,SEGSCOREMOVDS,AXMOVDL,0MOVCX,40MOVBX,OFFSETSCORELAST:CMPBYTEPTR[BX],60

3.调用与返回指令★

调用:调用子程序,即无条件转到子程序的第一条指令★返回:返回断点,即返回到CALL的后继指令★子程序:能完成一定功能的相对独立的程序段主程序

…………CALLXYZ断点:……XYZ子程序…………RET(1)汇编语言的过程定义语句格式过程名PROC属性子程序实体 RET过程名ENDP

说明:过程名:子程序名,以字母开头,长度≤31经汇编之后,过程名就是子程序第一条指令的地址。

PROC/ENDP是子程序的定界语句属性有2种描述

NEAR(或缺省)代表近过程即该子程序和调用它的那条指令在同一个代码段

FAR代表远过程即该子程序和调用它的那条指令不在同一个代码段

RET子程序返回指令(2)段内调用段内直接调用 CALL 过程名功能:断口偏移地址→堆栈子程序入口的偏移地址→IP,从而转子程序(3)段间调用段间直接调用CALL 过程名段间间接调用CALL 内存操作数功能:断口的“段基址:偏移地址”→堆栈子程序入口的“段基址:偏移地址”→CS:IP,实现段间转移段内间接调用 CALL 寄存器操作数CALL 内存操作数(4)段内/段间返回指令RETRETN(N为偶数)段内RET为C3H,段间RET为CBH功能:①有NEAR属性的RET指令,从栈顶弹出2字节→IP有FAR属性的RET指令,从栈顶弹出4字节→IP,CS如果栈顶是断口地址,则能返回断点,否则不能②RETN指令,首先完成RET功能,然后把堆栈指针再下调N个字节例:把5个8位二进制数转换成十进制数→屏显数据段:NUM DB ××,××,××,××,××POINTER DW N2_10;汇编后存放N2_10的偏移地址代码段: MOV AX,SEGNUM MOV DS,AX MOVBX,OFFSETNUMMOVCX,5

LAST:MOVDL,[BX]CALLN2_10;备注:该指令也可以使用下注①②BREAK:INCBX;BREAK为断点 LOOPLAST返回DOSN2_10PROC

把DL中的二进制数→十进制数 →十进制数ASCⅡ码→屏显RETN2_10ENDP①CALLPOINTER ;N2_10的偏移地址→IP②MOVSI,POINTER

CALLSI;SI→IP4.中断调用与中断返回(1)中断调用INTN

(N=0~255)功能:标志寄存器→堆栈“INTN”的后继指令地址“CS:IP”→堆栈无条件转向N型中断服务程序(2)中断返回IRET功能:从栈顶依次弹出6个元素→IP,CS,标志寄存器 几个转移调用指令的总结JMP标号JC标号CALL子程序INT中断服务子程序第四类

温馨提示

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

评论

0/150

提交评论