汇编语言第二章 Intel 80868088 CPU的寻址方式和指令系统_第1页
汇编语言第二章 Intel 80868088 CPU的寻址方式和指令系统_第2页
汇编语言第二章 Intel 80868088 CPU的寻址方式和指令系统_第3页
汇编语言第二章 Intel 80868088 CPU的寻址方式和指令系统_第4页
汇编语言第二章 Intel 80868088 CPU的寻址方式和指令系统_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

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

文档简介

1、第二章 Intel 8086/8088 CPU的寻址方式和指令系统机器语言(machine language) 微处理器的最基本语言。CPU执行的程序都是用机器语言写成的。机器代码是二进制代码,一条机器语言指令长度,可以是1个字节或多个字节。微处理器只能理解机器语言,但直接用机器语言写程序几乎是不可能的。因此程序常采用其它语言来编写,例如:汇编语言或高级语言。汇编程序(Assembler)编译程序(Compiler)连接程序(Link)保护模式实模式指令 (instruction)指令系统程序(program) 源代码 (source code) 目标代码 (object code)操作码 (

2、opcode)操作数(operand) 目标操作数(destination operand) 源操作数 (source operand)汇编语言语句的一般格式是: 标号:指令 ;注释例:START:MOV AX,BX ;COPY BX INTO AX START是该指令的地址标识,叫做标号(Label)。 在指令后面由分号(;)标识的是注释。0013 8A 24 NEXT:MOV AH, SI ;MOVE A BYTE其中8A 24是指令MOV AH,SI的机器码,这是一条双字节指令,该指令的存储器地址是0013H和0014H。指令格式 操作码字段 操作数地址字段地址结构 二地址 单地址 隐含

3、地址基本指令长度 1-6字节。寻址方式 形式地址 有效地址 EA 物理地址 PA逻辑地址到物理地址的生成加法器 逻辑 地址191500 偏移地址 段 地 址 0 0 0 0 20 - bit 物理存储器地址 150利用汇编语言编写程序具有以下优点: (1)用汇编语言编写的程序,程序的代码短,程序占 用的内存少,程序运行速度要比用高级语言写的程序快; (2)汇编语言给予程序设计者更强的能力,实现高技术任务,而这些任务若用高级语言是难以实现或根本不能实现; (3)汇编语言的知识,有助于理解微处理器的结构,这是高级语言所没有的; (4)驻留程序和中断服务程序总是用汇编语言开发8086/8088 CP

4、U内部的寄存器组8位数据寄存器(AH、AL、BH、BL、CH、CL、DH、DL)16位数据寄存器(AX、BX、CX、DX)指针寄存器(BP、SP)变址寄存器(SI、DI)标志寄存器(CF、AF、PF、ZF、OF、SF、IF、DF、TF)指令指针(IP)段寄存器(CS、DS、SS、ES)8086/8088有两个独立的存储空间和I/O地址空间,地址空间为1MB,I/O地址空间为64KB。数据按字节、字或双字存放,存放方式可按对正的双字边界或非对正的双字为边界。逻辑地址(logical address)物理地址(physical address)。物理地址=段地址*16+偏移地址地址00001H00

5、008H00007H00006H00005H00004H00003H00002HByte 8Byte 7Byte 6Byte 5Byte 4Byte 3Byte 2Byte 1Word 6Word 4Word 2Word 0Byte 000000HWord 5Word 1物理存储器 双字对齐字对齐 Double word 0Double word 4图3.2 对正的数据字和双字Byte 8图(a)中数据5AF0H存放在对正的双字地址02000H,其中0F0H存放在低字节地址02000H,5AH存放在高字节地址02001H。图(b)中数据2C96H,对正的双字地址边界是0200CH。 地址 存储

6、器(二进制) 存储器(十六进制) 地址020011602000160101 10101111 0000 存储器(二进制)0010 11001001 0110 0200E160200D16 5A F0 (b) (a) 物理存储器 图3.4非对正的字或双字为边界的例子地址00001H00008H00007H00006H00005H00004H00003H00002HByte8Byte7Byte6Byte5Byte4Byte3Byte2Byte1Word 7Word 3Byte000000H字未对齐Double word 1Double word 2Double word 5 Double word

7、 3双字未对齐 (a)非对正的双字边界的双字存储(b)对正的双字存储 A01100 1101 AB 地址存储器(二进制)存储器(十六进制) 地址021051602104160000 00010010 0011存储器(十六进制)000210F160210E16 01 23 (b) (a)02103160210216021011602100161010 1011 CD 55 FF0210D160210C160210B160210A16 (a)其中0123H存放在02104H处,此地址是对正的双字边界地址,而ABCD存放的起始地址是02102H,而该字的对正的双字边界应为02100H。完整的双字是0

