1、第 1 页汇编语言曹永忠信息工程学院2007/7/17第 2 页第一章 预备知识一、教学基本内容 、了解机器语言、汇编语言、汇编源程序、汇编程序、汇编、宏汇编程序等基本概念,正确认识学习汇编语言的重要性。、掌握 8086 处理器中各寄存器的符号表示形式、大小及主要用途。、理解主存的编址方式以及存储器物理地址形成的方式。、理解 8086 处理器关于使用堆栈的有关规定,掌握堆栈操作指令的功能以及使用格式。、掌握数值数据及字符数据在机内的表示形式、压缩 BCD 码和非压缩 BCD 码在机内的表示形式。、掌握标志寄存器中各标志位的置位方式。重点:主存的编址方式以及存储器物理地址形成的方式难点:堆栈的概
2、念及使用。二、知识点:、机器语言、汇编语言、汇编源程序、汇编程序、汇编、宏汇编程序等基本概念,要求达到“识记”层次。、8086 处理器中各寄存器的符号表示形式、大小及主要用途,要求达到“识记”层次。、主存的编址方式以及存储器物理地址形成的方式,要求达到“理解”层次。、堆栈的概念及堆栈操作指令执行后内存及相关寄存器值的变化,要求达到“理解”层次。、数值数据及字符数据在机内的表示形式、压缩 BCD 码和非压缩 BCD 码在机内的表示形式,要求达到“理解”层次。、标志寄存器中各标志位的置位方式,要求达到“识记”层次;运算对各标志位的影响,要求达到“掌握”层次。1.1 机器语言和汇编语言1、机器语言
3、三种语言的层次关系机器语言汇编语言高级语言 机器指令:指挥计算机完成某一基本操作的命令。格式: 操作码 地址码 1 地址码 2例:将偏移地址为 100 的字存储单元中的内容加 2,在回送到原存储单元中去的机器指令如下:8306640002其中 8306H 为 操作码6400H 为 目的操作数02H 为源操作数 指令系统:机器指令面向机器,每台计算机都规定了自己所特有的一定数量的基本指令,这批指令的全体即为该计算机的 指令系统 机器语言:这种 机器指令的集合。 机器语言程序:用机器语言编写的程序。第 3 页2、汇编语言ADD WORD PTR DS:100,2 汇编语言:用助记符表示机器指令的操
4、作码;用变量代替操作数的存放地址;在指令前冠以标号,用来代表指令的存放地址 汇编语言与机器语言注: 汇编程序 :能够将汇编源程序翻译成目标程序(机器语言) 汇编语言的特点: 所占空间、执行速度与机器语言相仿 直接、简捷,能充分控制计算机的硬件功能1.2 Intel 8086 微处理器简介通用寄存器:AX(累加器 )BX(基址寄存器)CX(计数器 )DX(数据寄存器) ;可以分位使用。指针及变址寄存器:SP(堆栈指针寄存器)BP(基址指针寄存器)SI(源变址寄存器)DI(目的变址寄存器)汇编源程序 目标程序( 机器语言)汇编程序第 4 页IP(指令指针寄存器):用来存放下一条要执行指令在内存中代
5、码段中的偏移地址。1.3 主存储器和堆栈、主存储器 主存的基本存储单位是位(bit),它能容纳一个二进制数的 0 或 字节编址:以字节为最小寻址单位。 8086 的最大寻址空间 1M 字的存放形式“低位在前,高位在后”00200H 起 取一个字得 3412H00201H 起 取一个字得 5634H “对准字”和“不对准字”、堆栈在内存中开辟出一片存储区,采用一端固定,另一端活动的方式存取数据。堆栈的图示: 进栈指令 PUSH格式: PUSH OPS功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈。(SP)-2 SP例:假设(SP)=1000H (AX)= 1234HPUSH AX(SP)
6、=0FFEH注:PUSH AL ;错误00000H00200H00201H00202HFFFFFH12H34H56H栈底栈顶 SP:指向最后存入的数据的单元SP12H34H SP第 5 页PUSH 0003H ;错误 出栈指令 POP格式: POP OPD功能:将栈顶元素(字)弹出送至寄存器、段寄存器(CS 除外)或存储器中。(SP)+2 SP例:设 (BX)=2004HPOP BX执行后: (BX)=1234H (SP)=1000H注:PUSH CS ;正确POP CS ;错误、存储器的分段管理 地址表示的一对矛盾:直接寻址能力为M ( 字节) ; 而寄存器是位结构的。 解决方法:引入了存储
7、器“分段”的概念,即把1M字节内存空间分成若干段。每段最大可达64K字节可由16位寄存器进行寻址。段的起始地址成为“段基址”,要访问的单元距段基址的距离(字节数)为“ 偏移量”(Offset) 。程序设计时,使用的是逻辑地址。逻辑地址由“段基址” 和 “偏移量”构成(均为16位) 。“段基址” 由段寄存器CS、DS、SS和ES提供;“偏移量” 由BX、BP、IP、SP、SI、DI或根据寻址方式计算出的有效地址EA(Effective Address)提供。 注意:每个存储单元有唯一的物理地址,但它却可由不同的“段基址”和“偏移量”组成。例如:1200H:0345H12345H 1100H:13
8、45H12345H 除非专门指定,一般情况下,段在存储器中的分配是由操作系统负责的。段的起始地址偏移量要访问的单元段第 6 页例 1:设(CS)=8000H (IP)=0100H问下一条要执行的指令的物理地址 PA?(CS)内容左移位(IP)PA = 80000H+0100H=80100H例:设(DS)=1000H 该数据段中偏移量为 0200H 处的物理地址 PA?(DS)内容左移位偏移量PA = 10000H +0200H =10200H例 3:设(SS)=1000H (SP)=2000H 问该堆栈段栈顶的的物理地址 PA?(SS)内容左移位(SP)PA = 10000H +2000H =
9、12000H1.4 数值数据在机器内的表示形式8086 的两个规定: 数值数据均指无符号定点数 有符号数则一律采用 n 位二进制补码表示。例 1:设 M = 14 = 0EHM补 = 0EH机器内:扩展成 16 位后:M补 = 000EH机器内:例 2:设 M = -14 = -0EHM补 = 0F2H机器内:扩展成 16 位后:M补 = 0FFF2H机器内:注:最高位(符号位)向左扩展若干位后,仍是该数的补码。 8086 中,16 位补码的表示范围:0 0 0 0 1 1 1 00 0 0 0 0 0 0 0 0 0 0 0 1 1 1 01 1 1 1 0 0 1 01 1 1 1 1 1
10、 1 1 1 1 1 1 0 0 1 0第 7 页7FFFH 8000H注:机器在进行算术运算时,总是把参加运算的用补码表示的操作数作为无符号数处理。1.5 字符数据在机器内的表示形式1、ASCII 码 (美国信息标准交换码) 字符数据是以 ASCII 码形式存放在内存中的。例如 “1” 就是 31H“A” 就是 41H2、BCD 码定义:利用二进制形式来表示十进制数。利用 4 位二进制数(0000B1001B)来表示十进制数(09)例如: 19 = 00011001BCD= 000010011B 压缩 BCD(组合 BCD) 一个字节存放两个十进制数位例 如 19 非压缩 BCD(非组合 B
11、CD) 一个字节存放一个十进制数位例如 19注:这种情况下,高四位全零;低位在前,高位在后。1.6 标志寄存器1、状态标志:表示前面的操作执行后,算术逻辑部件处于怎样一种状态。例如,是否产生了进位,是否发生了溢出等等。程序中,可以通过对某个状态标志的测决定后面的走向及操作。例如: STATE: IN AL, 0DAH;TEST AL, 02H;JZ STATE 零标志ZF(Zero Flag):若运算结果为0,则ZF1;否则ZF0。0 0 0 1 1 0 0 10 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1CFPFAFZFSFTFIFDFOF012345678910111213
12、1415第 8 页例1:MOV AL, 4SUB AL, 4例2:XOR AX, AX执行后,ZF也一定为1。 进位标志CF(Carry Flag):它反映:加法时,最高位(字节操作时的D7位,字操作时的D15位)是否有进位产生。减法时,最高位(字节操作时的D7位,字操作时的D15位)是否有借位产生。例如: MOV AL, 3;SUB AL, 4;执行后,CF1。 奇偶标志PF(Parity Flag):若运算结果低8位中“1”的个数为偶数,则PF1;否则PF 0。例:MOV AL, 2ADD AL, 1执行后,PF位为1。 辅助进位标志AF(Auxiliary carrry Flag):也称
13、“半进位标志”,它反映:加法时,第3位向第4位有进位;减法时,第3位向第4位有借位。 溢出标志OF(Overflow Flag):若运算过程中发生了“溢出”,则OF1。定义:运算结果超出计算装置所能表示的范围,称为溢出。判断方法之一【逻辑】:溢出最高位进位 次高位进位例:分析执行下述两条指令后,以上六个标志位的变化。MOV BL,58HADD BL,4AH解: 01011000B+ 01001010B10100010BCF=0 SF=1 OF=1 PF=1 ZF=0 AF=12、控制标志(3位):每一位控制标志都对一种特定的功能起控制作用。可以通过专门的指令对其进行“置位”(Set)或“复位”
14、(Reset) 。 中断标志IF(Interrupt Enable Flag):如果IF置“1” ,则CPU可以接受可屏蔽中断请求;反之,则 CPU不能接受可屏蔽中断请求。指令系统中有两条专门的指令可以置“1” 或置“0” IF标志位:STI 使IF置“1” ,即开放中断。CLI 使 IF 清“0” ,即关闭中断 方向标志DF(Direction Flag):用于串操作指令中的地址增量修改(DF0)还是减量修改(DF1) 。STD 第 9 页CLD 跟踪标志TF(Trap Flag):若TF1,则CPU按跟踪方式(单步方式)执行程序。、标志位寄存器的操作 传送LAHF 功能:将标志位寄存器的低
15、8位送入AH中,即:(FLAGS)70 AH例:执行前 (FLAGS)=0485H (AX)=0FFFFH执行后 (FLAGS)=0485H (AX)=85FFHSAHF功能:将AH的内容送入标志位寄存器的低8位中,即:AH (FLAGS)70 栈操作PUSHFPOPF例:MOV AX,0FFFFHPUSH AXPOPF结果:(FLAGS)=0FFFFH1.7 常用指令简介功能:将 BX 中的内容放到 AX 中其他指令:ADD AX,100SUB AX,100INC AXDEC BXMOV AX , BX操作码 目的操作数 源操作数第 10 页第二章、寻址方式教学目的与要求 熟练掌握六种寻址方
16、式(立即方式、直接方式、寄存器方式、寄存器间接方式、变址万式基址加变址方式的汇编格式、功能及使用方法。教学内容、寻址方式的基本概念。、六种寻址方式的汇编格式、功能及使用方法。、寻址方式的应用。考核知识点与考核要求六种寻址方式的汇编格式、功能及使用方法,比较各种寻址方式的应用场合,要求达到“掌握”层次。所谓寻址方式:就是寻找操作数存放地址的方式。2.1 立即寻址(Immediate addressing)指令中直接给出操作数,操作数紧跟在操作码之后,作为指令的一部分存放在代码段里,在取出指令的同时也就取出了操作数,立即有操作数可用,所以称之为立即寻址。例:MOV AL,80HMOV AX,306
17、AH 立即数可以为8位,也可以为16位。如果是16位数,则“ 高位字节存放在高地址中,低位字节存放在低地址中 。 ” 立即寻址方式常用于给寄存器赋值,并且只能用于 源操作数,而不能用于目的 操作数2.2 寄存器寻址(Register addressing)操作数在寄存器中,指令中指明寄存器号,这种寻址方式叫寄存器寻址。 对于8位操作数,寄存器可以是 AH, AL, BH,BL, CH, CL, DH, DL 对于16位操作数,寄存器可以是AX, BX,CX, DX, SI, DI, SP 和 BP 例:MOV AL,BLINC BX(1) 操作数就在寄存器中,不需要 访问存储器来取得操作数(指
18、令执行时,操作就在CPU的内部进行) ,因而执行速度快。(2) 寄存器号比内存地址短* 在编程中,如有可能,尽量使用这种寻址方式的指令。* 寄存器寻址方式既可用于源操作数,也可用于目的操作数,还可以两者都用于寄存器寻址方式(如 MOV BX , AX )2.3 直接寻址(Direct Addressing) 在讨论寻址方式时,通常把操作数的偏移地址称为有效地址EA ( Effective Address) ,EA可通过不同的寻址方式来得到。第 11 页 在直接寻址方式中, 指令中直接给出操作数的有效地址 ,或者说,有效地址 EA 就在指令中。它(操作数的有效地址,而不是操作数本身)存放在代码段
19、中指令的操作码之后,但操作数一般存放在数据段中。例 1 MOV AX , ds:2000H;ds:跨段前缀如(DS)= 3000H, 则 PA=3000H *16d +2000H例 2 MOV AX , BUFA; BUFA 为一变量名,这时可以不加跨段前缀,默认为DS例 3 下面是运用跨段前缀的一些语句:MOV AX,ES:1000HMOV BX,SS:0100H2.3 寄存器间接寻址(Register indirect Addressing) 采用寄存器间接寻址方式时,指令中给出寄存器号(寄存器为BX,BP,SI和DI之一),被指定的寄存器中存放着操作数的有效地址,操作数在存储器中 以寄存
20、器的内容为操作数的有效地址 格式: R 只有下面四个寄存器:BX对应段寄存器为 DSBP SSSI DSDI .DS例: MOV AX , BX ;设 ( DS) = 2000H ,(BX) = 1000H 物理地址PA20000H 1000H =21000H指令的执行结果为:(AX) = 5A30H指令中也可以通过“段跨越前缀”取得其他段中的数据.例:MOV AX,ES: BX2.4 变址寻址(Indexed Addressing) 操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和。 格式: R+X 或 XR X+R30H5AH数据段BX 21000H第 12
21、 页 若没有段跨越前缀,则对于寄存器BX,SI,DI的情况,段寄存器为DS;而对于寄存器为BP的情况,则段寄存器为SS.例: MOV AX, SI+3000H 设(DS)4000H,(SI)=2000H 则物理地址PA40000H+2000H+3000H 45000H 2.5 基址变址寻址(Based indexed addressing) 操作数的有效地址是一个基址寄存器和一个变址寄存器内容以及位移量X三者之和,两个寄存器均由指令指定。 格式: BR+IR+X 或 XBR+IR XBRIRX 为8位或16位二进制补码表示的有符号数BR 基址寄存器 可以选用 BX,BP, 它们“决定 ” 段I
22、R 变址寄存器 可以选用 SI,DI 例如:MOV AX,8BX+SIMOV BX,-6BP+DI综合举例:例1:指出下列指令中源操作数的寻址方式:MOV AX,02FHMOV BX,SIMOV CX,BX+SI+2MOV DX,DS:1000HMOV SI,BX例2:指出下列指令的错误:MOV BX,AXOPOP003034H12H代码段数据段45000HAX第 13 页MOV BX, DSSIMOV CX,2MOV SI+DI,AXMOV AX,2000H第 14 页第三章、宏汇编语言教学目的与要求 、了解常量、变量与标号在汇编语言中的属性和定义形式,应使学生熟练使用数值表达式和地址表达式
23、。、掌握数据传送指令、算术逻辑运算指令的语句格式及功能。、了解伪指令和机器指令的区别,掌握数据定义伪指令和符号定义伪指令的格式及功能。、理解假定伪指令 ASSUME 的功能和使用方法,以及汇编地址计数器$的作用。、熟练掌握号、号、号、号系统功能调用的格式要求及功能。教学内容、数值表达式和地址表达式。、数据传送指令、算术逻辑运算指令。、伪指令。、DOS 系统功能调用。考核知识点与考核要求、常量、变量与标号在汇编语言中的属性和定义形式,数值表达式和地址表达式的使用,要求达到“掌握”层次。、数据传送指令、算术逻辑运算指令的语句格式及功能。要求达到“掌握”层次。、伪指令的语句格式及功能,要求达到“掌握
24、”层次。、DOS 系统功能调用的机理,要求达到“掌握”层次。3.0 一个简单的汇编语言源程序两数求和程序如下:DSEG SEGMENT DATADATA1 DB 15HSUM DB 00HDSEG ENDSCSEG SEGMENT CODEASSUME CS:CSEG,DS:DSEGSTART: MOV AX, DSEGMOV DS, AXMOV AL, DATA1ADD AL, 12HMOV SUM, ALHLTCSEG ENDSEND START观察程序的结构,猜测各语句的作用。3.1 汇编语言中的表达式一、常量与数值表达式第 15 页1、常量:在将汇编源程序翻译成目标程序期间已经有确定的
25、数值的量。 分类:数值常量,符号常量 数值常量的表示方法二进制常量: 010101110B 010101110b八进制常量: 12537O 45Q十进制常量: 4298 1289D十六进制常量: 0ABC2H 字符常量 123ABC “STUDY” 标识符的格式 标识符的第一个字符必须是字母、问号?、或下划线_四者之一; 从第二个字符开始可以是字母、问号?、下划线_或数字; 一个标识符的长度可以有 131 个字符例:下列标识符定义正确的是( )A) 3DATA B) DATA_3 C) DATA 3 D) DATA.3 符号常量定义的方法 EQUAA EQU 50 =BB = 100例:MOV
26、 AX,BB则等价于 MOV AX,1002、数值表达式:对常量的运算 算术运算 + - * / MOD SHR SHL例:CC EQU 11111111B表达式 CC SHR 3 ; 等价于 00011111B 逻辑运算 AND OR XOR(按位加) NOT例:789AH XOR 000FH ; 等价于 7895H 关系运算 EQ NE LT GT LE GE注意:关系运算表达式的结果:真 0FFFFH假 0例: NUM = 50NUM NE 100 ; 等价于 0FFFFHMOV AX, NUM EQ 100 ;(AX)=0二、变量、标号与地址表达式1、变量:数据存储单元的名字 变量的段
27、属性 变量的偏移量属性 变量的类型属性:字节,字,双字,4 字,10 个字节2、变量的定义在数据段或附加段中用数据定义伪指令 DB、DW、DD、DQ、DT格式:变量名 数据定义伪指令 表达式,例如: x1 DB 08H第 16 页BUF DW 01H,02H,03H,04H 表达式的几种形式: 数值表达式 ASCII 码字符串(只有用 DB 定义变量时,才允许字符串长度超过 2 个字符)例:BUF1 DB HELLO ;等价于 BUF DB H ,E,L,L,OBUF2 DB ABBUF3 DW AB 地址表达式 (只适用 DW、DD 两条伪指令)例:BUF1 DB HELLOSA_BUF D
28、W BUF1LA_BUF DD BUF1 ?例: SUM DW ? 重复子句格式为: N DUP (表达式)例:N DB 3 DUP (01H,02H)M DB 2 DUP(2,2 DUP (2,2)综合举例 1:书 P41 图 3。1综合举例 2:设有 BUF1 DB 01H,02H,03H,04H问 执行 MOV AL,BUF1 后 ,AL 中的内容?要想将以上定义的 03H 取入 AL,如何改上面指令?3、在指令中如何使用变量 直接寻址方式从变量中存取操作数时,定义该变量的段必须是当前段 类型要匹配例:MOV AX,BUF1 这条指令就是错误的。类型匹配的原则: 单操作数指令,操作数类型
29、必须明确; 双操作数指令,两明确类型的操作数必须匹配; 双操作数指令,一个类型明确,一个类型模糊时,以明确的那个操作数为准。例:MOV AX,BL; 错误MOV SI,200; 错误INC SI ; 错误MOV AX,SI ;正确MOV AL,SI ;正确4、标号(出现在代码段中)标号:机器指令语句存放地址的符号表示,也可以是过程名。例: XMOV: MOV AL, SIMOV DI,AL 标号的段属性 标号的偏移量属性 标号的类型属性:NEAR (只能在标号定义的段内使用)FAR5、地址表达式结果:段内偏移地址Comment yzcyz1: Page: 17第 17页例:BUF1 DB HE
30、LLOMOV AL,BUF1 ; (AL)=HMOV AL,BUF1+4; (AL)=O 在地址表达式中的几个特殊的算符 类型运算符 PTR格式: 类型 PTR 地址表达式注:这里的类型可以是 BYTE,WORD,DWORD,NEAR,FAR例: BUF DB 5,6,7MOV AX,WORD PTR BUF结果: (AX)= 0605H例: MOV SI,BYTE PTR 200MOV BYTE PTR SI,200但 MOV AL, BYTE PTR SI 就是条错误指令。例: W_BUF DW 1122H,3344HB_BUF EQU BYTE PTR W_BUF : 跨段前缀符格式:段
31、寄存器名:地址表达式或 段名:地址表达式 定义类型算符 THIS格式: THIS 类型作用:将类型符后面的类型属性赋予当前的存储单元。例: DATA1 EQU THIS WORDDATA2 DB 12H,34H,56H,78H这样,DATA1 变量是字类型,而 DATA2为字节类型,它们具有同样的段和偏移量。 属性分离算符取段址算符 SEG例:BUF DB 5,6,7 MOV AX,SEG BUF取偏移地址算符 OFFSET例:BUF DB 5,6,7 MOV SI,OFFSET BUF取类型算符 TYPE注:标号 NEAR 0FFFFHFAR 0FFFEH变量 字节 1字 2双字 4四字 8
32、10字节 10例:BUF DD 5,6,7 MOV CX,TYPE BUF ;结果 (CX)= 4 其他算符取变量单元数 LENGTH 第 18 页例: DATA SEGMENT A DW 6 DUP (02H)B DD 1,2,3,4,5,6DATA ENDSMOV BX, LENGTH A ;(BX)= 6MOV CX, LENGTH B ;(CX)= 1取变量字节数 SIZEMOV BX, SIZE A ;(BX)= 12MOV CX, SIZE B ;(CX)= 43.2 常用的机器指令语句一般格式:标号: 操作符 目的操作数,源操作数 ;注释标号: 操作符 目的操作数 ;注释注意点:
33、 类型要匹配 目的操作数不能是立即数 两操作数不能同时为存储器操作数 源操作数在运算后值不变一、数据传送类指令1、一般数据传送指令 传送指令MOV OPD,OPS功能: (OPS) OPD 实现 CPU 的内部寄存器或寄存器与内存间的数据传送(复制操作).标志:所有通用传送指令都不影响标志位。注意点:立即数不能直接传送到段寄存器两个段寄存器之间不能相互传送数据立即数,CS 不能作为目的操作数两个存储单元之间不能直接传送操作数的类型和长度必须一致,不允许溢出例: MOV AL, BL;MOV DI, AX;MOV CX,DS:1000H; MOV BL, 40MOV WORD PTRSI,01H
34、;练习1:把CX中的内容放入AX的指令:MOV AX,CX练习 2:用 MOV 指令实现两内存字节单元内容的交换用直接寻址方式实现2035H 01H.02H2045H第 19 页MOV BL, DS:2035H;MOV CL,DS:2045H;MOV DS:2045H,BL;MOV DS:2035H,CL;HLT用寄存器间接寻址方式实现MOV SI , 2035H;MOV DI, 2045H;MOV AH, SI;MOV AL, DI;MOV DS:2035H,AL;MOV DS:2045H,AH; 数据交换指令XCHG OPD,OPS例: XCHG AX,BX 查表转换指令XLAT OPS
35、或 XLAT功能: (BX)+(AL) AL注意:表的起始地址预先存放在 BX 中,AL 中的值是表中要被传送的字节到表头地址的字节数例: DATA SEGMENTTABLE DB 03H,06H,09H,0CH,0FHDATA ENDSMOV BX,OFFSET TABLEMOV Al,03HXLAT结果为: (AL)=0CH2、地址传送指令 传送偏移地址指令格式: LEA OPD,OPS功能:将 OPS 的地址放入 OPD 中注:OPD 必须是 16 位的通用寄存器例 1: MOV SI,OFFSET TABLE等价于 LEA SI,TABLE例 2: 注意 MOV AX,SILEA AX
36、,SI 区别例 3: lEA AX,SI ;正确MOV AX,OFFSET SI ;错误传送偏移地址及数据段首址指令格式: LDS OPD,OPS功能:将源操作数所指定的存储单元中取出某变量的地址指针(共 4 个字节) ,将第 20 页低地址两个字节(偏移量)送到目的操作数,将高地址两个字节(变量的段首址)送到 DS 中。注:OPD 必须是 16 位的通用寄存器OPS 必须是 DD 类型存储器地址例: LDS SI,ADDRBX设 (DS)=2000H , (BX)=1000H ADDR =0020H 执行该指令后:(SI)=1080H(DS)=4000H传送偏移地址及附加段首址指令格式: L
37、ES OPD,OPS二、算术运算类指令1、二进制数算术运算指令 加运算、加 1 指令格式: INC OPD例: INC AX注:INC 指令不影响 CF。、加指令格式: ADD OPD,OPS例:ADD AX,-7FFFH设 (AX)= 0FFFDH-7FFFH补=8001H0FFFDH+ 8001H7FFEHCF=1 OF=1、带进位加指令格式: ADC OPD,OPS功能:(OPD)+(OPS)+CF OPD例:多字的加法DATA SEGMENT80H10H00H20000HDS21020H40H第 21 页X1 DW 1234H,5678HX2 DW 7AB4H,9F88HSUM DW
38、0,0,0DATA ENDSMOV AX,X1ADD AX,X2MOV SUM,AXMOV AX,X1+2ADC AX,X2+2MOV SUM+2,AXMOV AX,0ADC AX,0MOV SUM+4,AX 减运算、减 1 指令格式: DEC OPD例: DEC AX注:DEC 指令不影响 CF。、求补指令格式: NEG OPD功能: 0 - (OPD) OPD将 OPD 的每一位取反(包括符号位)后加 1例: 设 (AX)=0001HNEG AX结果: (AX) = 0FFFFH CF=1、减指令格式: SUB OPD,OPS功能: (OPD) - (OPS) OPD例:设 (AX)=00
39、30H(BX) =0020HSUB AX,BX结果: (AX) = 0010H、带借位减指令格式: SBB OPD,OPS功能: (OPD) - (OPS)- CF OPD、比较指令格式: CMP OPD,OPS功能: (OPD) - (OPS)注:仅仅影响标志位,不回送结果 乘运算指令做加减运算时,有符号数 OF=0 正确无符号数 CF=0 正确第 22 页 无符号数乘运算格式: MUL OPS功能: 字节乘法: (AL)*(OPS) AX字乘法: (AX)* (OPS) DX,AX注意: OPS 不能是立即数乘法指令不影响 SF,ZF,AF,PF乘积的 DX(或 AH)中存在有效位,则 C
40、F=1,OF=1 否则 CF=0,OF=0 有符号数乘运算格式: IMUL OPS功能: 字节乘法: (AL)*(OPS) AX字乘法: (AX)* (OPS) DX,AX例:MUL BL指令执行前,(AL)=B4H=180 (BL)=11H=17指令执行后, (AX)= 0BF4H = 3060, CF=1,OF=1例:IMUL BL指令执行前,(AL)=B4H=-76 (BL)=11H=17指令执行后, (AX)= FAF4H =-1292, CF=1,OF=1 符号扩展指令 将字节扩展为字格式: CBW功能:将 AL 中的符号扩展至 AH例: MOV Al,-7CBWMOV SI,AX指
41、令执行后, (AX)=0FFF9H(SI) =0FFF9H 将字扩展为双字功能:将 AX 中的符号扩展至 DX例: MOV DX,0MOV AX,0FFABHCWD指令执行后, (DX)=0FFFFH(AX)=0FFABH 除运算指令、无符号数除运算格式: DIV OPS功能: 字节除法: (AX)/(OPS) AL(商),AH(余数)字除法: (DX,AX)/ (OPS) AX(商),DX(余数)注意: OPS 不能是立即数除法指令不影响标志位除 0 结果溢出,会产生溢出中断 有符号数除运算格式: IDIV OPS功能:字节除法: (AX)/(OPS) AL(商),AH(余数)第 23 页字
42、除法: (DX,AX)/ (OPS) AX(商),DX(余数)注:相除后,所得商的符号和数学规定相同,余数和被除数同号。例 1: DATA SEGMENTA DW 0400HB DW 00B4HC DW ?D DW ?DATA ENDS求无符号数 A/B 商放入 C,余数放入 D。 。 。 。 。MOV AX,AMOV DX,0DIV BMOV C,AXMOV D,DX例 2:实现 有符号除法 4001H/4MOV AX,-4001HCWDMOV CX,4IDIV CX结果: (AX)=0F000H(DX)=0FFFFH2、十进制数算术运算指令、加法调整、DAA 功能:将 AL 中二进制加法运
43、算的结果调整为两位压缩 BCD 码,结果仍保留在 AL 中。例:28+49 = 77观察 00101000+ 0100100101110001调整的方法:若 AL 的低 4 位大于 9,则 AL 的内容加 06H, 并 AF 位置 1若 AL 的高 4 位大于 9,则 AL 的内容加 60H, 并 CF 位置 1;若 AF=1,则低 4 位要加 6若 CF=1,则高 4 位要加 6例:(AX)=3412H, (BX)=5180H 完成 BCD 码加法。ADD AL,BLDAAMOV BCDBUF,ALMOV AL,AHADC AL,BHDAAMOV BCDBUF+1,AL第 24 页MOV A
44、L,0ADC AL,0MOV BCDBUF+2,AL AAA功能:将 AL 中二进制加法运算结果调整为一位非压缩 BCD 码,调整后的结果仍保留在 AL 中,如果向高位有进位(AF=1,CF=1),AH 的内容加 1。例: (AX)=0807H (BX)=0905HPUSH AXMOV AH,0ADD AL,BLAAAMOV BCDBUF,ALPOP AXMOV AL,AHMOV AH,0ADC AL,BHAAAMOV BCDBUF+1,ALMOV BCDBUF+2,AH、减法调整 DAS功能:将 AL 中二进制减法运算的结果调整为两位压缩 BCD 码,结果仍保留在 AL 中。调整的方法:若
45、AF=1,表示低 4 位向高 4 位有借位,则低 4 位要减 6 调整;若 CF=1,表示高 4 位向高字节有借位,则高 4 位要减 6 调整。 AAS功能:将 AL 中二进制减法运算结果调整为一位非压缩 BCD 码,如果有借位,则保留在 CF 中。、乘法调整AAM功能:将 AL 中二进制乘法运算结果调整为两位非压缩 BCD 码,高位放在 AH,低位 放在 AL。例: AND AL,0FHAND BL,0FHMUL BLAAM、除法调整AAD功能:将 AX 中的两位非压缩的 BCD 码被除数先调整为二进制数保留在 AL 中。然后再用除法指令。3、位操作指令可以对寄存器或存储器中的位进行操作。、
46、逻辑运算指令第 25 页 求反指令格式: NOT OPD功能:将目的地址中的内容逐位取反后,再送回目的地址中。例: NOT AX执行前:(AX) =0AAAAH执行后:(AX) =5555H 逻辑乘格式: AND OPD,OPS注:将不需要的位屏蔽,需要的位留下来。例 1: AND AL, 0FH执行前:(AL) =39H执行后:(AL) =09H例 2: A EQU 0B6HMOV AL,0ABHAND AL, A AND 0FDH执行后:(AL) =0A0H 测试指令格式: TEST OPD,OPS注:OPD 与 OPS 作将逻辑乘,根据结果影响标志位,OPD,OPS 内容不变。例: TE
47、ST AL, 80H执行前:(AL) =39H执行后: ZF=1 逻辑加格式: OR OPD,OPS注:常用来将目的地址中某一位或某几位置 1。例 1: OR AX, 55H执行前:(AX) =0749H执行后:(AX) =075DH 按位加格式: XOR OPD,OPS例 1: XOR AX, 0101H执行前:(AX) =0749H执行后:(AX) =0648H0000011101001001+ 00000001000000010000011001001000例 2:MOV AL,BLNOT ALXOR AL,BLOR BL,AL第 26 页程序段执行后,(AL)=_0FFH_,(BL)=_0FFH_.例 3: BYTE1 DB xx; XX 为任意数BYTE2 EQU 0FEHMOV DL,BYTE1OR DL,BYTE2程序段执行后,(DL)=_0FFH_或_0FFH_.、移位指令 算术、逻辑移位指令a、算术左移、逻辑左移格式:SAL OPD,1 或 SHL OPD,1SAL OPD,CL SHL OPD,CL功能:将 OPD 向左移动指定的位数,而低位补 0,CF 的内容为最后移入位的值。例: MOV CL,3SAL AL,CL执行前:(AL) =01H执行后:(AL) =08H , CF=0