微机原理-第7章 汇编语言与汇编程序1-3_第1页
微机原理-第7章 汇编语言与汇编程序1-3_第2页
微机原理-第7章 汇编语言与汇编程序1-3_第3页
微机原理-第7章 汇编语言与汇编程序1-3_第4页
微机原理-第7章 汇编语言与汇编程序1-3_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

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

文档简介

1,第7章 汇编语言与汇编程序,符号指令(symbolic instruction)与机器指令(machine instruction)用符号指令书写程序的语言称为汇编语言(Assembly language)汇编:把汇编语言写成的源程序翻译成机器指令(目标程序)基本汇编:分配存储区、进制转换、计算表达式的值、语法检查等。宏汇编:含宏指令宏汇编的三种基本指令:符号指令、伪指令、宏指令,2,7.1 符号指令中的表达式,符号指令:指令中使用助记符和用符号表示的操作数。符号用来表示指令的功能、某个存储单元、数据注意:以字母开始的十六进制数,要在其前面添加一个前导0. 例如:-1的补码应写为0FFH,3,7.1.1 常量,1、常量数值常量:如2345D,0FFH,A,BCD符号常量:由伪指令“EQU”定义,或由“=”号定义 P EQU 314 或 P=1汇编程序不给符号常量分配存储单元。注意:符号常量名后面没有冒号数值表达式允许对常量进行算术、逻辑和关系运算。如:COUNT EQU $-100,4,7.1.2 标号,标号是指令地址的符号表示,也可以是过程名标号的定义用“:”定义 CYCLE: MOV AL, SI 注意:使用符号(汇编)指令时,标号后面有冒号用于PROC 和ENDP伪指令定义过程时 MAIN PROC FAR MAIN ENDP标号的属性:段基址、偏移地址、类型(FAR/NEAR),5,7.1.3 变量,变量是代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以修改。 为了便于对变量的访问,它常常以变量名的形式出现在程序中。 (1)变量的定义与预置:定义变量就是给变量分配存储单元,且对这个存储单元赋于一个符号名一变量名,同时将这些存储单元预置初值。 定义变量使用数据定义伪指令DB(定义字节),DW(定义字),DD(定义双字)。 变量定义格式: 变量名 数据定义伪指令 表达式,,6,data segment BUFF DW 2301H,6745H,0AB89H,0EFCDH BINA DB A data ends经过定义的变量,每个变量均有3个属性: 段属性(SEG):表示变量存放在哪一个逻辑段中(即变量所在段的段基值。)偏移量属性(OFFSET):表示变量在逻辑段中离段起始点的字节数。类型属性(TYPE):表示变量占用存储单元的字节数。,7,表达式可以有如下几种情况:数值表达式。 DA-BYTE DB 50H,51HASCII码字符串 B1 DB AB$地址表达式 W1 DW B2 B2 DB 13,1,3?表达式 不带引号的?表示可预置任何内容。 DA-B DB ?,? n DUP表达式 DUP (duplicate)是定义重复数据操作符。 B2 DB 2 DUP(-5,-1),8,地址表达式类型的变更,使用类型PTR 地址表达式BYTE PTR W1WORD PTR B2BXBYTE PTR BX+5,9,7.2 符号指令的寻址方式,由指令字节给出的信息求出操作数的地址称为有效地址EA。寻找(得到)操作数有效地址的方法称为操作数的寻址方法寻找(得到)操作数有效地址和存取操作数的过程称为指令的寻址操作,符号指令与伪指令语句的格式是类似的。一般情况下,汇编语言的语句可以由部分构成: 标号: 助记符 目的操作数 源操作数 ;注释 其中带方括号的部分表示任选项,可以有,也可以没有。例: LOOPER: MOV AL,DATA2SI;取一个字节加数 DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数,10,(一)操作数寻址方式 共七种寻址方式1. 立即寻址2. 寄存器寻址3. 直接寻址4. 间接寻址 5种与存储单元 5. 基址寻址 有关的寻址6. 变址寻址 (存储器操作数)7. 基址变址寻址,7种,11,以数据传送指令MOV为例介绍寻址方式。指令 MOV dst, src 执行 (dst) (src)即: 源操作数的内容不变, 目的操作数 源操作数,12,立即寻址方式 操作数直接存放在指令中,紧跟在操作码之后,作为指令的一部分,存放在代码段里,这种操作数称为立即数。 操作数在指令中,取来指令立即可得到操作数。称该操作数为立即数。 立即数可以是8位或16位(16位的立即数是高位字节放在高地址,低位字节放在低地址)。应用场合: 立即数常用来给寄存器或内存单元赋初值。,例1 MOV AX , 2056H 结果 ( AH ) = 20H ( AL ) = 56H 例2 MOV AL , 78 H 结果 ( AL ) = 78H,注意:只能用于源操作数字段,不能用于目的操作数字段。,低地址,高地址,13,2. 寄存器寻址方式操作数在寄存器中,指令中指定寄存器名 8 位操作数, 用 8 位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 16 位操作数,用 16 位寄存器: AX、BX、CX、DX、SP、BP、SI、DI ( CS、DS、SS、ES仅用在部分传送指令中) 这种寻址方式因为操作数在寄存器中不需要访问存储器因此运算速度较高。,14,例1 MOV AX , 2056H 执行后:(AX)=2056H例2 MOV BL , AH 执行前:(BL) = 12H, (AH) = 78H 执行后:(BL) = 78H , (AH) = 78H,立即数寻址、寄存器寻址的操作数, 不用在取完指令后再到内存中取数。,15,存储器寻址指令中用 给出存储单元的偏移地址。 操作数的偏移地址又称有效地址EA ( Efficient Address),指令中用 给出偏移地址,或有效地址EA。,16,3直接寻址方式(Direct addressing):操作数地址的位偏移量,直接包含在指令中,存放在代码段中指令操作码之后, 但操作数一般存放在数据段中, 必须先求出操作数的物理地址, 然后再访问存储器才能取得操作数。直接寻址方式要点: 存储器操作数的有效地址EA在指令中直接给出。 例 MOV AL, 1000H 默认段寄存器为DS。 操作数所在内存单元的物理地址为: PA = ( DS )10H + EA 直接寻址方式默认段寄存器为DS,17,例:MOV AX , 1000 H 若 ( DS ) = 2000H 内存操作数的物理地址为: PA = ( DS )10H +EA = 2000H 10H + 1000H = 21000H 执行后 (AX)= 3040H,思考: 指令 MOV AX,1000H 与指令MOV AX, 1000H有什么不同?,18,在汇编语言程序中,允许不直接用数值表示偏移地址时,而用符号代替数值表示地址,称符号地址(变量名)。,例 符号buffer表示一个地址。 MOV AX , buffer或写成 MOV AX , buffer 源操作数为buffer指向的内存单元的内容,符号地址( 变量名)经汇编连接后,与一个确定的数值地址相对应,可用操作符Offset 获取变量的偏移地址。故 PA = ( DS )10H + Offset buffer 指令执行结果 ( AX ) = 0B0A H如:buffer在附加段中, 则应指定段跨越。(段跨越也可以是CS 、SS段寄存器) MOV AX,ES:buffer 或MOV AX,ES:buffer,19,4. 间接寻址(又称寄存器间接寻址 Register indirect addressing) 操作数放在存储器里,操作数的有效地址EA由寄存器给出,寄存器的内容为操作数的有效地址。 可用的寄存器有 BX、SI、DI、BP 如: MOV AL, BX MOV AH, SI MOV DL, DI MOV DH, BP ,20,默认段寄存器的关系: 使用BX、SI、DI,默认段寄存器为DS (BX) PA = ( DS )10H + (SI) (DI) 使用BP,默认段寄存器为SSPA = ( SS )10H + ( BP ),21,例: MOV AX , DI 若 ( DS ) = 3000H ( DI ) = 2000H 则内存操作数的物理地址为: PA = ( DS )10H + ( DI ) = 32000H 执行后 (AX) = (32000H) = 400BH,思考: 指令 MOV AX, DI 与指令MOV AX, DI有什么不同?,22,例: MOV AX , BP 若 ( SS ) = 4000H ( BP ) = 3000H 则内存操作数的物理地址为: PA = ( SS )10H + ( BP ) = 43000H 指令执行后 (AX) = (43000H) = 0102H,23,5. 基址寻址(Base Mode,寄存器相对寻址) 操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和。 可 用的寄存器有 BX、DI、SI、BP , 与寄存器间接寻址相同 如: MOV AL, BX +10HMOV AH, DI+20H MOV DL, 30H SI MOV DH, 40H BP ,24,默认段寄存器的关系与寄存器间接寻址相同,允许段跨越。 使用BX、SI、DI,默认段寄存器为DS (BX) PA = ( DS )10H + (SI) + 偏移量 (DI) 使用BP,默认段寄存器为SSPA = ( SS )10H + ( BP ) + 偏移量,25,例: MOV AX , BX+30H 若 ( DS ) = 2000H ( BX ) = 1000H 则内存操作数的物理地址为: PA = ( DS )10H + ( BX ) + 30H = 21030H 指令执行后: (AX) = (21030H) = 8976H,26,例: MOV AX ,60H BP 若 ( SS ) = 3000H ( BP ) = 200H 则内存操作数的物理地址为: PA = ( SS )10H + ( BP ) + 60H = 30260H 指令执行后: (AX) = (30260H) = 0ABCH,27,6. 变址寻址 (Based-Indexed Mode, 基址加变址寻址) 操作数的有效地址由一个基址寄存器与一个变址寄存器之和给出。 可用的基址寄存器为 BX 、BP ,变址寄存器为 SI 、DI。 如 MOV AL, BX+SI MOV AX, BXDI MOV DL, BP+SI MOV DX, BPDI ,28,29,使用BX的基址加变址寻址,默认段寄存器为DS,30,使用BP的基址加变址寻址,默认段寄存器为SS,CPU 总线 内存,DS,ES,SS,CS,IP,数据暂存器,FR标志寄存器,执行部件控制电路,指令译码器,AXBXCXDX,AH,BH,CH,DH,SI,DI,BP,SP,AL,BL,CL,DL,寄存器组,指令队列,总线接口控制电路,运算器,地址加法器,、指令1指令2指令3指令4、数据1数据2数据3、,地址总线AB,数据总线DB,控制总线CB,地址译码器,31,例: MOV AX , BX + SI 若 ( DS ) = 4000H ( BX ) = 2000H ( SI ) = 100H 则内存操作数的物理地址为: PA = ( DS )10H + ( BX ) + ( SI ) = 42100H 指令执行后 (AX) = (42100H) = 2345H,32,7. 基址变址寻址(相对的基址加变址寻址 Relative based indexed addressing) 操作数的有效地址由基址寄存器、变址寄存器、偏移量( 8位或16位)三者之和给出。 可用的寄存器与基址加变址寻址方式相同 基址寄存器有 BX、BP 变址寄存器有 SI、DI如 MOV AL, BX+SI +10H MOV AX,20H BXDI MOV DL, BP+SI+30H MOV DX,40H BPDI ,33,34,例: MOV AX , BX + SI + 10H 若 ( DS ) = 4000H ( BX ) = 3000H ( SI ) = 200H 则内存操作数的物理地址为: PA = ( DS )10H + ( BX ) + ( SI ) + 10H = 43210H 指令执行后 (AX) = (43210H) = 8877H,35,五种内存寻址: 寻址方式 形成EA EA计算式 直接寻址 位移量 EA=位移量 间接寻址 基址或变址 BX 或BP (寄存器间接寻址) EA= SI DI基址寻址 基址或变址 BX (寄存器相对寻址 ) +位移量 EA = BP + 8位 SI 或16位位移量 DI 变址寻址 基址+变址 BX+SI(基址变址寻址) BP+DI EA= BP+SI BX+DI相对基址变址寻址 基址+变址+位移量 EA =EA +位移量,36,指令机器码与操作数及寻址方式的简要说明,37,8086/8088的指令系统中共有92种基本指令。可以分成6个功能组:1数据传送(Data transfer)类指令2算术运算(Arithmetic)类指令3逻辑运算和移位(Logic& Shift)类指令4串操作(String manipulation)类指令5控制转移(Control Transfer)类指令6处理器控制(Processor Control)类指令,7.3 常用指令,38,介绍指令系统使用的符号:八位寄存器: AH,AL,BH,H,BL,CH,CL,DH,DL 十六位通用寄存器: AX,BX,CX,DX,SP,BP,SI,DI 堆栈指针 SP 指令指针 IP(或PC)标志位Flags目的和源变址寄存器DI, SI段寄存器CS, DS, ES, SS,39,src , dest源,目的操作数(下列寻址方式都可以用) BX+SI+n,BX+DI+n,BP+SI+n,BP+DI+nSI+n,DI+n, BP+n, BX+nN,r 存储器单元的内容(正常在数据段)ES: 附加存储器段的内容 OPRD 操作数Seg 段寄存器(CS,DS,ES,SS)i m 立即数 (n 8位, nn 16位, nnnn 32位 )DISP 位移量(displacement),40,8086/8088指令助记符表 (自学),自学,41,自学,42,(一)通用传送指令(General Purpose Transfer)(二)数据交换类指令(三)换码指令(Translate)(四)输入输出指令(Input and Output)(五)堆栈操作类指令(五)目的地址传送指令(Address-object transfer)(六)标志传送指令(Flag register transfer),一、数据传送类指令,43,8088提供方便灵活的通用的传送操作,适用于大多数操作数。通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数指令。通用传送指令包括:1、MOV (Movement)2、PUSH (Push word onto stack) POP (Pop word off stack)3、XCHG (Exchange)4、XLAT (Translate),(一)通用传送类指令,44,1MOVdest,src ; (dest) (src) 目的源目的 源功能: 把一个字节(B)或一个字(W)操作数由源传送至目的。 实现:寄存器 寄存器/存储器之间;立即数寄存器/存储器寄存器/存储器段寄存器之间的数据传送。,45, 具体说,通用数据传送指令能实现: CPU内部寄存器之间的数据的任意传送(除了码段寄存器CS和指令指针IP以外)。段寄存器之间不能传送。例: MOV DL,CH ; 8位寄存器 8位寄存器 MOV AX,DX ; 16位寄存器 16位寄存器 MOV SI, BP MOV DS,BX ;通用寄存器 段寄存器 MOV AX, CS ;段寄存器 通用寄存器,46,立即数传送至CPU内部通用寄存器组 (AX、BX、CX、DX、BP、SP、SI、DI)。 用于给寄存器赋初值。 不能直接给段寄存器赋值例: MOV CL,04H;立即数8位寄存器 MOV AX,03FFH;立即数16位寄存器 PTR :属性定义符号,符号后面的变量(或地址单元)有符号前面的属性 MOV WORD PTR SI ,057BH ;立即数存储器MOV BYTE PTR MEM, 5 ;立即数存储器,47,CPU内部寄存器(除CS和IP外)与存储器(所有寻址方式)之间数据传送。可以实现一字节或一个字的传送。 存储单元之间不能直接传送 例:MOV MEM , AX; 累加器存储器,直接寻址MOV MEM ,DS;段寄存器存储器,直接寻址MOV DISPBX ,CX;寄存器存储器,变址寻址MOV AX , DISP SI;存储器累加器,变址寻址MOV DS , MEM;存储器段寄存器,直接寻址MOV CX , DISP BX SI ;存储器累加器,相对基址加变址,48, 注意:(1)不能用一条MOV指令实现以下传送。 存储单元之间的传送MOV MEM2 , MEM1 错。MOV AX , MEM1MOV MEM2 , AX 对。 立即数送段寄存器 例 : MOV DS,2000H 错。MOV AX, 2000HMOV DS , AX 对。,49,段寄存器之间的传送MOV ES , DS ; 错MOV AX , DSMOV ES , AX ; 对 。 注意CS和IP的使用 CS和IP不能作为目标操作数,CS可以作为源操作数。例:MOV CS,AX ; 错 MOV AX,CS ;对 。 MOV IP, AX ;错 MOV AX, IP ;错。,50,51,52,53,54,55,(2)段地址的默认BX、SI、DI间址默认段地址为DS,BP间址默认段地址SS。(3)凡是遇到给SS赋值指令,系统自动禁止外部中断,执行本条指令和下条指令,恢复对SS寄存器赋值前的中断开放情况。这样做为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程出现中断。*在修改SS和SP的指令之间不要插入其他指令。(4)所有通用传送指令不影响标志位(除SAHF、POPF以外)。,56,MOV指令可以传送8位数据,也可传送16位数据,具体取决于指令中涉及的寄存器是8位还是16位,也取决于立即数的形式。 MOV指令中包括源操作数和目的操作数,两者之中应至少有一个是用寄存器指出的,这可减少指令长度。 不能在两个内存单元之间直接传送数据。 寄存器可以是源操作数,也可以是目的操作数,但CS寄存器不能用作目的操作数,可以用作源操作数。MOV CS,AX 错 MOV AX,CS 对,MOV指令使用注意(总结),57,立即数不能做目的操作数。 立即数不能直接送入段寄存器。 MOV DS,1234H 源操作数与目的操作数数据类型必须相同。 段寄存器之间不能互相传送。,58,IP寄存器不能作为操作数;MOV AX,IP 错 用BX、SI、DI间接寻址时,默认的段寄存器为DS,而用BP时,默认为SS。 8086系统规定,当遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等本指令和下条指令执行之后,自动恢复对SS寄存器赋值前的中断开放情况,以利于程序员用连续的两条指令改变堆栈空间。写程序时要注意在修改SS和SP的指令之间不要插入其他指令。,59,格式:XCHG dest , src;(dest) (src)执行操作: 把一个字节或一个字的源操作数与目的操作数相交换。 可以 实现: 寄存器之间 寄存器和存储器之间注意: 存储器之间不能交换,两个操作数中必须有一个在寄存器; 段寄存器不能作为一个操作数; 允许字或字节操作,不影响标志位。,(二) 数据交换指令,60,应用举例:XCHG BL,DLXCHG AX,SIXCHG COUNTDI, AXXCHG BX,DI(错)XCHG DS, AX (错),61,该指令不影响标志位。格式: XLAT str_table;(AL)(BX +AL) 或 XLAT str_table表格符号地址(首地址), 只是为了提高可读性而设置,汇编时仍用BX。,(三)换码指令,62,XLAT指令使用方法: 先建立一个字节表格; 表格首偏移地址存入BX; 需要转换代码的序号(相对与表格首地址位移量)存入AL; (表中第一个元素的序号为0) 执行XLAT指令后,表中指定序号的元素存于AL中。 (AL)为转换的代码。,63,XLAT指令应用: 若把字符的键盘扫描码转换成ASCII码,或根据数据查平方表, 或把数字09转换成7段数码管显示所需要的相应代码(字形码)等就要用XLAT指令。例:内存的数据段中有一张十六进制数字的ASCII码表。首地址为:Hex_table ,欲查出表中第10个元素(A),64,执行指令序列:MOV BX,OFFSET Hex_tableMOV AL,0AH XLAT Hex_table假设:(DS)=F000H, Hex_table=0040H(AL)=0AH执行XLAT以后: (AL)=41H=(F004AH),即“A”的ASCII码。,16进制数的ASCII码表,65,输入输出指令共两条: 1、IN (Input byte or word) 2 、OUT (Output byte or word) 输入指令用于CPU从外设端口接受数据, 输出指令用于CPU向外设端口发送数据。 无论接受还是发送数据,必须通过累加器AX(字)或AL(字节),又称累加器专用传送指令 。 输入、输出指令不影响标志位。,(四)输入/输出指令,66,每个外设要占几个端口:数据口,状态口和控制口。,67,信息交换要通过端口,在IBMPC机里,可以配接许多外部设备,每个外设与CPU之间交换数据,状态信息和控制命令,每一种信息交换都要通过一个端口来进行。端口数:外部设备最多有65536个I/O端口。 A0A15译码形成。端口号:端口号(即外设端口地址)为0000HFFFFH。PC机仅使用A0A9译码形成I/O口地址,即1024H个口地址 端口号:0000H03FFH其中: A9=1,表示扩充槽上的口地址。,68,长格式:端口号中前256个端口(0FFH),可以直接写在指令中,这就是长格式。端口号代替指令中的PORT,机器指令用二字节表示,第二字节就是端口号。短格式:当端口号256时,只能使用短格式,必须先把端口号放到DX寄存器中。不需要用任何段寄存器来修改它的值。,69,1、IN (Input byte or word) 输入指令格式:IN acc, port ;(acc) (port)具体形式有四种:IN AL, data8 ; 端口地址8位,输入一个字节IN AX, data8 ;端口地址8位,输入一个字IN AL, DX ;端口地址16位,输入一个字节IN AX, DX ;端口地址16位,输入一个字 必须通过累加器AX(字)或AL(节)输入数据。,70,2 、OUT(Output byte or word) 输出指令格式: OUT port, acc ;(port) (acc)具体形式有四种: OUT data8 , AL ; 端口地址8位,输出一个字节OUT data8, AX ;端口地址8位,输出一个字OUT DX , AL ;端口地址16位,输出一个字节 OUT DX , AX ;端口地址16位,输出一个字 必须通过累加器AX(字)或AL(节)输出数据。,71,例1:实现(29H)(28H)(DATA_WORD) IN AX,28H MOV DATA_WORD,AX例2:从端口3FCH 送一个字到AX寄存器MOV DX,3FCH IN AX,DX ; (AL)(3FCH), (AH)(3FDH) 例3:实现将(AL) (05H) OUT 5,AL;(05H)(AL),72,1. 只能用累加器AX作为执行输入输出过程的机构,不能用其它寄存器代替; 2. 输入输出指令可分为两大类:一类是直接的输入输出指令,寻址范围为0255H,即16进制数FFH是直接输入输出指令中允许使用的最大端口号;另一类是间接的输入输出指令,寻址范围为065535H,要在DX寄存器中设置好端口号,且只能用DX寄存器,而不能用别的寄存器。,注意问题:,73,PUSH 进栈指令 指令格式: PUSH OPRD 执行操作: SP SP-2, (SP + 1): (SP) OPRD 指令功能:该指令把一个字操作数从源传送到堆栈的顶部。常用于在调用过程前把参数入栈,16位寄存器(包括段寄存器)、存储器单元的内容都可入栈。 不影响标志位,(五)堆栈操作指令,74,假定AX=1234H,BX=5678H,SS=2000H,SP=0100H,则执行下列指令后堆栈的状态是:,PUSH AXPUSH BX,指令举例,75,PUSH指令举例,76,POP 出栈指令 指令格式: POP OPRD 执行操作: (OPRD) (SP + 1): (SP), SP SP+2 指令功能:该指令把SP所指向的堆栈顶部的一个字 传送到指定目的操作数,同时修改堆栈 指针,即SP SP+2。,77,假定在执行指令:POP CX POP DX之前,堆栈的状态如图所示。指令执行后,CX,DX的内容及堆栈的状态?,78,PUSH指令的目标地址一定在当前堆栈中。SS内容为段基值, 偏移量由堆栈指针SP指出。8086的堆栈操作总是按字进行的,即操作数一定是16位的寄存器或存储器操作数; 每执行一条推入(弹出)堆栈指令,堆栈地址指针SP减2(加2),推入堆栈的数据放在栈顶,低位字节放在较低地址单元,高位字节放在较高地址单元;堆栈中的内容是按后进先出的次序进行传送的。,注意问题:,79,(六)目标地址传送指令,功能:传送操作数的段地址或偏移地址。1、取有效地址指令 LEA LEA可将存储器地址送到一个寄存器。 要求:源操作数必须为内存单元地址,目的操作数必须为一个16位通用寄存器。 这条指令常用来使一个寄存器作为地址指针。例: LEA AX,2728H;(AX) 2728H LEA BX, BP+SI ;(BX) BP+SI LEA SP, 0428H ;(SP) 0428H,80,2、将地址指针装到DS和另一个寄存器的指令:LDS功能:把一个段地址和一个偏移量分别装入DS和另一个指定的寄存器。例如:设2130H21333H这4个单元存放着一个地址,2130H、2131H中为地址的偏移量,2132H、2133H中为段地址,执行指令: LDS DI, 2130H 而后,使偏移量送到DI,段地址送到DS。,81,3、将地址指针装到ES和另一个寄存器的指令:LES例如:LES SI,2134H,82,(七)标志位传送指令,共4条指令读取标志指令 LAHF LAHF指令将标志寄存 器F的低8位传送到AH中。设置标志指令 SAHF SAHF指令将AH的内容送到标志寄存器F的低8位。对标志寄存器的压入堆栈指令和弹出堆栈指令 PUSHF、POPF PUSHF、POPF指令一般用在子程序或中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。,83,算数运算指令涉及的一些问题加法指令减法指令乘法指令除法指令BCD码运算指令,二、算术运算类指令,84,算术运算指令涉及的一些问题,指令对标志位的影响操作数类型:无符号二进制整数、带符号二进制整数 无符号压缩十进制BCD码、无符号非压缩十进制BCD码关于指令的运算结果乘除法指令中操作数的存放位置,85,需要注意问题,8086指令系统提供了加、减、乘、除四种基本运算指令,可以处理无符号数或带符号的8位或16位二进制的算术运算,还提供了各种调整操作指令,故可进行压缩的或非压缩的十进制数的算术运算。 大多数算术运算指令都影响状态标志位。对于加法和减法运算指令,带符号数和无符号数的运算的操作过程是一样的;而对于乘法和除法运算,带符号数和无符号数的运算过程完全不同。,86,当无符号数运算产生溢出时,CF为1(编程关注);当有符号数运算产生溢出时,OF为1(编程关注) ;如果运算结果为0,则ZF1;如果运算结果的最高位为1,则SF1;如果运算结果的低8位有偶数个1,则PF1;如果第3位向第4位借位或者进位,AF1。,关于标志位的说明,87,1. 加法指令,(1)ADD 不带进位标志位的加法指令(2)ADC 带进位标志位的加法指令(3)INC 增量指令(4)DAA 加法的ASCII调整指令,88,(1) ADD 不带进位位的加法指令,指令汇编格式: ADD dest, src 操作: 两个操作数求和, 结果存目标操作数中。 dest(dest)+(src)受影响的状态标志位: OF,SF,ZF,AF,PF,CF说明: dest和src不能同时为存储器操作数或段寄存器。ADC、SUB、SBB、CMP、AND、OR、XOR等指令对寻址方式的要求相同。例:ADD AL, 50 ADD CX, 50H ADD BPDI, BX,89,(2) ADC 带进位位的加法指令,指令汇编格式: ADC dest, src操作: 两个操作数相加的同时,再加上CF。结果存入目标操作数中,可实现多字节的加法运算。 dest(dest)+(src)+CF受影响的状态标志位: OF,SF,ZF,AF,PF,CF例:ADC AL, 3 ADC DX, BX+10,90,指令汇编格式: INC dest操作:将指定的操作数加1,并将结果送回到目标操作数中。 dest(dest)+1受影响的状态标志位: OF,SF,ZF,AF,PF说明: INC 指令不影响标志位CF例: INC AL INC BX INC BYTE PTR BI+DI,(3) INC 增量指令,91,指令汇编格式: DAA指令功能:在用ADD或ADC指令对两个压缩BCD数,且运算结果已存在AL的情况下,用此指令将AL寄存器中的运算结果调整正确的压缩BCD数。,(4) DAA 加法的十进制调整指令,92,指令汇编格式: AAA指令功能:在用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法后,运算结果已存在AL的情况下,用此指令将AL寄存器中的运算结果调整为1位非压缩十进制数,仍保留在AL中,如果AF1,表示向高位进位,则进到AH寄存器中。,(5) AAA 加法的ASCII调整指令,93,2. 减法指令,(1) SUB 不考虑借位标志位的减法指令(2) SBB考虑借位标志位的减法指令(3) DEC减量指令(4) NEG求补指令(5) CMP比较指令,94,(1) SUB 不考虑借位的减法指令,指令汇编格式: SUB dest, src操作: 从目标操作数减去源操作数,结果存入目标操作数中。 dest(dest)-(src)受影响的状态标志位: OF,SF,ZF,AF,PF,CF例:SUB AL,10H SUB BX, BX+10H SUB AL, AL,95,(2) SBB 考虑借位的减法指令,指令汇编格式: SBB dest, src操作:从目标操作数中减去源操作数和CF,结果存入目标操作数中。 dest(dest)-(src)-CF受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明: SBB 指令主要用于多字节数据减法。例: SBB AL,0 SBB DL,CL SBB WORD PTR DI+2,1000H,96,(3) DEC减量指令,指令汇编格式: DEC dest操作:将指定的操作数减1,并将结果送回到目标操作数中。dest(dest)-1受影响的状态标志位:OF,SF,ZF,AF,PF说明: DEC指令不影响CF例: DEC BX DEC BYTE PTR BX+SI+1000H DEC SP,97,(4) NEG 求补指令(取负指令),指令汇编格式: NEG dest操作:从0中减去指令中给定的操作数, 最后将结果送回到给定的操作数中。 dest0-(dest)受影响的状态标志位: OF,SF,ZF,AF,PF,CF特殊情况:0,80H,8000H说明: NEG 指令对于带符号的数来说是取负,即改变操作数的符号。例: NEG AX NEG BYTE PTR BX+10,98,(5) CMP比较指令,指令汇编格式: CMP dest,src操作: 从目标操作数中减去源操作数,但不送回相减的结果。 (dest)-(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明: CMP 将两个操作数相减, 两个操作数保持原值不变, 但与SUB指令一样影响标志位,主要用在希望比较两个数的大小,而又不破坏原操作数。例: CMP AL, BL CMP DX, 10H,99,3. 乘法指令,(1) MUL 无符号数的乘法指令(2) IMUL 有符号数的乘法指令,100,(1) MUL 无符号数的乘法指令,指令汇编格式: MUL src操作: 源操作数与累加器的内容相乘。如果源操作数是字节数据,就与AL中的数据相乘,乘积为字,存放在AX中。如果源操作数是字数据,就与AX中的数相乘,乘积为双字,存放在DX和AX中。 两个字节数相乘: AXAL*(src)两个字数据相乘: DX,AXAX*(src)受影响的状态标志位: OF,CF说明: 源操作数src不能是立即

温馨提示

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

评论

0/150

提交评论