8、123ABCDH。 逻辑地址与物理地址之间的关系:段基址为002B0H, 偏移地址为0013H, 物理地址为002C3H。 段基址为002C0H,偏移地址为0003H, 物理地址为002C3H。 逻辑地址 2C4H2C3H2C2H2C1H2C0H2BFH2BEH2BDH2BCH2BBH2BAH2B9H2B8H2B7H2B6H2B5H2B4H2B3H2B2H2B1H2B0H段基址 偏移(3H) 偏移(13H)段基址物理地址图表示堆栈结构堆栈是一个特殊的随机存储区,用于临时存放一些信息如数据或地址。对于实模式,堆栈区为64KB,按32K个字组织 . . . 堆栈段 . 存储器 (字宽) 0000H

9、SPSS FFFEH堆栈底部 堆栈顶部图PUSH AX指令执行前的堆栈状态堆栈 00 11 22 33 44 55 66 77 88 99AA BB 01 23 45 67 89 AB CD EF 01 05 00 08 1062 1060105E 105C 105A 1058 1056 1054 10521050SSSPTOS 堆栈底部 PUSH AX指令执行后、 POP AX和POP BX执行后 堆栈状况 12 34 00 11 22 33 44 55 66 77 88 99 AA BB 34 12 45 67 89 AB CD EF 0 1 05 00 06 1062 1060105E

10、105C 105A 1058 1056 1054 10521050SSSPPUSH AXAXTOS 00 11 22 33 44 55 66 77 88 99 AA BB 34 12 45 67 89 AB CD EF 01 05 00 08 1062 1060105E 105C 105A 1058 1056 1054 10521050 12 34SSSPPOP AXTOP一、寻址方式1隐含寻址方式2 立即寻址方式 操作数直接存放在指令中,紧跟在操作码后,它作为指令的一部分存放在代码中。操作数叫做立即数。立即数可以是8位、16位。例:MOV AL,15H机器码如下:地址 存储器内容 指令010

11、00H B0 15 MOV AL,15H01002H XX 下一条指令3寄存器寻址方式 指令的操作数存放在处理器的寄存器中,指令指明寄存器号,这些内部寄存器包括段寄存器和通用寄存器,寄存器可以分 8位、16位。例:MOV AX,BXBX为源操作数,AX是目的操作数,该指令是将BX中的内容传送至AX,即传送后,BX的内容保持不变。 地址 储器内容 指令 01000 8B C3 MOV AX,BX 01002 XX 下一条指令 4存储器寻址 操作数存放在存储器中。CPU 首先计算这个操作数的物理地址PA(physical address),然后读或写这个操作数。PA= SBA:EASBA (seg

12、ment base address)一个物理存储器段的起始地址。EA (effective address)为操作数相对该存储器段开始的偏移量。其有效地址计算的公式如下:EA=base+index +displacement Base为基址寄存器, Index为变址寄存器, Displacement为位移量 基地址寄存器有:BX、BP。 变址寄存器为:SI、DI。 位移量为16位或8位。(1)、直接寻址方式 指令中地址码中给出的是有效地址,即形式地址就是有效地址。PA=段基址+直接地址 段基址指:CS、 DS、 SS、 ES例: MOV CX,DS:BETA地址 存储器内容 指令 01000

13、8B0E3412 MOV CX,DS:BETA 01004 XX设(03234)=0EDH,(03235)=0BEH, (DS)=0200H,BETA=1234H,指令执行后,将操作数0BEEDH传至CX。(2)、寄存器间接寻址方式操作数的有效地址存放在通用寄存器BX、BP、SI、DI中。隐含段前缀:DS:BX、DS:SI、DS:DI、SS:BP超越段前缀:可以利用其它的段寄存器作为段基址,需要使用段超越,即将段寄存器用显式方式“段寄存器”:放在间接寻址寄存器的左方括号前,如:MOV AL,ES:SI例:MOV AX,SI ;其隐含的段寄存器为DS, 设DS=0200H,SI=1234H,所读

14、取的操作数物理地址为03234H,读取的操作数为0BEEDH,传送至寄存器AX中。地址 存储器内容 指令 01000 8B 04 MOV AX,SI 01002 XX 下一条指令 . . 03234 ED 源操作数 03235 BE(3)、基址(变址)寻址方式方式操作数的有效地址是由基址寄存器中的内容加上偏移量。偏移量是8位或16位的。只有BX、BP可用作基址寄存器。只有SI、DI可用作变址寄存器例: MOV BX+BETA,AL 其中BETA为立即数,操作数的有效地址是 EA=BX+BETA该指令也可以写成如下形式: MOV BETABX,AL 或 MOV BX+BETA,AL若DS=020

