1、六章汇编语言及其程序设计六章汇编语言及其程序设计主要内容n汇编程序及其开发过程n指令格式及寻址方式n8086汇编语言的基本语法n顺序、分支、循环结构程序设计n子程序设计n流程图的画法起止框执行框流程线条件满足?条件满足?YYNN判断框AA连接点指令格式及寻址方式n指令格式操 作 码操 作 数OP CODEDW0127形式1OP CODEDW0127形式2OP CODEDW0127形式3DATA/DISPDATA/DISP12个字节12个字节MODREGR/MDATA/DISPDATA/DISP12个字节12个字节方向位,0:REG字段指出的寄存器为源操作数寄存器 1:REG字段指出的寄存器为目
2、的操作数寄存器字位,0:参加运算的操作数为字节操作数 1:参加运算的操作数为字操作数MOD含 义MOD含 义00存储器方式,无位移量01存储器方式,有8位位移量10存储器方式,有16位位移量11寄存器方式,无位移量MOD字段编码表REGW=1W=0REGW=1W=0000AXAL100SPAH001CXCL101BPCH010DXDL110SIDH011BXBL111DIBHREG字段编码表存储器方式寄存器方式有效地址的计算公式W=0W=100011011000(BX)+(SI)(BX)+(SI)+D8(BX)+(SI)+D16ALAX001(BX)+(DI)(BX)+(DI)+D8(BX)+
3、(DI)+D16CLCX010(BP)+(SI)(BP)+(SI)+D8(BP)+(SI)+D16DLDX011(BP)+(DI)(BP)+(DI)+D8(BP)+(DI)+D16BLBX100(SI)(SI)+D8(SI)+D16AHSP101(DI)(DI)+D8(DI)+D16CHBP110D16(BP)+D8(BP)+D16DHSI111(BX)(BX)+D8(BX)+D16BHDIMODR/Mn8086/8088常用指令集n数据传送指令(14条)传送MOV堆栈操作PUSH,POP交换XCHG输入、输出IN,OUT转换XLAT地址传送LEA,LDS,LES标志传送PUSHF,POPF,
4、LAHF,SAHFn算术运算指令(20条)加法ADD,ADC,AAA,DAA加“1”INC减法SUB,SBB,AAS,DAS减“1”DEC比较CMP求补NEG乘法MUL,IMUL,AAM除法DIV,IDIV,AAD符号扩展CBW,CWDn逻辑运算指令(13条)求反NOT逻辑乘AND逻辑加OR异或XOR测试位TEST左/右移位SHL,SHR,SAL,SAR左/右循环移位ROL,ROR,RCL,RCRn字符串指令(10条)传送串MOVS,MOVSB/MOVSW串比较CMPS,CMPSB/CMPSW串扫描SCAS,SCASB/SCASW取字符串LODS,LODSB/LODSW存字符串STOS,STO
5、SB/STOSW重复前缀REP,REPZ,REPNZn控制转移指令(28条)子程序调用CALL子程序返回RET无条件转移JMP条件转移JZ,JNZ,JC,JNC,JO,JNO,JS,JNS,JP,JNP,JA,JAE,JB,JBE,JG,JGE,JL,JLE循环LOOP条件循环LOOPNE,LOOPE寄存器CX=0转移JCXZ中断INT,INTO中断返回IRETn处理机控制指令(12条)清除CF标志CLC进位有效位CF求反CMC置CF标志STC置DF标志STD清除DF标志CLD置IF标志STI清除IF标志CLI处理机暂停HLT等待状态WAIT将数据传送给协处理器(提供到数据/地址线上)ESC保
6、证总线的控制LOCK无操作NOPn寻址方式(重点)n概述n目的n大多数情况下,指令不直接给出操作数本身,而是给出存放操作数的寄存器或者是内存单元的地址。n大多数情况下,操作数地址也不是直接给出,而是给出计算操作数地址的方法,称之为寻址方式n寻址方式的种类n与数据有关的寻址方式(7种)n与转移地址有关的寻址方式(4种)nMOV指令(简介)n指令格式 mov 目的,源n功能:该指令将源内容送至目的地址内n例:mov ax,bx 将寄存器bx中的内容送到寄存器ax中n与数据有关的寻址方式n立即寻址方式n操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。
7、n立即数可以是8位的或者16位的。(386之后的机器也可以是32位的)n立即数方式用来表示常数,它经常用来给寄存器赋初值。只能用于源操作数字段,不能用于目的操作数字段,且源操作数长度应与目的操作数长度一致。n立即数寻址方式举例 MOV AL,5 -指令执行后(AL)=05H MOV AX,3064H-指令执行后(AX)=3064H6430OP指令AXn寄存器寻址n操作数在寄存器中,指令中指定寄存器号。n16位的操作数,寄存器可以是 AX,BX,CX,DX,SI,DI,SP,BP。n8位的操作数,寄存器可以是 AH,AL,BH,BL,CH,CL,DH,DL。例:MOV AX,BX 指令执行前:(
8、AX)=3064H (BX)=1234H 指令执行后:(AX)=1234H (BX)=1234H这种方式中,不需要访问存储器来取得操作数,所以这种方式可以得到较高的运算速度立即数寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址不需要计算操作数的地址需要计算操作数的有效地址操作数的地址段地址偏移地址+我们把这个偏移地址称为我们把这个偏移地址称为有效地址(有效地址(EA)有效地址(有效地址(EA)=基址基址+变址变址+位移量位移量存放在指令中的一个8位、16位的数,但它不是立即数,而是一个地址。存放在变址寄存器(SI,DI)中的内容,它通常用来访问数组中的某个元素或字
9、符串中的某个字符存放在基址寄存器(BX,BP)中的内容,它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址段偏移CSIPSSSP或BPDSBX、DI、SI或一个16位数ESDI(用于串指令)8086/80888086/8088段寄存器和相应存放偏移地址的寄存器之间的默认组合段寄存器和相应存放偏移地址的寄存器之间的默认组合成分16位寻址位移量0,8,16位基址寄存器BX,BP变址寄存器SI,DI1616位寻址是有效地址的三种成分的组成位寻址是有效地址的三种成分的组成n直接寻址方式n操作数的有效地制只包含位移量一种成分,其值就存放在代码段中指令的操作码之后。位移量的值就是操作数的有
10、效地址。例:MOV AX,2000H 假设(DS)=3000H物理地址=3000H*16+2000H =32000H30000H32000H6430OP代码段5030数据段AX 假设(32000H)=3050H 则指令执行后,AX=3050Hn可以用符号来代替数值地址 MOV AX,VALUE MOV AX,VALUE 如果在附加段,则应指定段前缀 MOV AX,ES:VALUE MOV AX,ES:VALUE直接寻址方式只适用于处理单个变量。例如某个存放在存储器中的变量,可以用直接寻址方式先把变量取出送到一个寄存器中,然后再做进一步的处理n寄存器间接寻址方式n操作数的有效地址只包含基址寄存器
11、或变址寄存器的内容。因此有效地址就在某个寄存器中,而操作数在存储器中。n16位寻址,可用的寄存器是BX,BP,SI,DI。使用BX、SI、DI,其默认段是数据段DS 使用BP,其默认段是堆栈段SS例:MOV AX,BX如果(DS)=2000H (BX)=1000H物理地址=2000H*16+1000H =21000H如果(21000H)=50A0H指令执行后 AX=50A0H20000H21000HA050数据段AX寄存器间接寻址方式可以用于表格处理,执行完一条指令后,只需修改寄存器内容就可以取出表格的下一项。n寄存器相对寻址方式n操作数的有效地址为基址寄存器或变址寄存器的内容和指令中指定的位
12、移量之和。例:MOV AX,COUNTSI(也可以表示为 MOV AX,COUNT+SI)如果(DS)=3000H (SI)=2000H COUNT=3000H物理地址=3000H*16+2000H+3000H=35000H如果(35000H)=1234H指令执行后 AX=1234H30000H35000H0030OP代码段3412数据段AX33000HCOUNTSI寄存器相对寻址方式同样可以用于表格的处理,表格的首地址可设置为偏移量的地址,利用修改基址或变址寄存器中的内容来取得表格中的值n基址变址寻址方式n操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和例:MOV AX,BXDI(
13、也可以表示为 MOV AX,BX+DI)如果(DS)=2100H (BX)=0158H (DI)=10A5H物理地址=2100H*16+0158H+10A5H=221FDH如果(221FDH)=1234H指令执行后 AX=1234H21000H221FDH3412数据段AX21158HBXDI基址变址寻址方式同样可以用于数组或表格的处理,表格的首地址可存放在基址寄存器中,利用变址寄存器来访问数组或表格中的元素n相对基址变址寻址方式n操作数的有效地址是一个基址寄存器与一个变址寄存器的内容和指令中指定的位移量之和。例:MOV AX,MASKBXSI(也可以表示 为MOV AX,MASK+BX+SI
14、)如果(DS)=3000H (BX)=2000H (SI)=1000H MASK=0250H物理地址=3000H*16+2000H+1000H+0250H=33250H如果(33250H)=1234H指令执行后 AX=1234H相对基址变址寻址方式常用于二维数组的寻址,如存储器中存放着由多个记录组成的文件,则位移量可以指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素33250H30000H5002OP代码段3412数据段AX32000HBXSI32250HMASKn与转移地址有关的寻址方式n目的n确定转移指令(条件转移指令、无条件转移指令)及转子指令(CALL)的转向地
15、址n当转移发生在段内的时候,给出即将转移去执行的那条指令的偏移地址,并用该偏移地址取代IP寄存器中的内容n当转去执行的指令与原来执行的指令不在同一段时,则还需要用新的代码段基址取代CS寄存器中原有的内容n种类n段内直接寻址n段内间接寻址n段间直接寻址n段间间接寻址n段内直接寻址n转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和n无条件转移指令在位移量为8位的时候称为短跳转 JMP SHORT QUEST IP IP+8位位移量n无条件转移指令在位移量为16位的时候称为近跳转 JMP NEAR PTR PROGIA IP IP+16位位移量n特点 指令中的位移量是转向的有
16、效地址与当前IP值之差,所以这一程序段在内存的不同区域运行时,转移指令本身不会发生变化,符合程序再定位的要求位移量IP+EAn段内间接转移n转向的有效地址是一个寄存器或是一个存储单元的内容。这个寄存器或者存储单元中的内容可以用除立即数以外的任何一种寻址方式获得 (IP)(EA)数据寻址方式根据数据寻址方式计算出有效地址的值转向的有效地址这种寻址方式和以下的两种寻址方式都不能用于条件转移指令。即,条件转移指令只能使用段内直接寻址,而无条件转移指令JMP和CALL可以使用四种寻址方式中的任何一种。n假设:(DS)=2000H,(BX)=1256H,(SI)=528FH,位移量=20A1H (232
17、F7)=3280H,(264E5H)=2450H JMP BX 执行该指令后,(IP)=1256H JMP TABLEBX 执行该指令后,(IP)=(DS)*16+(BX)+位移量)=(20000H+1256H+20A1H)=(232F7H)=3280H JMP BXSI (IP)=(DS)*16+(BX)+(SI)=(20000H+1256H+528H)=(264E5H)=2450H寄存器相对寻址方式基址变址寻址方式n段间直接寻址n指令中直接提供了转向的段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器中的内容n完成的操作 JMP FAR
18、 PTR OPR (IP)OPR的段内偏移地址 (CS)OPR所在的段地址n段间间接寻址n用存储器中的两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式获得n完成的操作 JMP DWORD PTR OPR (IP)(EA)(CS)(EA+2)n例 JMP DWORD PTRBX+8 (BX)=3706H,(DS)=1000H 物理地址=(DS)*16+(BX)+8 =10000H+3706H+8=1370EH B2H67H05H33H1370EHCSIP指令执行后,(IP)=67B2H,(CS)
19、=3305H8086宏汇编语言的基本语法n汇编语句n指令性语句n经汇编之后,有目标程序与之对应,是有实际操作的语句。n一般指令性语句 一条指令性语句对应一条8086/8088机器指令n宏语句 该语句由伪操作符定义,通过宏定义、宏调用、宏扩展的过程来实现宏语句。一个宏语句对应一组目标代码程序macro name MACRO dummy parameter list 宏定义体 ENDMmacro name actual parameter listn指令性语句格式 标号:前缀指令助记符操作数,操作数;注释n标号:代表“:”后面语句的存储地址,供转移指令(JMP)、转子指令(CALL)、循环指令(L
20、OOP)使用。由字母、数字组成串(第一个字符非数字)n前缀:是与串操作运算(MOVS、CMPS、SCAS、LODS、STOS)以及总线封锁指令(LOCK)配合使用的部分。它们是REP、REPZ、REPE、REPNZ、REPNE等等。LOOP1:REP MOVS DEST,SOURCEn操作数的数目可以为0,1或2,用“,”隔开n指示性语句n功能:对程序的起止信息、分段情况、变量说明、内存结构等进行说明。n格式:名字伪操作指令参数,参数;注释nPC宏汇编的伪指令n段定义伪指令:SEGMENT,ENDS,ASSUME,GROUP,ORGn符号定义伪指令:EQU,=,LABELn数据定义伪指令:DB
21、,DW,DD,DQ,DT,RECORD,STRUCn过程定义伪指令:PROC,ENDPn宏处理伪指令:MACRO,REPT,IRPCn条件汇编伪指令:IF,ENDIF,IFDIF,IFDEFn基本元素n汇编语言字符集n大写字母:AZn小写字母:azn数字:09n符号:+,-,*,/,(,),;,,,.,:,_,“,$,&,#,?,!注:汇编语言源程序中,大小写字母作用相同n常量与数值表达式n常量n在汇编时已经确定的值。在指令中作为直接操作数,或者给变量赋初值n类型n数值常量:以数值的形式直接写在语句中n符号常量:预先为它定义一个名字,然后在语句中用名字来表示该常量(提高程序的可读性)用 EQU
22、 或=来定义 例:PORT EQU 83H ALPHT=35*21数据形式格 式X取值范围例子注释二进制X X X X X X X X B0,101110101B八进制X X X X OX X X X Q0 70 7735O421Q十进制X X X XX X X X D0 90 937562358D缺省形式十六进制X X X X H0 F0FB23H最前面的一个字符必须是09ASCIIX X“X X”ASCII字符128个OK“Pass”十进制实数X X.X X E X X0 923.456E-7各种形式常量的格式n标号n标号是为一组机器指令所起的名字,用于程序转移指令、调用指令和循环指令的操
23、作数(转向地址),一般在CS段内定义和使用。n标号的属性:段地址、段内偏移地址和类型 标号所处的代码段的段基址,称为该标号的段地址 标号所处的位指向对于段首地址的相对地址,称为该标号的段内偏移地址n形式一:标号n形式二:OFFSET 标号LC1:MOV AL,20H JMP LC1MOV BX,OFFSET LB1MOV BX,OFFSET LB1 与 MOV BX,LB1 有什么不同?标号有FAR(远标号)和NEAR(近标号)种类型n近标号:该标号的定义在本段 在机器指令助记符之前,加一标号名字,后面紧跟一个冒号“:”LC1:MOV AL,20H JMP LC1n远标号:该标号的定义不在本段
24、 过程定义时,为过程起的名字也是标号,可作为转子指令的操作数,这类标号的类型在定义子过程时确定 PROP PROC FAR PROP ENDPn注:标号在使用时 (1)循环指令、条件转移指令只能引用NEAR型,并且定义标号语句和使用标号语句的相对 距离只能在 128 +127 字节范围内 (2)无条件转移指令、调用(转子)指令可引 用 NEAR 和 FAR 两种类型的标号 (3)如果同一段内,无条件转移指令语句到定 义该标号语句的距离在 128 +127 字节 范围内,则可在使用的标号前指定为短标 号:记为 SHORT 标号n变量n变量的定义及格式n变量是内存中一个数据区的名字,可以作为指令的
25、存储器操作数来引用n变量定义的格式:变量名 变量类型定义符 表达式,变量名:由用户定义(符合标识符定义的规范)变量类型:DB:1个字节 DW:2个字节,即1个字DD:4个字节,即2个字DQ:8个字节,即4个字DT:10个字节,即5个字n表达式n算术运算符:+,-,*,/,n逻辑运算符:NOT,AND,OR,XORn关系运算符:nEQ-相等nNE-不相等nLT-小于nGT-大于nLE-小于或等于nGE-大于或等于n分析操作符nTYPE 格式:TYPE 变量或标号 说明:变量:则汇编程序将回送该变量类型包含的 字节数 标号:则汇编程序将回送代表该标号类型的 数值。NEAR(-1)、FAR(-2)例
26、:ARRAY DW 1,2,3 ADD SI,TYPE ARRAY 汇编的结果为 ADD SI,2nLENGTH 格式:LENGTH 变量 说明:回送分配给该变量的单元数,表达式中带 DUP 时有效,非 DUP 时,回送1例:FEES DW 100DUP(0)MOV CX,LENGTH FEES则汇编结果为:MOV CX,100例:ARRAY DW 1,2 MOV CX,LENGTH ARRAY则汇编结果为:MOV CX,1nSIZE 格式:SIZE 变量 说明:回送分配给该变量的字节数,此值是 LENGTH 值和 TYPE 值的乘积例:ARRAY DW 1,2,3 MOV CX,SIZE A
27、RRAY则汇编结果为:MOV CX,2nOFFSET 格式:OFFSET 变量或标号 说明:回送该变量或标号的偏移地址值例:MOV BX,OFFSET OPR 则汇编程序将OPR的偏移地址回送给指令,在 执行时,将该偏移地址装入BX寄存器中nSEG 格式:SEG 变量或标号 说明:回送该变量或标号的段地址例:MOV BX,SEG OPR则汇编程序将OPR所在的段基址送入BX寄存器n属性操作符 I.PTR 格式:类型 PTR 表达式 类型:BYTE,WORD,DWORD,FAR,NEAR 表达式:是存储器操作数 说明:用来给已分配的存储地址赋予另一种属性,使 该地址具有另一种类型例:MOV BX
28、,5 非法指令MOV BYTE PTR BX,5MOV WORD PTR BX,5 II.段超越前缀 说明:用来表示一个标号、变量或地址表达式的段属 性 例:用段前缀来指定某段的地址操作数 MOV AX,ES:BX+SI III.SHORT 说明:表明JMP指令中转移地址的属性 128+127n指示性语句(说明性语句)n存储分配语句n数值表达式如 3*20n?保留存储空间但不存入数据例:ABC DB 0,?,?,0 DEF DW?,52 存储空间分配如图所示 nASCII字符串例:MESSAGE DB HELLO 存储空间分配如图所示00-00-3400ABCDEF48454C4C4FMESS
29、AGEnnDUP(?)重复因子n为正整数,表示数据项重复n次例:ARRAY1 DB 2 DUP(0,1,2,?)ARRAY2 DB 100 DUP(?)内存分配如图所示nnDUP(表达式 表达式,)例:ARRAY3 DB 100 DUP(0,2 DUP(1,2),0,3)000102-000102-ARRAY1ARRAY2-100个字节n段定义n段定义语句段名 SEGMENT 边界类型连接类型类别段名 ENDS边界类型:用来指明段的起始边界连接类型:段的连接方式类别:表示段的类别,连接程序只使同类别的段发生关联n段值设定伪指令语句ASSUMEn格式 ASSUME 段寄存器:段名,段寄存器:段名
30、,SEGA SEGMENTSEGA ENDSSEGB SEGMENTSEGB ENDSCODE SEGMENT ASSUME DS:SEGA,ES:SEGB,CS:CODE,SS:NOTHING MOV AX,SEGA MOV DS,AX MOV AX,SEGB MOV ES,AX CODE ENDSnORG 置汇编单元计数器语句n功能:用来指出其后的程序段或数据块存放的起 始地址的偏移量n格式:ORG 表达式 汇编程序用语句中表达式之值作为起始地址连续存放程序n例:VECTORS SEGMENT ORG 10 VECT1 DW 47A5H ORG 20 VECT2 DW 0C596H VEC
31、TORS ENDSVECT1偏移地址为0AHVECT2偏移地址为14Hn地址计数器$n汇编程序对源程序进行汇编时,使用$保存当前正在汇编的指令的偏移地址。n开始汇编或在每一段开始时,地址计数器初始化为0,以后在汇编过程中,每处理一条指令,地址计数器增加一个值,此值为该指令所需要的字节数n例 JNE$+6 当上一条指令执行的结果不为零时,转向地址是JNE指令的首地址加上6 注:$+6必须为另一条指令的首地址,否则,汇编 程序将指示出错信息n例:计算字符串的长度 STRING DB“THIS IS A BOOK”能否用分析操作符SIZE来计算?COUNT EQU$-STRINGn例:计算数的个数
32、ARRAY DW 1,2,3,4,5,6COUNT EQU ($-ARRAY)/2010002000300040005000600$ARRAY0000H0001H0002H0003H0004H0005H0006H0007H0008H0009H000AH000BHn过程定义n过程也称为“子程序”nCALL指令调用过程,RET指令结束过程n过程具有“NEAR”属性和“FAR”属性,如果不指定属性,汇编程序认为它是“NEAR”属性n具有NEAR属性的过程,只能由属于该过程的段中的其它程序调用n具有FAR属性的过程,可以由任意段调用n格式过程名 PROC NEAR 或 FAR RET过程名 ENDPS
33、EGX SEGMENT SUBT PROC FAR RETSUBT ENDP CALL FAR PTR SUBT SEGX ENDSSEGY SENGMENT CALL FAR PTR SUBT SEGY ENDSnDOS下程序正常结束的方式nMOV AH,4CH INT 21Hn主程序名 PROC FAR PUSH DS MOV AX,0 PUSH AX RET 主程序名 ENDP顺序结构程序设计n数据传送指令n一般传送指令n格式:MOV 目的,源n功能:将源内容送至目的地址内n说明:该指令有7种格式nMOV MEM/REG1,MEM/REG2 MOV AX,BX MOV AX,2000H
34、MOV 2000H,DSnMOV REG,DATAMOV AL,5不可两个内存位置直接传送数据nMOV AC,MEMnMOV MEM,ACnMOV SEGREG,MEM/REGMOV DS,AXnMOV MEM/REG,SEGREGMOV AX,DSnMOV MEM/REG,DATAMOV AX,3168H段寄存器之间不能传送数据MOV指令不能改变CS当前的内容立即数通用寄存器段寄存器内存MOV指令传送方向图n交换指令n格式:XCHG OPR1,OPR2n功能:将源操作数OPR2内容和目的操作数OPR1 内容互换 (OPR1)(OPR2)n说明n段寄存器不能作为操作数n无法将两个内存内容互换n
35、例:XCHG BX,BP+SI (BX)=6F30H(BP)=0200H(SI)=0046H (SS)=2F00H(2F246H)=4154H OPR2的物理地址=2F00H*16d+0200H+0046H =2F246H指令执行后:(BX)=4154H(BP+SI)=6F30Hn堆栈操作命令n格式nPUSH SRC 执行的操作(16位指令)(SP)(SP)-2 (SP)+1,(SP)(SRC)nPOP DST 执行的操作(16位指令)(DST)(SP)+1,(SP)(SP)(SP)+2注意:8086/8088中,不允许立即数进栈 标志寄存器的内容入栈和出栈:PUSHF和POPFn例:PUSH
36、 AX 将寄存器AX的内容压入堆栈 PUSH DS 将寄存器DS的内容压入堆栈 PUSH WORD PTR BX 将内存单元中的字压入堆栈 POP CX 将堆栈栈顶16位的字送入寄存器CX中 PUSHF MOV BP,SP AND BP,0FEFFH POPF 修改标志寄存器中TF的值n地址传送指令n取偏移地址指令n格式:LEA REG,SRCn执行的操作 (REG)SRCn功能:将内存变量的偏移地址送入16位的通用寄存器中n例 LEA BX,BX+SI+0F62H (BX)=0400H (SI)=003CH 执行后 BX=0400H+003CH+0F62H=139EHn说明:LEA指令与分析
37、操作符OFFSET功能类似,LEA的 功能更强,指令中的操作数可带下标n取32位地址指令 LDS,LESn格式:LDS REG,SRC LES REG,SRCn执行的操作 (REG)(SRC)(SREG)(SRC+2)n功能:内存的一个双字存储地址,内容的高十六位为 段地址,低十六位是偏移量地址。将偏移量地 址送入指定的寄存器中,段地址送入DS或ES中n例 ADDR DD 11223344H LDS SI,ADDR 执行后,(DS)=1122H (SI)=3344HDATA SEGMENTADDR DD 56781234HBUF DW 5DUP(20)AD-BUF DD BUFSTRING D
38、B abcdAD-STRING DD STRINGOFF-STRING DW STRINGDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLES DI,ADDRLEA BX,ADDRMOV AX,SEG ADDREND STARTMOV CX,BUFLDS SI,AD-BUFMOV AL,STRINGMOV AX,OFF-STRINGLES BX,AD-STRINGMOV AX,4C00HINT 21HCODE ENS34H12H78H56H14H00H14H00H14H00H14H00H14H00H04
39、H00H8FH1FH61H62H63H64H12H00H8FH1FH12H00H1F8FH:0000HADDRBUFAD-BUFSTRINGAD-STRINGOFF-STRING0004H000EH0012H0016H001AH数据段存放段地址和偏移地址存放偏移地址ES:DI=5678H:1234HBX=0000HAX=1F8FHCX=0014HDS:SI=1F8FH:0004HAX=0012HAL=61HES:BX=1F8FH:0012Hn算术运算指令n二进制加法运算指令ADD,ADC,INCnADD指令n格式:ADD DST,SRCn执行的操作 (DST)(SRC)+(DST)n影响标志位
40、:CF,OF,ZF,SF(只考虑主要的标志位)n例 ADD DX,0F0F0H 指令执行前(DX)=4652H 1111 0000 1111 0000 +0100 0110 0101 0010 1 0011 0111 0100 0010 指令执行后:(DX)=3742H ZF=0,SF=0,CF=1,OF=0n带进位的加法指令ADCn格式:ADC DST,SRCn执行的操作:(DST)(SRC)+(DST)+CFn例:设目的操作数存放在DX和AX,其中DX存放高位 字。源操作数存放在BX,CX中,其中BX存放高位 字。指令执行前:(DX)=0002H,(AX)=0F365H,(BX)=0005
41、H,(CX)=0E024H 指令序列为:ADD AX,CX (1)ADC DX,BX (2)指令1执行后:(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0 指令2执行后:(DX)=0008H,SF=0,ZF=0,CF=0,OF=00002H0F365HDXAX0005H0E024HBXCXnINC指令n格式:INC OPRn执行的操作:(OPR)(OPR)+1n例:X=124,Y=5,将X+Y的结果存于RESULT 单元中。DATA SEGMENT X DB 124 Y DB 5 RESULT DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:
42、DATASTART:MOV AX,DATA MOV DS,AX MOV AL,X ADD AL,Y MOV RESULT,AL MOV AH,4CH INT 21HCODE ENDS END STARTn二进制减法指令SUB,SBB,DEC,NEG,CMPnSUB 减法指令n格式:SUB DST,SRCn执行的操作:(DST)(DST)-(SRC)nSBB 带借位减法指令n格式:SBB DST,SRCn执行的操作:(DST)(DST)-(SRC)-CFnDEC 减1指令n格式:DEC OPRn执行的操作:(OPR)(OPR)-1nNEG 求补指令n格式:NEG OPRn执行的操作:(OPR)-
43、(OPR)n说明:把操作数按位求反后末位加1,因而执行的操作也可以表示为:(OPR)0FFFFH-(OPR)+1nCMP 比较指令n格式:CMP OPR1,OPR2n执行的操作:(OPR1)-(OPR2)n说明:该指令执行的操作与SUB指令执行的操作一样,但不保存结果。根据该指令执行的结果设置标志位n例:设X,Y,Z均位双精度数,他们分别存放在地 址为X,X+2,Y,Y+2,Z,Z+2的存储单元中 中,存放时高位字在高地址中,低位字在低 地址中,在8086中如何实现WX+Y+24-ZDATA SEGMENT X DD 11223344H Y DD 55667788H Z DD 22336699
44、H W DD?DATA ENDS443322118877665599663322-XX+2YY+2ZZ+2WW+2CODE SEGMENT ASSUME CS:CODE,DS:DATACODE ENDS END STARTSTART:MOV AX,DATA MOV DS,AX MOV AX,X MOV DX,X+2 ADD AX,Y ADC DX,Y+2 ADD AX,24 ADC DX,0 SUB AX,Z SBB DX,Z+2 MOV W,AX MOV W+2,DX MOV AX,4C00H INT 21H n二进制乘法指令:MUL,IMULnMUL 无符号数乘法n格式:MUL SRCn执
45、行的操作:字节操作数:(AX)(AL)*(SRC)字操作数:(DX,AX)(AX)*(SRC)nIMUL 带符号数乘法n格式:IMUL SRCn执行的操作与MUL相同注:乘法指令只对CF和OF有定义 对于MUL指令:如果乘积的高一半为0,则CF和OF均为0,否则为1。这样 的条件妈设置可以用来检查字节乘积的结果是字节还是字 对于IMUL指令:如果乘积的高一半是低一半的符号扩展,则CF和OF均为 0,否则为1n例:如(AL)=0B4H,(BL)=11H,求指令 IMUL BL 和 MUL BL 的结果 解:(AL)=0B4H 无符号数为180D,带符号数为-76D (BL)=11H 无符号数为1
46、7D,带符号数为17D 执行 IMUL BL 的结果为 (AX)=0FAF4H=-1292D,CF=OF=1 执行 MUL BL 的结果为 (AX)=0BF4H=3060D,CF=OF=1n二进制除法指令:DIV,IDIVn无符号数除法 DIVn格式:DIV SRCn执行的操作:n字节操作:16位的被除数在AX中,8位的除数为源操作数,结果的8位商在AL中,8位余数在AH中 (AL)(AX)/(SRC)的商 (AH)(AX)/(SRC)的余数n字操作:32位的被除数在DX,AX中,DX为高位字;16位的除数为源操作数,结果的16位商在AX中,16位的余数在DX中 (AX)(DX,AX)/(SR
47、C)的商 (DX)(DX,AX)/(SRC)的余数n带符号数除法 IDIVn格式:IDIV SRCn执行的操作:与DIV执行的操作相同。但操作数必须是带符号数,商和余数也都是带符号数n例:如(AX)=0400H,(BL)=0B4H,求指 令 IDIV BL 和 DIV BL 的结果 解:(AX)=0400H 无符号数为1024D,带符号数为+1024D (BL)=0B4H 无符号数为180D,带符号数为-76D 执行 DIV BL 的结果为 (AH)=7CH=124D 余数 (AL)=05H=5D 商 执行 IDIV BL 的结果为 (AH)=24H=36D 余数 (AL)=0F3H=-13D
48、 商n符号位扩充:CBW,CWDnCBW 字节转换为字n格式:CBWn执行的操作:AL的内容符号为扩展到AH,形成AX中的字。即如果(AL)的最高有效位为0,则(AH)=0;如果(AL)的最高有效位为1,则(AH)=0FFHnCWD 字转换为双字n格式:CWDn执行的操作:AX的内容符号扩展到DX,形成DX:AX中的双字。即如果(AX)的最高有效位为0,则(DX)=0;如果(AX)的最高有效位为1,则(DX)=0FFFFH例:算术综合运算举例,计算(V-(X*Y+W-540)/X 其中,X,Y,W,V均为16位带符号数,已分别装入X,Y,W,V单元 中,要求上式计算的结果的商存入AX寄存器,余
49、数存入DX寄存器DATA SEGMENT X DW 1234H Y DW 2345H W DW 3456H V DW 4567HDATA ENDS MOV AX,X IMUL Y MOV CX,AX MOV BX,DX MOV AX,W CWD ADD CX,AX ADC BX,DX SUB CX,540 SBB BX,0 MOV AX,V CWD SUB AX,CX SBB DX,BX IDIV XCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOV AX,DATA MOV DS,AX MOV AH,4CH INT 21HCODE ENDS END STA
50、RTn8086/8088位处理运算指令n逻辑运算指令nNOT 指令n格式:NOT OPRn执行的操作:(OPR)(OPR)nAND 指令n格式:AND DST,SRCn执行的操作:(DST)(DST)(SRC)nOR 指令n格式:OR DST,SRCn执行的操作:(DST)(DST)(SRC)nXOR 指令n格式:XOR DST,SRCn执行的操作:(DST)(DST)(SRC)nTEST 指令n格式:TEST DST,SRCn执行的操作:(DST)(SRC)n注:该指令执行完毕,设置相应的标志位,不保存结 果n例1 要求将AL的第5位置1 MOV AL,43H OR AL,20H 0100