新编位微型计算机原理及应用李继灿主编00002.ppt

上传人:sccc 文档编号:5551610 上传时间:2023-07-20 格式:PPT 页数:148 大小:1.46MB
返回 下载 相关 举报
新编位微型计算机原理及应用李继灿主编00002.ppt_第1页
第1页 / 共148页
新编位微型计算机原理及应用李继灿主编00002.ppt_第2页
第2页 / 共148页
新编位微型计算机原理及应用李继灿主编00002.ppt_第3页
第3页 / 共148页
新编位微型计算机原理及应用李继灿主编00002.ppt_第4页
第4页 / 共148页
新编位微型计算机原理及应用李继灿主编00002.ppt_第5页
第5页 / 共148页
点击查看更多>>
资源描述

《新编位微型计算机原理及应用李继灿主编00002.ppt》由会员分享,可在线阅读,更多相关《新编位微型计算机原理及应用李继灿主编00002.ppt(148页珍藏版)》请在三一办公上搜索。

1、优秀精品课件文档资料,第3章 指令系统,3.1 概述3.2 80486寻址方式3.3 80486标志寄存器3.4 汇编语言语法规则之一3.5 80486基本集指令,3.概述,指令:通知 CPU执行某种操作的“命令”,CPU全部指令的集合,称为指令系统,指令的书写格式目标指令(机器指令)用一串0,1代码书写 注意:硬件只能识别,存储,运行目标指令符号指令:用规定的助记符,规定的书写格式书写的指令,大多数指令由操作码和地址码2部分组成 操作码:通知CPU执行什么操作(唯一)地址码:指令的操作对象所存放的位置(根据操作对象的多样性其表现形式很多)教材上把地址码称为操作数,3.指令的组成,相应的编码规

2、则对指令进行编码 操作码的编码 地址码的编码,80486符号指令与机器指令对照表,MOV:MOVE传送 ADD:加 SUB:减 RET:RETURN 返回,4.目标程序的生成,汇编源程序,编辑、编译、链接,可执行的机器指令程序(目标程序),5.指令长度 486指令长度(机器指令长度)为116字节规定:多字节指令占用连续的内存单元,存放指令第一字节的内存地址,称为“指令地址”。,CPU只能识别,存储,运行目标指令,而用机器指令编程非常困难。于是早期的专家们发明了符号指令,再经过软件把符号指令机器指令。图示如下:,6.指令存放,如:12345H单元中有一条指令 MOV AX,6789H,67H,8

3、9H,B8H,12345H:,MOV AX,6789H,先写操作码,再写操作数。多字节操作数连续存放。存放规律:低位字节存放在低地址单元,高位字节存放在相邻的高地址单元,7.符号指令的 书写格式,如:NEXT:ADD AX,BX;AX+BX AX INC SI;SI+1 SI,标号:以字母开头,后跟字母,数字,下划线,长度31字符 标号又称符号地址,代表该指令的逻辑地址。可有可无,设置是为了程序的转向,注解:以“;”开头,不执行,打印程序清单时照原样打印,“系统保留字”不能做标号。,3.2 486寻址方式,操作数是指令的操作对象,寻址方式与地址码有密切关系。形成操作数地址码的过程就是寻址。,“

4、寻址方式”:通俗的讲,就是通知CPU本条指令的操作数在哪儿?或者说用什么方式才能得到操作数。,微机系统有3类操作数:立即数:操作数包含在本条指令中,是指令的一部分。寄存器操作数:CPU内部的通用寄存器,段寄存器内容。内存操作数:操作数在存储单元中。,486有3类7种寻址方式立即寻址方式:获得立即数寄存器寻址方式:获得寄存器操作数存储器寻址方式:获得存储器操作数(内存操作数),学习重点:怎样在符号指令中,正确的描述各种寻址方式,1.立即寻址操作数包含在本条指令中,是指令的一部分,完整地取出该条指令,也就获得了操作数。,如:MOVEAX,12345678H MOVBL,10101010B;AAH