15、0H,BX=1000H,BETA=1234H,AL=0EDH,则指令执行后,指令的机器码及操作数按下述方式在存储器中存储:地址 存储器内容 指令 01000 88873412 MOV BX+BETA,AL 01004 XX 下一条指令 . . 04234 ED 04235 XX基址寻址常用于对一维数组的访问,用基地址指向一维数组的第一个元素的地址指针,用偏移量指向数组中要访问的元素。如图:Element 0Element 2 . . . 数据 结构 . . .Element n 偏移量基址寄存器+存储器Element n-1Element 1 一个数组元素的变址寻址Element n-1Ele

16、ment n . . . 数组 . . .变址寄存器 偏移地址+存储器Element 0Element 1Element 2(4)、基址变址寻址方式 有效地址是基址寄存器与变址寄存器中数据之和。这种寻址模式可以被用于访问复杂的数据结构如二维数组。基址变址寻址的物理地址如下式所示: PA=段基址:基址+变址(5)、相对基址变址寻址方式 有效地址是基址寄存器与变址寄存器中数据之和加上一个偏移量。偏移量是8位或16位的。这种寻址模式可以被用于访问复杂的数据结构如二维数组。相对基址变址寻址的物理地址如下式所示: PA=段基址:基址+变址+偏移量例 MOV AX,BX+SI+BETA 其操作数的有效地址

17、:EA=(BX)+(SI)+BETA 物理地址:PA=DS:(BX)+(SI)+BETA若DS=0200,(BX)=0100H,(SI)=0050H,BETA=1234H 则PA=02000H+0100H+0050H+1234H=03384H二、指令系统 1、数据传送指令2、算术指令3、逻辑指令4、串处理指令5、控制转移指令6、处理机控制指令1、数据传送指令:实现内部寄存器之间、内部寄存器与存储器之间的数据传送。 通用 数据传送指令 MOV PUSH POP XCHG累加器专用传送指令 IN OUT XLAT 地址传送指令 LEA LDS LES 标志传送指令 LAHF SAHF PUSHF

18、POPF 2、 算术运算指令 加法指令:ADD ADC INC 减法指令:SUB SBB DEC NEG CMP 乘法指令:MUL IMUL 除法指令:DIV IDIV CBW CWD 十进制调整指令: 压缩的BCD码: DAA DAS 非压缩的BCD码: AAA AAS AAM AAD3、逻辑运算和移位指令逻辑运算指令 AND OR NOT XOR TEST移位指令 SAL/SHL SAR SHR旋转指令 ROL ROR RCL RCR4、串处理指令指令 MOVS CMPS SCAS LODS前缀 REP REPE/REPZ REPNE/REPNZ 5、控制转移指令无条件转移 JMP条件转移

19、JZ/JE JNZ/JNE JS JNS JO JNO JP/JPE JNP/JPO JB/JNAE/JC JNB/JAE/JNC JE/JZ JNE/JNZ JA/JNBE JAE/JNB/JNC JB/JNAE/JC JBE/JNAJE/JZ JNE/JNZ JG/JNLE JGE/JNL JL/JNGE JLE/JNGJCXZ循环转移 LOOP LOOPZ/LOOPE LOOPNZ/LOOPNE子程序调用 CALL RET中断调用 INT INTO IRET6、处理机控制指令标志处理指令CF标志 CLC STC CMCDF标志 CLD STD IF标志 CLI STI其他处理指令 NOP

20、 HLT WAIT ESC LOCK MOV指令 基本格式 MOV DST,SRC ;(D) (S) D表示目的操作数,S表示源操作数。D和S可以是寄存器或存储器,S还可以是立即数。传送的数可以是字节、字或双字。存储器和通用寄存器传送数据,类型(字节、字、双字)由通用寄存器确定。在所有段寄存器中,只有的代码段CS不能充当目的操作数 。PUSHPOP 基本格式 PUSH SRC POP DST SRC、DST必须为字数据,为REG、SEGREG、MEM。一般情况下成对使用。不能是立即方式。DST不能是CS。PUSHF 功能:分别将16位标志寄存器的内容压入堆栈,以后用。POPF指令 功能:从栈顶

21、弹出一个字送至标志寄存器。 XCHG指令 指令格式:XCHG OPR1,OPR2 功能:将源操作数和目的操作数的内容相互交换。 注意:源操作数和目的操作数可以是通用寄存器或存储器,但D和S不得同时是存储器操作数。 LEA指令 指令格式:LEA reg16,EA 其中EA为存储器操作数,reg16为通用寄存器。 功能:取源操作数的有效地址送至目的操作数通用寄存器中。LDS指令 指令格式:LDS reg,EA ;(Reg16)(EA) (DS)(EA+2) 功能:从存储器中取出操作数的地址指针,首先从存储器取出第一个字或双字送至目的操作数,然后再从EA+2取出后一个字送至段寄存器DS中。LES指令

