1、二二 数据传送指令数据传送指令存存储储器器I/O接接口口输输入入设设备备I/O接接口口数据总线数据总线 DB控制总线控制总线 CB地址总线地址总线 AB输输入入设设备备CPU寄存器,存储器,寄存器,存储器,I/O端口端口 数据传送是最基本、最重要的一种操作数据传送是最基本、最重要的一种操作 实际程序中,使用的比例最高实际程序中,使用的比例最高 change PROC LEA SI, num+2 MOV CL, num+1 MOV CH, 0 MOV AX, 0 MOV DI, 10 next: MUL DI MOV BH, 0 MOV BL, SI AND BL, 0FH ADD AX, BX
2、 INC SI LOOP next zero: MOV BX, AX RET change ENDP 汇编子程例汇编子程例:寄存器寄存器 寄存器寄存器寄存器寄存器 内存单元内存单元寄存器寄存器 I/O端口端口设置寄存器、内存单元的初始值设置寄存器、内存单元的初始值 按传送内容,可分为四类:按传送内容,可分为四类:1. 通用数据传送通用数据传送 MOV, PUSH, POP, XCHG, XLAT2. 地址传送地址传送 LEA, LDS, LES3. 标志传送标志传送 PUSHF, POPF, LAHF, SAHF 4. 输入输出传送输入输出传送 IN, OUT (在第五章介绍在第五章介绍) 特
3、点:特点: 1. 除除POPF、SAHF外,其他传送指令对标志位均无影响外,其他传送指令对标志位均无影响 2. 唯一允许以段寄存器做操作数的指令唯一允许以段寄存器做操作数的指令 且只有且只有MOV、PUSH、POP这三条允许这三条允许1. 通用传送指令通用传送指令 MOV、PUSH、POP、XCHG、XLATreg/ /mem/ /segreg regreg/ /segreg memreg/ /mem segregreg/ /mem data 可实现可实现1)MOV传送指令传送指令格式格式 MOV dst,src执行执行 ( dst ) ( src )例例 : reg/ /mem/ /segr
4、eg reg 通用寄存器通用寄存器/ /存储器存储器/ /段寄存器段寄存器通用寄存器通用寄存器 MOV AL , BL MOV BX , AL MOV DS , AX reg/ /segreg mem 通用寄存器通用寄存器/ /段寄存器段寄存器 存储器存储器 MOV AL , BX MOV DS , BX+SI reg/ /mem segreg 通用寄存器通用寄存器/ /存储器存储器 段寄存器段寄存器 MOV BX , CS MOV BX , DS reg/ /mem data 通用寄存器通用寄存器/ /存储器存储器 立即数立即数 MOV Al , 9 MOV BX , OFFSET buff
5、er MOV value , 0 MOV WORD PTR BX , 1MOV指令特点及注意事项指令特点及注意事项:l 双操作数指令双操作数指令 (注意双操作指令的特点)注意双操作指令的特点)l 可进行字节或字传送可进行字节或字传送l 不允许存储器传送到存储器不允许存储器传送到存储器MOV BX , value MOV DI, SI MOV AX ,value MOV BX ,AXMOV AL ,SI MOV DI ,ALl 可对可对 DS、ES、SS 赋值赋值 但但不允许立即数直接传送给段寄存器不允许立即数直接传送给段寄存器MOV DS,AX MOV ES ,BX MOV DS,1000H
6、MOV AX ,1000HMOV DS,AXl CS不能做目的操作数不能做目的操作数, 不能通过传送指令改变不能通过传送指令改变CS的值的值 MOV CS , AX l 不允许段寄存器传送到段寄存器不允许段寄存器传送到段寄存器 MOV ES ,DS MOV AX , DS MOV ES , AXD:MASMDEBUG-A1693:0100 MOV ES, DS Error1693:0100 MOV AX, DS1693:0102 MOV ES, AX1693:0104-例例 编程将编程将CL寄存器的内容传送到寄存器的内容传送到200:100H单元中。单元中。课外作业:课外作业: 编写程序段,将
7、内存编写程序段,将内存200:100H开始的一个字内容开始的一个字内容 传送到地址为传送到地址为800:400H开始开始的内存中。的内存中。MOV AX, 200HMOV DS , AX ; (DS) = 200HMOV 100H , CL ;(02100H) = (CL)编程编程1:MOV AX, 200HMOV DS , AX ; (DS) = 200HMOV DI , 100H ; (DI) = 100H MOV DI , CL ;(02100H) = (CL)编程编程2:MOV 200:100H , CL2)PUSH入栈操作入栈操作格式格式 PUSH src 执行执行 ( SP) (S
8、P)- - 2 (SS:SP) (src) 特点特点:l 单操作数指令单操作数指令l 操作数为操作数为16位位,可以是,可以是reg/ /segreg/ /mem, 不可以是不可以是datareg : AX, BX, CX, DX, SI, DI, BP, BXsegreg : CS, DS, ES, SSmem : 字类型字类型SS:SP SS:SP (src)例:例: PUSH AX若执行前:若执行前: (SS)= 2000H(SP)= 1002H(SS:SP)= 2010H (AX)= 1234H3B2A10低低高高20地址地址SS:SP2000:1002指令执行前指令执行前(AX)=1
9、234h则执行后:则执行后: (SS)= 2000H(SP)= 1000H(SS:SP)= 1234H(AX)= 1234H123410低低高高20地址地址SS:SP2000:1000指令执行后指令执行后(AX)=1234h不变不变 减减2 2 变变不变不变 3)POP出栈操作出栈操作特点特点:l单操作数指令单操作数指令l操作数为操作数为16位,可以是位,可以是reg/ /segreg/ /mem, 不可以是不可以是datareg : AX, BX, CX, DX, SI, DI, BP, BXsegreg : DS, ES, SS, 不允许是不允许是CSmem : 字类型字类型SS:SP S
10、S:SP (dst)格式格式 POP dst 执行执行 (dst) (SS:SP) ( SP) ( SP)+ + 2 若执行前:若执行前: (SS)= 2000H(SP)= 1000H(SS:SP)= 1234H (BX)= 5678H123410低低高高20SS:SP2000:1000指令执行前指令执行前地址地址(BX)=5678h例:例: POP BX123410低低高高20SS:SP2000:1002指令执行后指令执行后地址地址(BX)=1234h则执行后:则执行后: (SS)= 2000H(SP)= 1002H (SS:SP)= 2010H (BX)= 1234H 不变不变 加加2 变
11、变 变变 例:例:执行下列程序段执行下列程序段 PUSH AX PUSH BX MOV AX,66H MOV BX,99H POP BX POP AX 若执行前若执行前(SS)= 3000H(SP)= 200EH(SS:SP)= 1234H(AX)= 0A0BH(BX)= 0C0DH3000:200ESS:SP 执行前执行前(AX)=0A0B (BX)=0C0D3412执行执行后后30003000:200200C CSSSS:SPSP 0B0A3000:2003000:200A ASS:SPSS:SP 执行执行后后0D0C0B0A3000:200CSS:SP 执行执行后后: (BX)=0C0D
12、0D0C0B0A执行执行 后后 (AX)=0066 (BX)=0099执行执行 后后 (AX)=0066 (BX)=00993000:2003000:200A ASS:SPSS:SP 执行执行后后0D0C0B0A执行执行后后: (AX)=0A0B3000:200ESS:SP (BX)=0C0D执行执行 后后 (AX)=0066 (BX)=00990D0C0B0A用用PUSH往往SS段传送一批数据后,再用段传送一批数据后,再用POP取出时,取出时,取出单元的顺序与存放时的顺序正好相反,取出单元的顺序与存放时的顺序正好相反,“后进先出后进先出” POP AX (AX)=0A0BPUSH AX300
13、0:2003000:200E ESS:SPSS:SP 执行前执行前3000:200CSS:SP 3000:200ASS:SP PUSH BX3000:200ESS:SP 3000:200CSS:SP 0D0C0B0A3412 POP BX (BX)=0C0D(AX)=0A0B (BX)=0C0DMOV AX,0066 (BX)=0099MOV AX,0066 (AX)=0066 l 堆栈是一个内存区域。堆栈是一个内存区域。 通常用于存放一些重要数据通常用于存放一些重要数据, 如程序的地址、或是需要恢复的数据。如程序的地址、或是需要恢复的数据。SS:SP l为方便数据的存放和恢复,为方便数据的存
14、放和恢复, 设置专门的指针,指向堆栈中要操作的单元。设置专门的指针,指向堆栈中要操作的单元。 段值由段值由 SS 给出,偏移地址由给出,偏移地址由 SP 给出给出 SS 堆栈段寄存器堆栈段寄存器 (stack segment) SP 堆栈指针寄存器堆栈指针寄存器 (stack point)堆栈的概念堆栈的概念 stackl 堆栈操作指令堆栈操作指令 PUSH 和和 POP, 对对 SS 和和 SP 指向的内存单元,指向的内存单元, 以以“后进先出后进先出”方式进行操作。方式进行操作。 PUSH 入栈操作入栈操作 SP减小减小 POP 出栈操作出栈操作 SP增加增加 SP 指向栈顶,即堆栈的顶部
15、,指向栈顶,即堆栈的顶部, l 编程员通过设置堆栈区域,编程员通过设置堆栈区域, 利用堆栈操作,可方便的进行数据的存放和恢复。利用堆栈操作,可方便的进行数据的存放和恢复。SS:SP SS:0000:0000SS:FFFF:FFFF堆栈堆栈未用未用空间空间堆栈使用的场合堆栈使用的场合l 用堆栈保存恢复信息用堆栈保存恢复信息 (如上例)如上例)l 子程序的调用、返回以及中断调用、返回子程序的调用、返回以及中断调用、返回 (控制转移指令中介绍)(控制转移指令中介绍)l 用堆栈传送数据用堆栈传送数据 (程序设计中介绍)(程序设计中介绍)注意事项注意事项l 堆栈是一重要数据结构,使用堆栈应有明确目的。堆
16、栈是一重要数据结构,使用堆栈应有明确目的。 不乱用堆栈操作,不乱修改堆栈内容。不乱用堆栈操作,不乱修改堆栈内容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET 乱修改乱修改 SS 和和 SP 的内容的内容包括包括 乱用乱用BP参与的存储器操作数参与的存储器操作数 乱用指令乱用指令l PUSH和和POP 指令只能对字操作指令只能对字操作。 PUSH AL POP BYTE PTR BX l 可以对段寄存器操作可以对段寄存器操作 但但POP不能对不能对CS操作操作 PUSH DS PUSH CS POP ES POP CS 4)XCHG交换指令交换指令( (自学自学)
17、) 格式格式 XCHG oprd1,oprd2 执行执行 (oprd1) (oprd2)reg regreg memmem reg 可实现可实现例例 XCHG AX, BX 字操作字操作 执行前(执行前(AX)= 1122H (BX)= 3344H 执行后(执行后(AX)= 3344H (BX)= 1122H 例例 XCHG AH, BL 字节操作字节操作 执行前(执行前(AX)= 1122H (BX)= 3344H 执行后(执行后(AX)= 4422H (BX)= 3311HXCHG oprd1,oprd2 注意事项注意事项:l 双操作数指令双操作数指令l可可进行进行字或字节操作字或字节操作
18、l不允许对立即数、段寄存器做操作数不允许对立即数、段寄存器做操作数 XCHG AX, 4 XCHG BX, DS 2. 地址传送指令地址传送指令LEA、LDS、LESl LEA有效地址传送有效地址传送格式格式 LEA reg, mem执行执行 (reg) mem的的EA 即即 寄存器寄存器 存储器操作数的偏移地址存储器操作数的偏移地址 执行后执行后 ( BX ) = 1000H注意:注意: OFFSET是汇编程序提供的一个操作符,不是是汇编程序提供的一个操作符,不是CPU的指令的指令LEA BX, buffer例例 buffer是一个符号地址表示的内存操作数是一个符号地址表示的内存操作数(变量
19、变量)。.12h34h56h.buffer内存内存DS: 1000h若变量若变量buffer的偏移地址的偏移地址= 1000H等价于等价于 MOV BX ,OFFSET bufferbuffer 1A2B3C4D、例例 将将buffer为首的为首的4个字节内存内容相加,存放在个字节内存内容相加,存放在AL中。中。 MOV AX, SEG buffer MOV DS, AX LEA BX, buffer MOV CX, 4 MOV AL, 0 exit: ADD AL, BX INC BX DEC CX ;(cx) =(cx) -1 JNZ exit ;ZF 0, 转至转至exit说明:说明:
20、1) 操作符操作符SEG 的作用是的作用是取变量的段地址取变量的段地址。 执行完前两条指令后,执行完前两条指令后,(DS)=buffer的段值的段值 2) 操作符操作符OFFSET的作用是的作用是取变量的偏移地址取变量的偏移地址 执行完执行完LEABX, buffer, (BX)为为buffer的偏移地址的偏移地址, 3)操作数操作数 BX是以是以DS为段值,为段值,BX为偏移值的内存单元为偏移值的内存单元LEA reg, mem特点及注意事项:特点及注意事项:l目的操作数目的操作数reg应是应是16位通用寄存器位通用寄存器 LEA ES, BX LEA AL, buffer LEA 6, B
21、X+SI LEA DI, buffer l 源操作数应是存储器操作数源操作数应是存储器操作数 LEA BX, AX l 传送的是内存单元的有效地址,与其内容无关。传送的是内存单元的有效地址,与其内容无关。.12h34h56h.buffer内存内存3. 标志传送标志传送 PUSHF、POPF、 LAHF、SAHFSS:SP SS:SP (PSW)2) POPF标志出栈标志出栈格式格式 POPF执行执行 (PSW) (SS:SP) (SP) (SP)+ 2SS:SP SS:SP (PSW)1) PUSHF标志入栈标志入栈格式格式 PUSHF执行执行 (SP) (SP)- - 2 (SS:SP) (
22、PSW)特点及注意事项:特点及注意事项:l 无操作数的形式,操作数隐含为无操作数的形式,操作数隐含为( PSW)PUSHF AXPOPF CXl PUSHF和和POPF用于标志信息的保存和恢复用于标志信息的保存和恢复三三. 算术运算指令算术运算指令二二进进制制运运算算十十进进制制调调整整加加 ADD, ADC, INC AAA, DAA减减 SUB, SBB, DEC, NEG, CMP AAS, DAS乘乘 MUL, IMUL AAM除除 DIV, IDIV AAD 符符号号扩扩展展指指令令: CBW、CWD指令分类指令分类:特点:特点:l 带符号数用补码表示带符号数用补码表示 如如 MOV
23、 AX, -1 等价于等价于 MOV AX, 0FFFFh l 对加、减运算,不区分无符号数、带符号数对加、减运算,不区分无符号数、带符号数 (参见第一章例)参见第一章例) 对乘、除运算,区分无符号数、带符号数对乘、除运算,区分无符号数、带符号数l 可进行字节或字操作可进行字节或字操作l 影响状态标志影响状态标志 l十进制运算方法十进制运算方法 (不做重点,讲义中做了简单介绍不做重点,讲义中做了简单介绍)当数据用压缩或非压缩当数据用压缩或非压缩BCD码表示时,码表示时,为使运算的结果仍为为使运算的结果仍为BCD码表示,需对结果进行调整。码表示,需对结果进行调整。 十进制运算十进制运算 = 二进
24、制运算二进制运算 + 十进制调整十进制调整 十十进进制制数数码码012348421 BCD 码码00000001001000110100十十进进制制数数码码567898421 BCD 码码01010110011110001001BCD码码( Binary Coded Decimal )l 用二进制编码表示十进制数。用二进制编码表示十进制数。l 常用常用8421 BCD码码, 与十进制数码对应关系:与十进制数码对应关系:例例 48的的BCD码为码为 ( 0100 1000)BCD 根据在内存的存放形式,分压缩根据在内存的存放形式,分压缩BCD码和非压缩码和非压缩 BCD码码1) 压缩压缩BCD码
25、码 一字节存放一字节存放2个个BCD码。码。 如如 2148 的压缩的压缩BCD码为:码为:( 0010 0001 0100 1000 )压缩压缩BCD 在内存中占在内存中占2字节字节2) 非压缩非压缩 BCD码码一字节存放一字节存放1个个BCD码。码。 如如 2148 的非压缩的非压缩BCD码为:码为:( 00000010 00000001 00000100 00001000 ) 非压缩非压缩BCD 在内存中占在内存中占4字节字节当数据用压缩或非压缩当数据用压缩或非压缩BCD码表示时,码表示时,为使运算的结果仍为为使运算的结果仍为BCD码表示,需对结果进行调整。码表示,需对结果进行调整。 十
26、进制运算十进制运算 = 二进制运算二进制运算 + 十进制调整十进制调整例例(0000 1000 )(0000 1000 ) 压缩压缩BCD + (0000 1001)(0000 1001) 压缩压缩BCD = (0001 0111 ) (0001 0111 ) 压缩压缩BCD计算机计算过程计算机计算过程 看作压缩看作压缩BCD 0000 1000 08 0000 1000 08 + 0000 1001 09 + 0000 1001 09 0001 0001 110001 0001 11 二进制运算二进制运算十进制调整十进制调整+ 0000 0110 + 0000 0110 0001 0111
27、170001 0111 171. 加法运算指令加法运算指令指指令令格格式式执执 行行 操操 作作 ADD dst, src (dst) (dst) + (src) ADC dst, src (dst) (dst) + (src) + CF INC oprd (oprd) (oprd) + 1l ADD、ADC为双操作数指令为双操作数指令l INC为单操作数指令为单操作数指令l 除除INC指令不影响指令不影响CF外,外,6个状态标志均据结果设置个状态标志均据结果设置lADC带进位加法,实现字以上运算带进位加法,实现字以上运算OF DF IF TF SF ZFAFPFCF CFA1H CFA1H
28、1100 1111 1010 00011100 1111 1010 0001 + 62A0H + 0110 0010 1010 0000 + 62A0H + 0110 0010 1010 0000 111 111 1 1 1 1 1111 1 1 1 1111 1 3241H 0011 0010 0100 0001 3241H 0011 0010 0100 0001例例1 编程完成编程完成 CFA1H + 62A0H (做过的做过的随堂作业随堂作业) MOV DX,0CFA1HADD DX,62A0H执行后执行后:(DX)=3241H CF=1,OF=0,SF=0, ZF=0(注意(注意CF和
29、和OF的判断方法的判断方法)三组指令执行后的结果均为三组指令执行后的结果均为:(AL)=0FDH, CF=0, OF=0, SF=1, ZF=0 MOV AL, 0F1H ADD AL, 0CH MOV AL, 241 ADD AL, 12 MOV AL, -15 ADD AL, 12第一章中的例题第一章中的例题 F1 H F1 H+ 0C H+ 0C H FD H FD H二进制二进制运运 算算241241+ 12+ 12 253 253看看 作作无符号数无符号数(-15-15)+ 12+ 12 (-3-3)看看 作作带符号数带符号数B0F1040C、第一条第一条指指 令令第二条第二条指指
30、令令三组机器码相同:三组机器码相同:对加、减运算,对加、减运算,CPU计算时不区分无符号数、带符号数计算时不区分无符号数、带符号数例例2 INC AL 执行前执行前 (AL)= FFH 执行后执行后: (AL)=00H CF=不变,不变,OF=0,ZF=1,SF=0 FFHFFH + 01H + 01H 11 11 00H 00H 0101FFHFFH+ 0001H+ 0001H 11 11 0200H 0200H 例例3 value 是一个字变量是一个字变量 OFFSET value = 1000H (DS)=2000H,(,(21000H)=01FFHvalue FF21000H 01执行
31、前执行前value 0021000H 02执行后执行后执行后:执行后:(21000H)=0200H CF=不变,不变,OF=0,ZF=0,SF=0注意是内存单元内容加注意是内存单元内容加1,而非地址加,而非地址加1INC value或写成或写成:INC value例例4 将将buffer为首的为首的4个字节内存内容相加,存放在个字节内存内容相加,存放在AL中。中。 buffer 1AB7C5D6若编程如下若编程如下,MOV CX, 4MOV AL, 0 exit: ADD AL, buffer INC buffer DEC CXJNZ exit不能实现不能实现, 为什么?为什么? . MOV
32、CX, 4 LEA BX, buffer MOV AL, 0exit: ADD AL, BX INC BX DEC CX JNZ exit实现的是实现的是1A+1B+1C+1D指令指令INC buffer 将将buffer指向的内容加指向的内容加1,而不是地址而不是地址buffer加加1例例5 两双字相加两双字相加 0002F365H + 0005 E024 H = ?MOV AX,0F365H ADD AX,0E024H MOV BX,0002H ADC BX,0005H 00020002 F365 F365 H H + + 00050005 E024 E024 H H 00080008 D
33、389 D389 H H结果存放在结果存放在: 0008 D389(BX) (AX)执行完执行完、:(AX)= D389H CF=1, OF=0, SF=1, ZF=0 执行完执行完、:(BX)= 0008H CF=0, OF=0, SF=0, ZF=0分析分析: 8086/8088只能按字节或字相加。只能按字节或字相加。 位数在字以上的操作数,先加低位,再加高位,位数在字以上的操作数,先加低位,再加高位, 加高位时加入从低位产生的进位。加高位时加入从低位产生的进位。指指令令格格式式执执行行操操作作 SUB dst, src (dst) (dst) - - (src) SBB dst, src
34、 (dst) (dst) - - (src) - - CF DEC oprd (oprd) (oprd) - - 1 NEG oprd (oprd) 0 - - (oprd) CMP oprd1, oprd2 (oprd1) - - (oprd2)2. 减法运算指令减法运算指令l SUB、SBB、 CMP为双操作数,为双操作数,DEC、NEG为单操作数为单操作数l SBB为带进位减法为带进位减法l 除除DEC不影响不影响CF标志外,标志外,6个状态标志均据结果置位个状态标志均据结果置位l NEG求补运算,等价于用求补运算,等价于用0减去操作数。减去操作数。 其对标志位的影响,由其对标志位的影响
35、,由0减去该操作数的过程决定。减去该操作数的过程决定。例例1 编程完成编程完成 2D04H 3AB0H执行后执行后: : (AX)=0F254H CF=1,OF=0,SF=1,ZF=02D04H 0010 1101 0000 01002D04H 0010 1101 0000 0100 - 3AB0H - 3AB0H - - 0011 1010 1011 0000 0011 1010 1011 0000 1 1 1 1 1 1111 1 1 111111 1 1 111 F254H 1111 0010 0101 0100 F254H 1111 0010 0101 0100MOV AX ,2D04
36、HSUB AX ,3AB0H 借位借位例例2 value 是一个字节变量是一个字节变量 OFFSET value = 1000H (DS)=2000H,(,(21000H)=00H DEC value 执行后:执行后:(21000H)=0FFH CF=不变,不变,OF=0,ZF=0,SF=1注意是内存单元内容减注意是内存单元内容减1,而非地址减,而非地址减1 00 00 H H - 01 H - 01 H 11 11 FFH FFH 例例3 MOV AH, 80H NEG AH 00 00 H 0000 0000 BH 0000 0000 B - - 80 H 80 H - - 1000 00
37、00 B 1000 0000 B 1 1 1 1 80H 1000 0000B 80H 1000 0000B 执行后:执行后: (AL)=80H CF=1,OF=1,ZF=0,SF=1例例4 4 用指令完成两双字相减运算用指令完成两双字相减运算 0546 7A70H - - F001 A543HMOV AX,7A70H SUB AX,A543H MOV BX,0546H SBB BX,0F001HCMP oprd1, oprd2 ; (oprd1) - (oprd2) 据据ZF判断两数是否相等判断两数是否相等CMP A, BZF=1 两数相等两数相等, A = B;ZF=0 两数不等两数不等,
38、 A B 据据ZF和和CF判断两无符号数关系判断两无符号数关系CF= 1 A低于低于BCF= 0 A高于等于高于等于BCF=1或或 ZF=1 A低于等于低于等于BCF=0且且 ZF=0 A高于高于Bl 利用利用CMP执行后的标志值,比较两操作数之间的关系执行后的标志值,比较两操作数之间的关系l 比较指令比较指令CMP,进行两操作数相减操作,进行两操作数相减操作, 但只影响标志值但只影响标志值,不影响操作数不影响操作数(减的结果不保存减的结果不保存)条条件件转转移移指指令令判判断断条条件件 低低于于 JB next CF = 1 低低于于等等于于 JBE next CF = 1 或或 ZF =
39、1 高高于于 JA next CF = 0 且且 ZF = 0 高高于于等等于于 JAE next CF = 0 CMP AX, BX ;比较比较 JAE above ;高于等于则跳转高于等于则跳转 XCHG AX, BX ;低于则交换低于则交换 above: 、 例例 将将AX和和BX中较大的无符号数,存于中较大的无符号数,存于AX中中CMP A,B 用用ZF、SF 和和 OF判断两带符号数关系判断两带符号数关系l OF=0,不溢出情况,不溢出情况, SF=0, AB SF=1, A BOF=0, SF=0 ABOF=0, SF=1 A BOF=1, SF=0 A 负,知负,知A B 1 -
40、 0 负负 - 正正 = 正,结果正,结果SF = 0, OF=1 0 但,负但,负 正,知正,知A Bl OF=1,溢出情况,溢出情况,(由符号位可决定是否溢出由符号位可决定是否溢出)结合结合ZF,得到结论得到结论 : : SF OF00011011SFOF0111或或运运算算:有有1则则1,全全0则则0逻辑运算:逻辑运算:CMP A, B两两数数关关系系 SF OF = 0AB SF OF = 1A B (SF OF) ZF=1AB思考:思考:可否只用可否只用 ZF 和和 SF判断两符号数关系?判断两符号数关系?SFOF00011011SFOF0110异异或或运运算算: 异异则则1,同同则
41、则0条条件件转转移移指指令令判判断断条条件件 小小于于 JL next SF OF = 1 小小于于等等于于 JLE next (SF OF)ZF=1 大大于于 JG next (SF OF)ZF =0 大大于于等等于于 JGE next SF OF=0例例 将将AX和和BX中较大的带符号数,存于中较大的带符号数,存于AX中中 CMP AX, BX ;比较比较 JGE great ;大于等于则跳转大于等于则跳转 XCHG AX, BX ;小于则交换小于则交换 great: 、3. 乘法指令乘法指令指指令令格格式式执执行行操操作作MUL src 若若src为为字字节节类类型型: (AX) (AL
42、)(src) 若若src为为字字类类型型: (DX),(AX) (AX)(src) 将将被被乘乘数数、乘乘数数看看作作无无符符号号数数,进进行行乘乘运运算算 乘乘的的结结果果也也为为无无带带符符号号数数IMUL src 执执行行的的操操作作与与MUL相相似似 将将被被乘乘数数、乘乘数数看看作作带带符符号号数数, 进进行行乘乘运运算算 乘乘的的结结果果也也为为带带符符号号数数无符号数乘法无符号数乘法带符号数乘法带符号数乘法MUL srcIMUL srcl 单操作数指令单操作数指令l 源操作数源操作数( 乘数乘数 )类型决定操作类型类型决定操作类型l 目的操作数目的操作数( 被乘数被乘数) 隐含。
43、隐含。 字节乘字节乘AL 字乘字乘AXl 字节相乘的结果存放在字节相乘的结果存放在AX中中 字相乘的结果存放在字相乘的结果存放在DX、AX中中l MUL 用于无符号数运算用于无符号数运算 IMUL 用于带符号数运算用于带符号数运算l 影响影响CF和和OF,对其他条件码,对其他条件码无定义无定义(不确定)(不确定) 指令指令 MUL 字节相乘,字节相乘,AH=0,CF=OF=0,否则,否则 CF=OF=1 字相乘,字相乘, DX=0,CF=OF=0,否则,否则 CF=OF=1 对指令对指令IMUL 字节相乘,字节相乘,AH=0或或AH=FFH,CF=OF=0,否则,否则 CF=OF=1 字相乘,
44、字相乘,DX=0或或DX=FFFFH,CF=OF=0,否则,否则 CF=OF=1例例 (AL) = 0B4H,(BL) = 11H指令中源操作数为字节类型,故是字节操作指令中源操作数为字节类型,故是字节操作 MUL BL IMUL BL看作无符号数看作无符号数 (AL) = 180D (BL) = 17D 18017 = 3060D = 0BF4H执行执行MUL BL后:后: (AX) = 0BF4H看作带符号数看作带符号数(AL) = -76D(BL) =17D(-76)17 = -1292D = 0FAF4H执行执行IMUL BL后:后:(AX) = 0FAF4H例例 (AX)=0FFFF
45、H,(BX)=0FFFFH指令中源操作数为字类型,故是字操作指令中源操作数为字类型,故是字操作 MUL BX执行执行MUL BX后:后: (DX) = 0FFFEH (AX) = 0001H看作无符号数看作无符号数 (AX )= (BX) = 65535 6553565535 = 4294836225 = 0FFFE 0001H IMUL BX看作带符号数看作带符号数 (AX)= (BX)=- -1 (- -1)(- -1)= 1= 0000 0001H执行执行IMUL BX后:后: (DX) = 0000H(AX) = 0001H4. 除法指令除法指令(自学自学)指指令令格格式式执执行行操操
46、作作DIV src无无符符号号数数除除法法 (src)为为字字节节类类型型: (AL) (AX) / (src) 的的商商 (AH) (AX) / (src) 的的余余数数 (src)为为字字类类型型: (AX) DX) , (AX) / (src) 的的商商 (DX) (DX) , (AX) / (src) 的的余余数数将将被被除除数数、除除数数看看作作无无符符号号数数,进进行行除除法法运运算算,商商、余余数数也也为为无无符符号号数数IDIV src带带符符号号数数除除法法 执执行行的的操操作作与与DIV相相同同, 将将被被除除数数、除除数数看看作作带带符符号号数数,进进行行除除法法晕晕眩眩
47、 商商、余余数数也也为为带带符符号号数数,余余数数的的符符号号与与被被除除数数同同l 单操作数指令单操作数指令l 源操作数源操作数(除数除数)类型类型 决定指令操作类型决定指令操作类型l 目的操作数目的操作数(被除数被除数)隐含隐含 字节操作在字节操作在AX中;字操作在中;字操作在DX, AX中中l 除的结果,字节操作在除的结果,字节操作在AX中;字操作在中;字操作在DX, AX中中l 除法指令对所有条件码位均除法指令对所有条件码位均无定义无定义l 下列情况自动转入下列情况自动转入 0 中断处理:中断处理: (1) 除数为除数为0 (2) 字节操作,商的范围超出字节范围字节操作,商的范围超出字
48、节范围 字操作时,商的范围超出字范围字操作时,商的范围超出字范围除法指令举例除法指令举例例例 (AX)=0501H,(BL)=0C6H (1) DIV BL (2) IDIV BL 看作无符号数看作无符号数 看作带符号数看作带符号数 (AL) = 1281D (AL) = 1281D (BL) = 198D (BL) = -58D 1281/198商商= 6D 1281/ (-58)商商= -22D=0EAH 余数余数=93D=5DH 余数余数=5D 执行执行DIV BL后:后: 执行执行IDIV BL后:后: (AX) = 5D06H (AX) = 05EAH5. 符号扩展指令符号扩展指令(
49、自学自学)指指令令格格式式执执行行操操作作CBW 将将 (AL) 的的符符号号扩扩展展到到 AH 中中 (AL)的的 D7=0,(AH)=00H D7=1,(AH)=FFHCWD 将将 (AX) 的的符符号号扩扩展展到到 DX 中中 (AX)的的 D15=0,(DX)=0000H D15=1,(DX)=FFFFHl 无操作数格式无操作数格式l 操作数隐含操作数隐含字节操作,源在字节操作,源在AL,目的在,目的在AX字字 操操 作,源在作,源在AX,目的在,目的在DX,AXl 对条件码无影响对条件码无影响l 符号扩展指令应对带符号数操作符号扩展指令应对带符号数操作l 扩展后,表示的数值大小不变,
50、只是位数发生变化扩展后,表示的数值大小不变,只是位数发生变化 8位位 16位位 16位位 32位位l 应用场合:应用场合: 除法指令中,使被除数满足要求。除法指令中,使被除数满足要求。字节操作,被除数为字节操作,被除数为16位位字操作,被除数为字操作,被除数为32位位 加减运算中,使两操作数类型一致加减运算中,使两操作数类型一致如:字与字节相加、减时如:字与字节相加、减时 如:双字与字之间的相加、减时如:双字与字之间的相加、减时符号扩展指令举例符号扩展指令举例例例 CBW 执行前执行前 (AL)=01H,(AH)=0FFH 执行后执行后 (AL)=01H,(AH)=00H例例 CWD 执行前执