5、BL MOV CL,4;FCH CL MOVDL,A;41H DL ADD AL,0C8H MOVSI,3*5;15 SI,上例源操作数即为立即寻址,立即数书写规定:立即数以数字开头,以开头的16进制数,必须前缀0。,程序员可以按自己的习惯书写立即数,各种合法的立即数经汇编后,一律自动转换成等值的二进制数,负数用补码表示。,立即数的数制用后缀表示,B表示二进制数,H表示十六进制数,D或缺省为十进制数,单引号括起来的字符编译成相应的ASCII码。,可以用+*/组成立即数表达式,2.寄存器寻址操作数在CPU的某个寄存器中,符号指令中直接写出寄存器名称。,如:MOV AX,DS;DS内容 AX IN

6、C SI;SI+1 SI(Increase 增量)DEC DI;DI 1 DI(Decrease 减量),如:下述条指令,目标操作数即为寄存器寻址 MOVEAX,12345678H MOVBL,10101010B;AAH BL MOV CL,4;FCH CL MOVDL,5;35H DL ADD AL,0C8H MOVSI,3*5;15 SI,3.存储器操作数寻址方式 重申:在读写内存操作数之前,CPU必须知道相关存储单元的物理地址。,程序员的责任仅在于正确的书写逻辑地址表达式,然后由CPU自动运算以求出物理地址。,由于CPU对存储器采用分段管理,因此指令格式中只能写出存放操作数的内存单元的“

7、逻辑地址”。,存储单元逻辑地址表达式的一般形式,段寄存器:,偏移地址,实模式下,物理地址=段寄存器24+偏移地址,(1)直接寻址 地址表达式的格式1:段寄存器:偏移地址,地址表达式的格式2:段寄存器:变量名 用变量名代表存储单元的有效地址,如:MOVAL,ES:2CH 从ES附加段偏移地址为2CH的单元取数AL,如:MOV AX,DS:1234H 从数据段偏移地址为1234H的单元取一字AX 这种格式很少使用,通常情况下,程序员不知道某单单元的偏移地址(本书仅在P349有过一次应用),设数据段XX字节单元的内容为11H ES附加段YY字单元的内容为2233H MOV AL,DS:XX;取数据段

8、XX字节单元的内容AL 或 MOV AL,XX;AL=11H MOV AX,ES:YY;取ES附加段YY字单元的内容AX 或 MOV AX,YY;AX=2233H,说明:汇编语言允许为某单元起一个“名字”,这个名字就称为该单元的“变量名”,经汇编之后,变量名有段基址和偏移量两种属性。变量名是唯一的,程序中不能有重复的变量名,“段寄存器:”可以省略。,(2)寄存器间接寻址 寄存器间接寻址又称间接寻址,间址 什么是间接寻址?操作数在内存单元,该单元的段基址在段寄存器中有效地址在间址寄存器中,CPU首先进行地址计算,间接寻址的地址表达式 段寄存器:间址寄存器 某单元的物理地址=段寄存器内容16+间址

9、寄存器,访问约定的逻辑段,间接寻址的地址表达式简化为:间址寄存器 某单元的物理地址=约定的段寄存器内容16+间址寄存器,间址寄存器 和约定访问的逻辑段486规定:,举例:设数据段BUF字节单元的内容为55H,取出该数 AL,解1:用BX间址 MOV AX,数据段段基址 MOV DS,AX MOV BX,BUF单元的有效地址 MOV AL,DS:BX;AL=55H等价于:MOV AL,BX 由于BX间址,约定访问的是数据段,“DS:”可省,解2:用BP间址 MOV AX,数据段段基址 MOV DS,AX MOV BP,BUF单元的有效地址 MOV AL,DS:BP;AL=55H 不能写成:MOV

10、 AL,BP 由于BP间址约定访问的是堆栈段,“DS:”不可省,解3:用变量名直接寻址 MOV AX,数据段段基址 MOV DS,AX MOV AL,BUF;AL=55H,(3)基址寻址 在基址寻址中,有效地址由两部分组成。一部分在基址寄存器中,另一部分为常量。,基址寻址的地址表达式:段寄存器:基址寄存器+位移量物理地址=段寄存器内容16+基址寄存器+位移量,访问约定的逻辑段,简化的地址表达式:基址寄存器+位移量物理地址=约定的段寄存器内容16+基址寄存器+位移量,基址寄存器和约定访问的逻辑段,举例设数据段BUF单元依次有:78H,56H,34H,12H则:MOVAX,数据段段基址MOV DS