22、 指令格式:LES reg,EA ;(Reg16)(EA) (ES)(EA+2) 功能:从存储器中取出操作数的地址指针,首先从存储器取出第一个字或双字送至目的操作数,然后再从EA+2取出后一个字送至段寄存器ES中。3.4.2 算术运算指令ADD指令格式 ADD D,S ;(D)(D)+(S)功能:将目的操作数与源操作数相加,其结果存放在目的操作数中,且源操作数保持不变目的操作数可以是通用寄存器或存储器,源操作数可以是通用寄存器、存储器或立即 数。注意目的操作数和源操作数不能同时是存储 器操作数。段寄存器不能直接参加算术运算。加法指令的操作对象可以是16位或8位。 3.4.2 算术运算指令例如:

23、ADD AL,10ADD AX,BXADD DX,BETASIADD MEMDI,SIADD DELTABX,1250H ;DELTA为 字变量 ADD BYTE PTR SI,25H ;指定存储 器为字节类型3.4.2 算术运算指令ADC指令格式ADC D,S ;(D)(D)+(S)+(CF)功能:将目的的操作数与源操作数相加,同时还要加一个进位CF。用法:该指令常用于多精度加法的计算。 3.4.2 算术运算指令例3.1设在数据段定义了两个多精度的16进制数:FIRST和SECOND ,求两数之和,并将结果存放在THIRD为首地址的存储器中。数据段定义和程序段如下:FIRST DW 758D

24、H,9A5CHSECOND DW 0A524H,8345H THIRD DW 3 DUP(0) 3.4.2 算术运算指令LEA SI,FIRST ;取加数的有效地址LEA DI,SECOND ;取被加数的有效地址LEA BX,THIRD ;取存放和的有效地址MOV AX,SI ;取加数的第一个字ADD AX,DI ;与被加数的第一个字相加MOV BX,AX ;存第一次运算的部分和PUSHF ;保护标志位3.4.2 算术运算指令ADD SI,2 ;加数地址加2,指向下一个加数的地址ADD DI,2 ;被加数地址加2,指向下一个被加数的地址ADD BX,2 ;和地址加2,指向下一个部分和的地址PO

25、PF ;恢复标志位MOV AX,SI ;从加数中取出第二个字ADC AX,DI ;与被加数中的第二个字进行带进位相加MOV BX,AX ;存第二次部分和ADC WORD PTR BX+2,0 ;将进位存入和的第三个字中3.4.2 算术运算指令INC指令格式INC D ;(D)(D)+1功能:是对指定的操作数加1。用法:常用于操作数变址,由于对CF无影响,所以无需像上述程序段那样保护状态标志位。特点:这是一条单操作数指令,操作数可以用通用寄存器,也可以用存储器。3.4.2 算术运算指令例如:INC CL ;8位寄存器加1INC SI ;16位寄存器加1INC BX ;16位寄存器加1INC ME

26、M-BYTE DI ;字节存储器加1INC MEM-WORD SI ;字存储器加13.4.2 算术运算指令AAA指令格式AAA功能:未组合的BCD加法调整指令,亦可以作为 ASCII码加法调整指令。用法:必须将其和放在累加器AL中,AAA指令要紧 跟在加法指令之后使用。AAA指令调整功能如下述逻辑表达式所示:IF(AL&0FH)9 OR AF=1 THENALAL+6,AHAH+1,AF1,CF1,ALAL&0FH 3.4.2 算术运算指令例如计算两个十进制数和8+6=?,程序段如下:MOV AX,0008HMOV BL,06HADD AL,BLAAA ;调整后(AX)=0104H,(CF)=

27、13.4.2 算术运算指令假设上述两个十进制数用ASCII码表示,则变成38H+36H=?,其程序段如下:MOV AX,0038HMOV BL,36HADD AL,BL ;(AL)=6EHAAA ;(AX)=0104H3.4.2 算术运算指令DAA指令格式DAA功能:为组合的BCD码加法调整指令,对在AL中的两个组合的十进制数相加的结果进行调整,获得正确的十进制数结果仍在AL中。DAA的调整功能如下列逻辑表达式所示:IF (AL&0FH)9 OR AF=1 THEN ALAL+6,AF1IF (AL&0F0H)90H OR CF=1 THEN ALAL+60H,CF13.4.2 算术运算指令例

28、如:对两个十进制数求和,78+56=?,可用如下指令实现:MOV AL,78H ;(AL)=78HADD AL,56H ;(AL)=CEHDAA ;(AL)=34H,(CF)=13.4.2 算术运算指令例如SUB AL,47HSUB AX,VARBX+SI SUB ALPHADI,DX3.4.2 算术运算指令2减法指令:SUB,SBB,DEC,NEG,CMP,AAS和DASSUB指令格式SUB D,S ;(D)(D)-(S)功能:执行减法运算,将目的的操作数减去源操作数,其结果存于目的操作数中。指令将对CF、AF、SF、ZF、PF、OF状态标志位有影响,使用的操作数组合与ADD指令相同。 3.

29、4.2 算术运算指令 SBB指令格式SBB D,S;(D)(D)-(S)-(CF)功能:带借位的减法指令,将目的操作数减去源操作数,然后再减去借位标志CF,其结果存放在目的操作数中。用法:SBB指令常用于多精度的减法运算中。 3.4.2 算术运算指令例3.2求876A935247H-5A6C486D2BH=?设数据在数据段中定义如下:DATA SEGMENT ;定义数据段minuend DB 47H,52H,93H,6AH,87Hsubtrahend DB 2BH,6DH,48H,6CH,5AHCOUNT EQU $- subtrahendMinus DB COUNT DUP(O)DATA E

30、NDS ;数据段结束3.4.2 算术运算指令CODE SEGMENT ;定义代码段ASSUME CS:CODE,DS:DATA,ES:DATASUBTRACT PROC FARSTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,minuendLEA DI,subtrahendLEA BX,minus3.4.2 算术运算指令MOV CX,COUNTCLCAGAIN: MOV AL,SISBB AL,DIMOV BX,ALINC SIINC DIINC BXDEX CX ;CX(CX)-1JNZ AGNIN ;(CX)0转移3.4.2 算术运算指令 MOV AH,

31、4CH ;结束程序执行 INT 21HSUBTRACT ENDPCODE ENDS ;代码段结束 END START3.4.2 算术运算指令DEC D ;(D)(D)1功能:将目的操作数减1。标志位:除CF标志位不受影响外,其余状态标志均受影响。目的操作数:可以放在通用寄存器和存储器中。例如:DEC CXDEC MEM-BYTEDI3.4.2 算术运算指令NEG指令格式NEG D ;(D)0(D)功能:对目的操作数求补,即用零减去目的操作数, 并将结果送回目的操作数。操作数:可以是通用寄存器或存储器。标志位:影响SF、ZF、AF、PF、OF,在一般情况下, 总使CF=1,除非操作数为零时,才使

32、CF=0; OF标志一般情况下为0,但当操作为80H或 8000H,NEG指令对其求补,结果与原操作数 相同,此时OF=1。3.4.2 算术运算指令如:NEG BXNEG SUM3.4.2 算术运算指令CMP指令格式CMP D,S ;(D)-(S)功能:用目的操作数减去源操作数,但其结果 不送回目的操作数,其余操作与减法指令 SUB相同。用法:此指令常用于比较两个数的大小,当比 较指令与条件转移指令结合使用时,可以完成 各种条件判断和相应的程序转移。3.4.2 算术运算指令例3.3在10个无符号数中求最大值,最大值存放在MAX变量中,程序如下DATA SEGMENTBLOCK DB 1AH,5

33、CH,62H,97H,0A5H,73H,05H,3AH,4CH,1BHMAX DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA3.4.2 算术运算指令MAX-UN PROC FAR MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BLOCK MOV CX,9 MOV AL,SI3.4.2 算术运算指令AGAIN: CMP AL,SI+1 JNC NEXT MOV AL,SI+1NEXT: INC SI DEC CX JNZ AGAIN3.4.2 算术运算指令 MOV MAX,AL MOV AX,4C00

34、H INT 21HMAX-UN ENDPCODE ENDS END MAX-UN3.4.2 算术运算指令AAS指令格式AAS功能:是未组合BCD码减法调整指令,可对AL中的两个未组合的十进制数相减的结果进行调整,使差成为正确的十进制数。调整过程逻辑表达式如下所示:IF(AL&0FH)9 OR AF=1,THEN ALAL6,AHAH1,AF1,CFAF, ALAL&0FH3.4.2 算术运算指令例如:求257=?其结果用十进制数未组合的BCD码表示。可用下列指令完成这个十进制数减法MOV AX,0205H ;(AH)=02H, (AL)=05HSUB AL,07H :(AL)=FEH, (AF

35、)=1AAS ;(AH)=01H,(AL)=08H, (CF)=13.4.2 算术运算指令例3.4求7446=?该数用ASCII码表示,则为3734H3436H,ASCII码减法程序段如下:ASCVAL1 DB 37H,34HASCVAL2 DB 34H,36HASCVAL3 DB ?,?3.4.2 算术运算指令LEA SI,ASCVAL1+1LEA DI,ASCVAL2+1LEA BX,ASCVAL3+1MOV CX,2CLCAGAIN: MOV AL,SI3.4.2 算术运算指令SBB AL,DIAASMOV BX,ALDEC SIDEC DIDEC BXDEC CXJNZ AGAIN3.