11、,AXMOV BX,BUF单元有效地址MOV DH,BX+1;DH=56HMOV DX,BX+2;DX=1234H,12H,34H,56H,78H,BUF,(4)变址寻址 有比例因子的变址寻址其地址表达式为 段寄存器:比例因子*变址寄存器+位移量 物理地址=段寄存器16+比例因子变址寄存器+位移量,没有比例因子的变址寻址其地址表达式为:段寄存器:变址寄存器+位移量 访问约定的逻辑段可简化为:变址寄存器+位移量 物理地址=约定的段寄存器16+变址寄存器+位移量,变址寄存器与约定访问的逻辑段,说明:比例因子只能是1、2、4、8,因此:MOV AL,8*SI+15;非法,16位寻址不能使用 比例因子

12、 MOV AL,10*ESI+5;非法指令,比例因子错了 MOV AL,ES:SI;访问附加段 MOV AL,SI;访问数据段,(5)基址加变址寻址,存储单元的有效地址由3部分组成 有比例因子的基址加变址的地址表达式为:段寄存器:基址寄存器+比例因子*变址寄存器+位移量,访问约定逻辑段其地址表达式简化为:基址寄存器+比例因子*变址寄存器+位移量,无比例因子基址加变址地址表达式:段寄存器:基址寄存器+变址寄存器+位移量访问约定逻辑段:基址寄存器+变址寄存器+位移量,基址加变址寻址是基址寻址和变址寻址的组合,要求基址寄存器和变址寄存器都是16位或都是32位,否则(16位寻址和32位寻址混合使用)是

13、非法指令默认的段寄存器不一致,这样的组合虽然是合法,但容易出错,如:BP+SI,BP+DIBP约定的逻辑段为堆栈段,而SI、DI约定的逻辑段为数据段,它们组合之后约定访问的逻辑段是谁?,实验证明是堆栈段,这样的组合最好要加段前缀。,寻址方式的学习要点:1.访问内存操作数由5种寻址方式 直接寻址、间址、基址、变址、基址加变址,2.关于16位寻址和32位寻址 16位寻址:采用16位间址、基址、变址、基址加变址 32位寻址:采用32位间址、基址、变址、基址加变址,3.在实模式下,一个逻辑段的体积最大为64K,存储 单元的有效地址为16位,不可能超过FFFFH,在实模式下运行的程序通常采用16位寻址,

14、4.关于段约定和段超越,在用间址、基址、变址、基址加变址寻址内存操作数时,其地址表达式都有2种书写格式有段 前缀和无段前缀,如用BP、EBP、ESP参与寻址,CPU自动认为是访问堆栈段,段超越前缀“SS:”可省,MOV AL,SS:BP;访问SS段,用BP间址MOV AL,BP,如用BP、EBP、ESP参与寻址非堆栈段,必须明确写出段超越前缀,如:,MOV AL,DS:BP;访问堆栈段,用BP间址MOV AL,ES:BP+2,如用BX、SI、DI、EAXEDX、ESI、EDI参与寻址,CPU自动认为是访问数据段,“DS:”可省,如:MOV AL,DS:BX MOV AL,BX,如用BX、SI、

15、DI、EAX、EDX、ESI、EDI参与寻址非数据段,必须明确写出段超越前缀,如:,MOV AL,ES:BXMOV AL,FS:SI+2,5使用段约定访问内存操作数是最常用的编程风格,3.3 标志寄存器,80486标志寄存器为32位,实际使用15位 15位标志分为两类:状态标志和控制标志 状态标志记录了当前指令执行后的状态信息 控制标志用来控制微处理器操作,本节首先介绍6种状态标志一状态标志,1.C标志进位/借位标志 字节加/减,最高位(D7)产生进位/借位时:C标志置1,否则置0 字加/减,最高位(D15)产生进位/借位时:C标志置1,否则置0 双字加/减,最高位(D31)产生进位/借位时:

16、C标志置1,否则置0,2.A标志辅助进位/辅助借位标志,字节加/减,D3位产生进位/借位时:A标志置1,否则置0,字加/减,D7位产生进位/借位时:A标志置1,否则置0 双字加/减,D15位产生进位/借位时:A标志置1,否则置0,3.S标志符号标志,字节运算后,结果的最高位D7位为1,S标志置1,否则置0字运算后,结果的最高位D15位为1,S标志置1,否则置0双字运算后,结果的最高位D31位为1,S标志置1,否则置0,4.Z标志结果标志 运算结果为全0时,Z标志置1,否则置0,5.P标志奇偶标志(实际上是偶标志)运算结果中,“1”的个数为偶数个(没 有“1”也是偶数),P标志置1,否则置0,6

17、.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一律 默认操作数是有符号补码数,并以

18、此来设置溢出标志。,3.程序员如何判断溢出 有符号数运算,判O标志,O标志为1,有溢出 无符号数加/减,判C标志,C标志为1,有溢出,AL=90H,如果C8H为无符号数(值=200),则有溢出。如果C8H为有符号数(值=-56),则无溢出。这6个标志中,C.O.P.S.Z可为程序的转移提供测试条件。,3.4 80486基本集指令,分6类,为讲授方便,用,N 代表立即数,N8、N16、N32代表8、16、32位立即数R 代表寄存器操作数,R8、R16、R32代表8、16、32位寄存器操作数M 代表内存操作数,M8、M16、M32代表8、16、32位内存操作数S 代表段寄存器,总说明:,源、目操作

19、数不可同为内存操作数源、目操作数属性一致(长度相同)当目标操作数为间址、变址、基址、基+变址的内存操作数,而源操作数为单字节/双字节立即数,则目标操作数必须用PTR说明类型,若操作数为间、变、基、基+变的内存操作数,则必须用PTR说明类型,2.对于单操作数指令(如:I NC,DEC),1.于双操作数指令(如:MOV,ADD,CMP),第一类、传送类,本类指令执行后,不影响状态标志,1.通用传送,CS不能做目标,不能向段寄存器写入立即数禁止2个内存单元直接传送源、目属性要一致,说明:,为了深入理解数值定义伪指令、学习PTR运算符的使用,请仔细阅读以下例题。,【例】阅读以下程序,写出指令执行后的目

20、标操作数。,代码段:MOV AX,SEG 数据段段名 MOV DS,AX;对DS初始化 MOV BL,BNUM;BL=?,所以,BL=12H,数据段经过汇编之后,,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX MOV BX,WNUM+2;BX=?,数据段经过汇编之后,,所以,BX=3344H,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW

21、 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX MOV EBX,DNUM+4;EBX=?,数据段经过汇编之后,,所以,EBX=87654321H,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX MOV BL,BYTE PTR

22、DNUM;BL=?,数据段经过汇编之后,,所以,BL=68H,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX;对DS初始化 MOV BX,WORD PTR BNUM+1;BX=?,所以,BX=5634H,数据段经过汇编之后,,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H

23、,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX;对DS初始化 MOV EBX,DWORD PTR WNUM+1;EBX=?,所以,EBX=66334411H,数据段经过汇编之后,,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX MOV BX,WORD PTR DNUM 3;BX=?,数据段经过汇

24、编之后,,所以,BX=2113H,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX;对DS初始化 MOV BX,WORD PTR FNUM;BX=?,所以,BX=5566H,数据段经过汇编之后,,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM D

25、F 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX;对DS初始化 MOV BX,3 MOV BL,BNUM BX;BL=?,所以,BL=78H,数据段经过汇编之后,,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,代码段:MOV AX,SEG 数据段段名 MOV DS,AX;对DS初始化 MOV SI,OFFSET BNUM MOV BX,SI+1;BX=?,所以,BX=5634H,数据段经

26、过汇编之后,,设数据段:BNUM DB 12H,34H,56H,78H,90HWNUM DW 1122H,3344H,5566HDNUM DD 13572468H,87654321HFNUM DF 112233445566H,说明:源操作数字长要小于或等于目标寄存器字长,功能:,源操作数不变 MOVSX 源操作数符号位向高位扩展,再送给目标 MOVZX 源操作数高位补零,再送给目标,功能:计算内存单元的有效地址(不是其中的操作数)目标,LEA BX,BUF;将BUF单元的有效地址BXLEA BX,SI+5;将数据段SI+5变址的那个单元的有效地址BX,注:有效地址就是偏移地址,LEA指令等效与