36、4.2 算术运算指令DAS指令格式DAS功能:用于组合BCD码减法调整,将AL中的两个组合的BCD码之差,调整为正确的组合十进制数。调整操作逻辑表达式如下所示:IF (AL&0FH)9 OR AF=1 THENALAL6,AF1IF(AL&0F0H)90H OR CF=1 THENALAL60H,CF13.4.2 算术运算指令如上例74-46=? 可用如下指令运算:MOV AL,74H ;(AL)=74HSUB AL,46H ;(AL)=2EHDAS ;(AL)=28H, ( CF)=13.4.2 算术运算指令3乘法指令:MUL,IMUL,AAM无符号数乘法MUL指令格式MUL 通用寄存器/存

37、储器 或记为MUL Reg/mem功能:为无符号数乘法指令,可以实现字节字 节、字字和双字双字的乘法运算。标志位:只影响CF和OF标志位,其余标志不确 定。 3.4.2 算术运算指令特点:由于被乘数是隐含操作数,故在使用该 指令前应将被乘数存入累加器AL、AX或 EAX;乘数由操作数reg/mem确定,乘 法的类型由操作数的类型决定,例如操 作数类型为字节时,则为字节相乘,即 (AL)(reg8/mem8),其结果存放在 AX中。3.4.2 算术运算指令若操作数类型为字时,则为两个字数据相乘,其结果放在DX和AX中,表示为:(AX)(reg16/mem16)DX:AX如果操作数为双字,则乘法按

38、如下方式进行:(EAX)(reg32/mem32)EDX:EAX3.4.2 算术运算指令例如:MUL CL ;(AL)(CL)AXMUL BX ;(AX)(BX)DX:AXMUL EBX ;(EAX)(EBX)EDX: EAX3.4.2 算术运算指令下面例子中乘数为存储器:MUL BYTE1 ;(AL)(BYTE1) AXMUL WORD1 ;(AX)(WORD1) DX:AXMUL DWORD1 ;(EAX) ( DWORD1)EDX:EAX3.4.2 算术运算指令有符号数乘法指令IMULIMUL乘法指令格式:IMUL reg/mem ;同MUL指令IMUL reg,reg/mem/imm

39、;双操作数IMUL reg,reg/mem,imm ;三操作数3.4.2 算术运算指令对于双操作数指令,操作数可以有如下组合方式:IMUL reg,reg/mem/imm;imm为立即数 Reg16,reg16 Reg16,mem16 Reg32,reg32 Reg32,mem32 Reg16,imm Reg32,imm3.4.2 算术运算指令三个操作数按如下方式组合:IMUL reg,reg/mem,imm reg16,reg16,imm reg16,mem16,imm reg32,reg32,imm reg32,mem32,imm3.4.2 算术运算指令例如:IMUL DX,25 ;(DX

40、)25(DX)IMUL BX,CX ;(BX)(CX)(BX)IMUL ECX,MULTCAND,25 ; (MULTCAND25)ECX3.4.2 算术运算指令例3.5无符号数和有符号数乘法编程示例TITLE MULT MUL and IMUL operationsDATA SEGMENTBYTE1 DB 80HBYTE2 DB 40HWORD1 DW 800HWORD2 DW 2000HDWORD1 DD 80000000H3.4.2 算术运算指令DWORD2 DD 20000000HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATAMU

41、L-MAIN PROC NEAR MOV AX,DATA MOV DS,AX MOV ES,AX3.4.2 算术运算指令.386;Example of MUL:MOV AL,BYTE1 ;ByteByteMUL BYTE2 ;Product in AXMOV AX,WORD1 ;WORDWORDMUL WORD2 ;Product in DX:AX MOV AL,BYTE1 ;BytewokSUB AH,AH ;extend multiplicand in AH3.4.2 算术运算指令MUL WORD1 ;Product in DX:AXMOV EAX,DWORD1 ;Double WORD

42、Double WORDMUL DWORD2 ;Product in EDX:EAX;Example of IMUL:MOV AL,BYTE1 ;ByteByteIMUL BYTE2 ;Product in AX3.4.2 算术运算指令MOV AX,WORD1 ;wordwordIMUL WORD2 ;Product in DX:AXMOV AL,BYTE1 ;BytewordCBW ;extend multi plicand in AHIMUL WORD1 ;Product in DX:AXMOV EAX,DWORD1 ;Double word Double wordIMUL DWORD2;P