27、OFFSET运算符 LEA BX,BUF 等效于 MOV BX,OFFSET BUF,功能:完成2个操作数互换,功能:DS:BX+ALAL或DS:EBX+ALAL,例:查找NUM单元中的数所对应的数码管字型码,数码管字型码:,设D7D0位依次驱动 h g f e d c b a 段,则:,的字型码为:0 0 1 1 1 1 1 1=3FH,的字型码为:0 0 0 0 0 1 1 0=06H,的字型码为:0 1 0 1 1 0 1 1=5BH,的字型码为:0 1 1 0 0 1 1 0=66H,的字型码为:0 1 0 0 1 1 1 1=4FH,的字型码为:0 1 1 1 1 1 0 1=7DH

28、,的字型码为:0 1 1 0 1 1 0 1=6DH,的字型码为:0 0 1 1 1 0 0 1=39H,的字型码为:0 1 1 1 1 0 0 1=79H,的字型码为:0 1 1 1 0 0 0 1=71H,的字型码为:0 1 1 1 1 1 1 1=7FH,的字型码为:0 1 1 0 1 1 1 1=6FH,的字型码为:0 1 1 1 0 1 1 1=77H,的字型码为:0 1 1 1 1 1 0 0=7CH,的字型码为:0 1 0 1 1 1 1 0=5EH,的字型码为:0 0 0 0 0 1 1 1=07H,解:编程时,按09、AF的规律,将相应的字型码设置在数据段中:,TAB DB

29、3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HNUM DB;015中的一个数,代码段:,MOV AX,SEG TABMOV DS,AXMOV BX,OFFSET TABMOV AL,NUMXLAT TAB;AL=相应的字型码,数据段:,2.堆栈操作指令,例:农民存储粮食用的“粮垛”就是一个堆栈,计算机中的堆栈是人为设置的一片连续内存区,用来存放数据,所存数据按先进后出规律存取。,栈顶和栈底:,栈顶:栈区的低地址栈底:栈区的高地址,堆栈段寄存器SS:存放堆栈段段基址,堆栈指针ESP(SP):存放栈顶单元的偏移地

30、址,SS、ESP(SP)初值,由程序员赋值或DOS系统自 动赋值,数据进栈过程(以16位操作数进栈为例),双字节操作数,高字节,低字节,SP,X X H,X X H,高8位SS:SP1,1 2 H,3 4 H,堆栈区,数据进栈过程(以16位操作数进栈为例),X X H,X X H,1 2 H,SP,高8位SS:SP1,低8位SS:SP2,双字节操作数,高字节,低字节,堆栈区,1 2 H,3 4 H,数据进栈过程(以16位操作数进栈为例),高8位SS:SP1,X X H,X X H,1 2 H,低8位SS:SP2,3 4 H,SP,SP2SP,双字节操作数,高字节,低字节,堆栈区,1 2 H,3

31、 4 H,数据进栈过程(以16位操作数进栈为例),高8位SS:SP1,X X H,X X H,1 2 H,低8位SS:SP2,3 4 H,SP,SP2SP,双字节操作数,高字节,低字节,堆栈区,1 2 H,3 4 H,高字节,低字节,堆栈区,X X H,X X H,1 2 H,3 4 H,SP,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,7 8 H,5 6 H,16位目标寄存器,3 4 H,7 8 H,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,高字节,低字节,堆栈区,X X H,X X H,SP,SS:SP+

32、1目标高8位,1 2 H,16位目标寄存器,5 6 H,高字节,低字节,堆栈区,X X H,X X H,1 2 H,SP+2SP,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,SS:SP+1目标高8位,SP,16位目标寄存器,34 H,5 6 H,高字节,低字节,堆栈区,X X H,X X H,3 4 H,1 2 H,SP+2SP,数据出栈过程(以16位操作数出栈为例),SS:SP目标(目标寄存器,目标单元)低8位,SS:SP+1目标高8位,SP,16位目标寄存器,(2)堆栈指令,进栈指令,PUSH 源操作数 N16/N32 S/R16/R32/M16/

33、M32,说明:非直接寻址的内存操作数,必须用PTR说明属性,出栈指令,POP 目标操作数 R16/R32/M16/M32 S(CS非法),说明:非直接寻址的内存操作数,必须用PTR说明属性,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 目标

34、操作数,源操作数 R/M,N/R R,M,注:此四种操作都影响A、C、O、P、S、Z标志,12H可以理解为是0012H,或00000012H,汇编程序无法肯定它的具体长度,故要用PTR说明,例:实现下列多字节数运算(以232为模),5 6 7 8 8 7 8 5 H+7 8 9 A 8 7 8 5 H,设数据段:,FIRST DD 56788785HSECOND DD 789A8785HSUM DD?,0,F,0,3,1,F,C,H,A,经汇编之后:,FIRST,SECOND,5.二进制加1:I NC 目标操作数6.二进制减1:DEC 目标操作数7.二进制求补:NEG 目标操作数 R/M,N

35、DB 0FFH,0FFH,0,0 MOV BX,OFFSET NINC BX INC BYTE PTR BX;N单元为0INC WORD PTR BX;N、N+1单元都为0INC DWORD PTR BX;N、N+1单元都为0;且N+2单元为1,NEG的应用:求出目标操作数的负值,数据段:,代码段:,不等价,执行结果不同,MUL默认乘数、被乘数、乘积为无符号二进数I MUL默认乘数、被乘数、乘积为有符号二进数高位积为0,则C标、O标=0,否则为1乘数、被乘数等长,乘积为双倍长,8.无符号二进数乘法:M U L 乘数,9.有符号二进数乘法,格式1:I M U L 乘数,格式2:I MUL 目,源

36、操作数 R16,R16/M16/N16/N8 M16,R16 R32,R32/M32/N32/N16/N8 M32,R32,说明:源、目不能同为M,功能:源目目,格式3:I MUL 目,源,立即数 R16/R32,与目等长的R/M,不超过目长的N,功能:源立即数目,例:实现15000012,10.无符号二进数除法:DIV 除数,11.有符号二进数除法:I DIV 除数,功能:,被除数应为除数的双倍长,如除数太小,使商值超出范围,屏幕显示:Divided overflow 然后自动返回DOS,12.比较指令,CMP 目标操作数,源操作数 R/M,与目标等长的R/M 不超过目标长的立即数,由此可见

37、,一串0、1代码,是二进数还是BCD码 数,是由程序员定义的,CPU并不理解。,指令格式中怎样表述BCD码数(在内存区如何定义BCD码数)?,假设N=01101001 若N是二进数,则N=(105)10 若N是BCD码数,则N=(69)10,13.BCD码调整指令,(1)基本概念,组合/未组合BCD码数(即压缩/未压缩BCD码数),注意:10101111不是BCD码,组合BCD码:一字节中含有2位BCD码,未组合BCD码:一字节中含有1位BCD码(高4位为0),8位,十位,个位,组合BCD码,8位,未组合BCD码,如:69的BCD码数应写成69H即:MOV AL,69H;则AL=0110,10

38、01或:MOV AL,09H;则AL=00001001 MOV AH,06H;则AH=00000110若:MOV AL,69;则AL=0100,0101,如:69的BCD码数定义在内存单元时 即:BUF DB 69H或:BUF DB 09H,06H若:BUF DB 69 则错,BCD码数的加减运算,BCD码数是用4位二进数代表1位十进数其运算法则应是:“逢十进一,减一当十”,假设:N1=(0110,1001)BCD N2=(0000,1001)BCD则:N1+N2=69+09=78即结果应当等于(0111,1000)BCD,如何实现BCD码数的加法呢?,指令系统中没有实现BCD码数加法的指令,

39、只能借用ADD、ADC指令。但是ADD、ADC指令默认操作数是二进数,其运算法则是“逢二进一”,而BCD码数加法要求按“逢十进一”运算。,0 1 1 0,1 0 0 1 BCD码数N1ADD)0 0 0 0,1 0 0 1 BCD码数N2 0 1 1 1,0 0 1 0 这是二进制的和数+)0 0 0 0,0 1 1 0 加06H修正,事实上,N1和N2可以是任意的BCD码数,借用ADD、ADC运算后必须具体分析运算结果,然后根据不同的情况选择加06H修正,或是加60H修正,或是加66H修正。,因此借用ADD、ADC指令进行BCD码数的加法还必须对结果进行修正,修正后的结果才是BCD码数的和数