43、roduct in EDX:EAX3.4.2 算术运算指令 MOV AX,4COOH INT 21HMUL-MAIN ENDPCODE ENDS END MUL-MAIN3.4.2 算术运算指令AAM指令格式AAM未组合的BCD码乘法调整指令AAM功能:它将AX中未组合BCD码的乘积调整为正确的未组合的BCD码,高位在AH中,低位在AL中。AAM具体操作如下:AHAL/0AH ;除10取整商AHALAL%0AH ;除10取余AL3.4.2 算术运算指令例3.6计算847569=?DATA SEGMENTMULTCAN DB 84756COUNT EQU &-MULTCANMULTPLR DB

44、9ASCPROD DB COUNT+1 DUP(0),$DATA ENDSCODE SEGMENT3.4.2 算术运算指令ASSUME CS:CODE,DS:DATA ,ES:DATAASCMUL PROC NEAR MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,COUNT LEA SI,MULTCAN+COUNT13.4.2 算术运算指令 LEA DI,ASCPROD+COUNT AND MULTRLR,0FHAGAIN: MOV AL,SI AND AL,0FH MUL MULTPLR AAM ADD AL,DI AAA3.4.2 算术运算指令 MOV DI

45、,AL MOV DI1,AH DEC DI DEC SI LOOP AGAIN LEA SI,ASCPROD+COUNT MOV CX,COUNT+1NEXT: OR BYTE PTR SI,30H3.4.2 算术运算指令 DEC SI LOOP NEXT MOV AX,4C00H INT 21HASCMUL ENDPCODE ENDS END ASCMUL3.4.2 算术运算指令4除法指令:DIV,IDIV,AAD,CBW,CWD,CWDE,CDQ(1)无符号数除法DIVDIV reg/mem除数:在DIV指令中的操作数为除数。被除数:隐含在AX、DX:AX或EDX:EAX。注意:实际使用时

46、主要依据除数操作数的类型来选择,例如操作数为字节类型,则自动选用AX作被除数。 3.4.2 算术运算指令例如:DIV CL ;AX/CLAL,余数AHDIV CX ;DX:AX/CXAX,余数DXDIVDWORD1;EDX:EAX/DWORD1EAX, 余数EDX3.4.2 算术运算指令(2)有符号数除法IDIV IDIV reg/memIDIV操作同DIV一致,不再一一说明。 3.4.2 算术运算指令与有符号数除法有关指令:CBW指令指令功能:将AL寄存器中的最高符号位扩展到AH,即将8位有符号数扩展成16位有符号数,以便实现有符号数字节除以字节操作数。例如: AL=87H, 执行CBW后,

47、 AX=FF87H。3.4.2 算术运算指令CWD指令指令功能:将AX寄存器中的最高符号位扩展到DX中,即将16位有符号数扩展成32位有符号数,以便实现有符号数字除以字操作数。例如:AX=97ABH,执行CWD后,DX=FFFFH,AX=97ABH。3.4.2 算术运算指令例3.7有符号数和无符号数除法程序设计DATA SEGMENTBYTE1 DB 80HBYTE2 DB 16HWORD1 DW 2000HWORD2 DW 012OHWORD3 DW 1000HDATA ENDS3.4.2 算术运算指令CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATADI

48、VX PROC NEAR MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,WORD1 ;wordbyte DIV BYTE1 ;rmdr:quot in AH:AL3.4.2 算术运算指令MOV AL,BYTE1 ;ByteByteSUB AH,AH ;extend dividend in AHDIV BYTE2 ;rmdr:quot in AH:ALMOV AX,WORD3 ;Double word wordMOV DX, WORD2 ;dividend in DX:AXDIV WORD1 ;rmdr:quot in DX:AXMOV AX,WORD1 ;wor

49、dwordSUB DX,DX ;extend dividend in DX3.4.2 算术运算指令DIV WORD3 ;rmdr:quot in DX:AXMOV AX,WORD1 ;wordwordIDIV BYTE1 ;rmdr:quot in AH:ALMOV AL,BYTE1 ;ByteByteCBW ;extend dividend in AHIDIV BYTE2 ;rmdr:quot in AH:ALMOV DX,WORD2 ;Double word/wordMOV AX,WORD3 ;dividend in DX:AX3.4.2 算术运算指令 IDIV WORD1 ;rmdr:q

50、uot in DX:AX MOV AX,WORD1 ;word/word CWD ;extend dividend in DX IDIV WORD3 ;rmdr:quot in DX:AX MOV AX,4C00H INT 21HDIVX ENDPCODE ENDS END DIVX3.4.2 算术运算指令(3)AAD指令格式AAD ;隐含操作数AH,AL指令功能:将AX中的两个未组合的BCD码转换成一个字节的二进制数,存于AL中。其操作为:AL(AX)10+(AL)AH03.4.2 算术运算指令例如:设AX=3238H,CL=37H:AND CL,0FH ;AX=3238H,CL=07AND

51、 AX,0F0FH ;AX=0208H,CL=07AAD ;AX=001CH,CL=07DIV CL ;AX=0004H343逻辑运算和移位指令1逻辑运算指令逻辑“与”指令AND指令格式:AND D ,S;(D)(D)(S)功能:将源操作数与目的操作数“与”,结果存 于目的操作数。用法:常用于位屏蔽和位检验操作。位屏蔽:是将目的操作数中指定的位设置为0。 343逻辑运算和移位指令例如:AND AL,0FH;AL高4位为0,低4位保持不变。AND AL,80H ;检验AL的符号位AND AX,BX ;寄存器与寄存器相“与”AND AX,GAMMABX;寄存器与存储器“与”AND BETABXSI

52、,00111111B ;存储器与 立即 数相“与”343逻辑运算和移位指令测试指令TEST指令格式:TEST D ,S ;(D)(S)功能:将目的操作数与源操作数进行逻辑 “与”,但运算结果不写回目的操作数, 只是影响状态标志位,目的操作数在 运算后保持不变。 343逻辑运算和移位指令例如:TEST AX,8000H;检验AX是正数还是负数TEST BX,1 ;检验BX是偶数还是奇数TEST GAMMABX,IMM-NUM343逻辑运算和移位指令逻辑“或”指令OR指令格式:OR D ,S ;(D)(D)(S)功能:将目的操作数和源操作数按位进行逻辑 “或”运算,并将其结果送回目的操作数。用法:

53、常用于判断一个数是否为零,或用于 将BCD码转换成ASCII,以及判断一个 数的正负。 343逻辑运算和移位指令如:OR AL,AHOR AL,30HOR AX,3030HOR BETABX+SI,DX343逻辑运算和移位指令逻辑“异或”指令XORXOR指令格式:XOR D ,S ;(D)(D)(S)功能:将目的操作数和源操作数按位进行逻辑 “异或”,即“相同为零,相异为1”,凡与1 相“异或”的位将“求反”,凡与“0”相“异或” 的位保持不变。用法:根据该指令特点可很容易地将寄存器清 零,并同时也将进位标志位CF清零, 343逻辑运算和移位指令如:XOR AH,AHXOR AX,AXXOR

54、EAX,EAX343逻辑运算和移位指令例3.8将一串大写字符转换成小写字符DATA SEGMENTCONAME DBCOMPUTER SYSTEMSCOUNT EQU $-CONAMEDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA343逻辑运算和移位指令CASE PROC FAR MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,CONAME MOV CX,COUNTAGAIN:MOV AL,SI CMP AH,41H ;IS it upper case letter? JB NEXT343逻辑运算和移位指令

55、 CMP AL,5AH ; JA NEXT ;IS it upper case letter? XOR AL,00100000B ;Yes,convert MOV SI,AL ;Restore in CONAMENEXT:INC SI ;指向下一个字符 LOOP AGAIN ;循环 MOV AX,4C00H INT 21HCASE ENDPCODE ENDS END CASE343逻辑运算和移位指令逻辑“非”指令NOT指令格式:NOT D ;(D)(D)功能:对目的操作数求反,并将结果送回目的操作数。操作数可以是通用寄存器或存储器,此指令对状态标志位无影响。 343逻辑运算和移位指令例3.9将

56、内存BLOCK中的三个字操作数求补。TITLE NOTOPDATA SEGMENTBLOCK DW 350AH,675BH,0A418HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA, ES:DATA343逻辑运算和移位指令NOTOP PROC NEAR MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,BLOCK MOV CX,3 STCL1: MOV AX,SI343逻辑运算和移位指令 NOT AX ADC AX,0 MOV SI,AX INC SI INC SI LOOP L1 MOV AX,4C00H INT 21H343逻辑运算和移位指令2移位指令SAL/SHL,SHR,SAR,SHLD,SHRD(1)左移指令SAL/SHLSAL/SHL D,COUNT功能:SAL为算术左移指令,SHL为逻辑左移指令, 两者功能相同,都是将目的操作数左移 COUNT位,移位后右端空出的位均用零填 充,从最高位MSB端最后移出的位送至CF。 343逻辑运算和移位指令左移指令操作示意图如图3.15(a) 指令执行 前AX的值指令执行 后AX的值0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0CFBit15Bit0Bit

温馨提示

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

评论

0/150

提交评论