40、。,举例如下:,如果对于每一次BCD码数的加法都要由程序员来判断结果的话,这太麻烦了,因此指令系统中设计了一条“组合BCD码数加法调整指令DAA”由硬件进行分析,再对结果进行调整。,上例编程时只需要按以下方式设计程序即可MOV AL,69HADD AL,09HDAA,(2)BCD码数的加法及其调整规律(见下页表),(3)BCD码调整指令,组合BCD码加法调整:DAA,功能:默认操作对象为AL,并且根据具体情况对AL中的高/低4位进行修正。,应用:紧跟在以AL为目标寄存器的ADD/ADC之后,但AL中必须是组合BCD码数之和。,代码段:MOV AL,BYTE PTR N1 ADD AL,BYTE

41、 PTR N2 DAA MOV BYTE PTR SUM,AL MOV AL,BYTE PTR N1+1 ADC AL,BYTE PTR N2+1 DAA MOV BYTE PTR SUM+1,AL,例:计算1234+5678=?,数据段:N1 DW 1234H N2 DW 5678H SUM DW?,若被减数减数,调整后,C标=0,AL=组合BCD码差值若被减数减数,调整后,C标=1,AL=差值相对于模(100)10 的“补数”,例:计算56-78=?,MOV AL,56HSUB AL,78HDAS;C=1,AL=88H;88H是“-12H”相对于模100H的补数,组合BCD码减法调整:DA

42、S,功能:默认操作对象为AL,对AL中的组合BCD差值进行修正。,例:计算8+9=?,MOV AL,08HADD AL,09HMOV AH,0AAA;AH=01H,AL=07H,修正后:AH=和的十位数(未组合BCD码)AL=和的个位数(未组合BCD码),未组合BCD码加法调整:AAA,功能:默认操作对象为AL,对AL中的2个未组合BCD码数之和进行修正。修正前:应使AH=0,如:计算9-8=?,MOV AL,09HSUB AL,08HAAS;C=0,AL=01H,若被减数减数,修正后,C标=1,AH-1,AL=差值相对于模10H的“补数”,未组合BCD码减法调整:AAS,功能:默认操作对象为

43、AL,对AL中的2个未组合BCD码数之差进行修正,若被减数减数,修正后,C标=0,AH不变,AL=未组合差值,如:计算89,MOV AX,0809HMUL AH;AX=89 的二进制数AAM;AH=07H,AL=02H,未组合BCD码乘法调整:AAM,功能:默认操作对象为AX,对AX中的2个未组合BCD码之积(二进制数)进行修正,即:AL 10,商 AH,余数 AL。,修正后:AH=乘积的十位数(未组合BCD码)AL=乘积的个位数(未组合BCD码),如:计算863,MOV AX,0806HAAD;AX=86的等值二进制0056HMOV BL,03HDIV BL;AL=(863)的二进制商值11

44、100,;AH=(863)的二进制余数10MOV BL,AH;转移AH中的余数 BLAAM;AX=0208H是商值的未组合十进数,未组合BCD码除法调整:AAD,功能:默认操作对象是AX,执行 AH10+ALAL,0AH,应用:在进行未组合BCD码数除法操作之前,用AAD指令将AX中的2位未组合BCD码数二进数,以便后继程序用DIV指令进行二进制数除法。,第三类 转移和调用指令,转移类指令分类按照转移条件分:无条件转移和有条件转移按照转移范围分:段内转移和段间转移按照获取转移地址的方法分:直接转移和间接转移,无条件转移 功能:无条件转移,执行指定标号处的指令,说明:标号是转移地址标号。SHOR

45、T是短转移,其转移范围相对于指令地址而言在+129 126个单元之间。,$-127:$-126:$:JMP SHORT;非法转移$+129:$+130:,段内“JMP 标号”,在实模式下,可转移到64K代码 段的任何位置。“JMP 寄存器操作数/内存操作数”的应用在程序设 计中再介绍。,2.条件转移,一般格式 操作码助记符 转移地址标号 应用 CMP 目,源 条件转移指令转移范围:转移到代码段任何位置操作码助记符隐含了转移的条件,(1)按标志位的当前状态转移 设转移地址标号为XYZ,JC XYZ;当前C标志为1转 JNC XYZ;当前C标志为0转 JZ XYZ;当前Z标志为1转 JNZ XYZ

46、;当前Z标志为0转,JS XYZ;当前S标志为1转JNS XYZ;当前S标志为0转JP XYZ;当前P标志为1转JNP XYZ;当前P标志为0转JO XYZ;当前O标志为1转JNO XYZ;当前O标志为0转,无符号数条件转移 应用:CMP N1,N2;N1,N2为无符号数 无符号数条件转移 设:转移地址标号为XYZ 则:JA XYZ;N1 N2转 JNA XYZ;N1N2转 JC XYZ;N1 N2转 JNC XYZ;N1 N2转,(3)有符号数条件转移应用:CMP N1,N2;N1,N2 为有符号数(机器数)有符号数条件转移 JG XYZ;被减数的真值大于减数的真值转 JGE XYZ;被减数

47、的真值大于等于减数的真值转 JL XYZ;被减数的真值小于减数的真值转 JLE XYZ;被减数的真值小于等于减数的真值转,(4)循环控制转移 LOOP XYZ;CX-1 CX,结果不为零转 LOOPZ XYZ;CX-1 CX,结果不为零,且Z标为1转 LOOPNZ XYZ;CX-1 CX,结果不为零,且Z标为0转 JCXZ XYZ;测试CX,若CX=0转 JECXZ XYZ;测试ECX,若ECX=0转,注意:循环控制转移,其转移范围相对于指令地址 而言为:-126+129,例:设AL=无符号数,实现:若AL5转NEXT,否则不转下面的3种解法哪一种正确?,CMP AL,5 JNC NEXT,M

48、OV AH,5 CMP AL,AH JNC NEXT,CMP AL,5 JGE NEXT,若AL=0127,则:解法1:CMP AL,5 解法3:CMP AL,5 JNC NEXT JGE NEXT这2种解法都是正确的。,例:某班级40人,某课程考试成绩存放在SCORE开始的内存单元。请统计及格人数OK单元。,思路:考试成绩应视为无符号数,把成绩依次取出和60 比较,大于等于60为及格。数据段:SCORE DB,;40 个成绩 OK DB?,SCORE 有效地址 BX人数CX0 DL,DS:BX 60,JC NO INC DLNO:INC BX DEC CX JNZ LAST MOV OK,D

49、L 返回DOS,强调:CMP BX,60是错的。程序执行后应返回DOS,把控制权转交给操作系统,代码段:MOV AX,SEG SCORE MOV DS,AX MOV DL,0 MOV CX,40 MOV BX,OFFSET SCORELAST:CMP BYTE PTR BX,60,3.调用与返回指令 调用:调用子程序,即无条件转到子程序的第一条指令 返回:返回断点,即返回到CALL的后继指令 子程序:能完成一定功能的相对独立的程序段,(1)汇编语言的过程定义语句格式 过程名 PROC 属性 子程序实体 RET 过程名 ENDP,说明:过程名:子程序名,以字母开头,长度31,经汇编之后,过程名就

50、是子程序第一条指令的地址。PROC/ENDP 是子程序的定界语句 属性 有2种描述 NEAR(或缺省)代表近过程 即该子程序和调用它的那条指令在同一个代码段 FAR 代表远过程 即该子程序和调用它的那条指令不在同一个代码段 RET子程序返回指令,(2)段内调用 段内直接调用CALL过程名,功能:断口偏移地址堆栈 子程序入口的偏移地址IP,从而转子程序,(3)段间调用 段间直接调用 CALL过程名 段间间接调用 CALL内存操作数功能:断口的“段基址:偏移地址”堆栈 子程序入口的“段基址:偏移地址”CS:IP,实现段间转移,段内间接调用CALL寄存器操作数 CALL内存操作数,(4)段内/段间返

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号