1、第第 3 章章 第第 3 章章 3.1 8086/8088指令系统指令系统3.2 汇编语言程序汇编语言程序3.3 汇编语言程序设计汇编语言程序设计习题例习题例8086/8088指令语句格式指令语句格式 :;标号标号是自定义的、非系统关键字的符号串。是自定义的、非系统关键字的符号串。操作符操作符是操作码的助记符号表示,是指令的关键字,是操作码的助记符号表示,是指令的关键字,必必不可少不可少。操作数操作数是参与指令具体操作的是参与指令具体操作的操作对象操作对象,根据操作数的根据操作数的个数,有个数,有0(零)操作数(零)操作数指令、指令、单操作数单操作数指令和指令和双操作数双操作数(用逗号分割)指
2、令。(用逗号分割)指令。注释注释仅仅是提供阅读的文字信息。仅仅是提供阅读的文字信息。操作数寻址方式操作数寻址方式操作数作为参与指令具体操作数作为参与指令具体操作的对象操作的对象,可以是,可以是操作数据操作数据,也可以是也可以是转移地址转移地址。操作数可以是立即数,也可以存放在寄存器或内存储器操作数可以是立即数,也可以存放在寄存器或内存储器或输入或输入/输出接口中。输出接口中。操作数的寻址方式有操作数的寻址方式有立即方式、寄存器方式、直接内存立即方式、寄存器方式、直接内存方式、间接内存方式、方式、间接内存方式、I/O方式方式。8086/8088寻址方式分为寻址方式分为数据寻址方式数据寻址方式(7
3、种)和种)和转移地转移地址寻址方式址寻址方式(4种)两大类。种)两大类。数据传送数据传送MOV指令指令传送指令传送指令 MOV格式:格式:MOV dst,src操作:操作:dst src源操作数源操作数(src)传送到目的操作数)传送到目的操作数(dst)双双操作数:源操作数,目的操作数操作数:源操作数,目的操作数数据类型:字节类型数据类型:字节类型/字类型字类型立即方式立即方式:操作数据在指令中:操作数据在指令中直接给出直接给出(立即数立即数)。)。寄存器方式寄存器方式:操作数存放在指令给出的:操作数存放在指令给出的字节字节/字寄存器字寄存器中。中。例如:例如:MOV AX,0FC25H;A
4、X0FC25H MOV AL,42H;AL42HMOV AH,11010011B;AH 11010011B(0D3H)MOV CX,-25;AX-25MOV AL,1000 ;错误,错误,立即数立即数1000超字节范围超字节范围 MOV DS,2000H;错误错误,不能直接取立即数给段,不能直接取立即数给段RMOV AX,2000H;取;取2000H(立即数)给(立即数)给AXMOV DS,AX;将;将AX中的段基址数传送给中的段基址数传送给DSMOV AX,IP;错误错误,程序中不得出现,程序中不得出现IPMOV AX,CS;正确,;正确,CS可读可读MOV CS,AX;错误错误,CS不可写
5、不可写立即寻址和寄存器寻址立即寻址和寄存器寻址8086/8088存储器组织存储器组织微机微机存储器是以存储器是以字节字节为存储单位。为存储单位。8086/8088存储器(存储器(内存内存)地址线是)地址线是20根,根,内存容量内存容量1MB,地址范围地址范围 00FFFFFH。8086/8088存储器是存储器是分段结构分段结构,每段最大为,每段最大为64KB。操作数如果存放在内存,需要指明内存的操作数如果存放在内存,需要指明内存的逻辑地址逻辑地址,微处,微处理器的理器的地址加法器地址加法器会自动形成内存的会自动形成内存的物理地址物理地址.逻辑地址逻辑地址描述格式描述格式 段基址段基址:偏移址偏
6、移址 物理地址物理地址=段基址段基址16+偏移址偏移址存储器寻址方式存储器寻址方式段址寄存器:段址寄存器:内存逻辑地址的内存逻辑地址的段基址段基址存放的寄存器存放的寄存器(CS,SS,DS,ES)。)。偏移址寄存器偏移址寄存器:基址寄存器:基址寄存器(BX,BP),变址寄存器变址寄存器(SI,DI)。)。内存逻辑地址的内存逻辑地址的偏移地址(偏移地址(EA)寻址方式:寻址方式:直接寻址方式:直接寻址方式:指令中直接给出指令中直接给出EA 寄存器间接寻址方式:寄存器间接寻址方式:EA=(基(基/变址变址R)寄存器相对寻址方式:寄存器相对寻址方式:EA=(基基/变址变址R)+位移量位移量 基址变址
7、寻址方式:基址变址寻址方式:EA=(基址基址R)+(变址变址R)基址变址相对寻址方式:基址变址相对寻址方式:EA=(基址基址R)+(变址变址R)+位移量位移量段址寄存器段址寄存器和和偏移址寄存器偏移址寄存器配对使用的隐含规定:配对使用的隐含规定:代码(指令)指针代码(指令)指针CS:IP堆栈操作指针堆栈操作指针SS:SP,或或 SS:BP源数据串指针源数据串指针DS:SI目的数据串指针目的数据串指针ES:DI存储器寻址方式例存储器寻址方式例MOV AL,1000H;(;(DS:1000H)的字节数)的字节数ALMOV 2000H,BX;BX(DS:2000H)MOV AX,BX;(;(DS:B
8、X)的字数)的字数AXMOV AX,SS:BX;(;(SS:BX)的字数)的字数AXMOV AX,BX-100;(;(DS:(BX-100)的字数)的字数AXMOV BX+SI,AX;BX+SI 是内存间接寻址是内存间接寻址MOV AX,CX;错误错误,CX寄存器不能用于内存寻址寄存器不能用于内存寻址MOV BX,SI;错误错误,2个操作数不能都是内存寻址个操作数不能都是内存寻址MOV AX,SI+DI;错误错误,SI和和DI 不能配对做内存间接寻址不能配对做内存间接寻址8086/8088指令系统指令系统 8086/8088微机的指令系统有微机的指令系统有133条指令(附录条指令(附录A),分
9、为六大类:),分为六大类:1.数据数据传送类指令传送类指令:主要有主要有MOV,PUSH,POP,XCHG,LEA,IN,OUT等指令。等指令。2.算术运算类指令算术运算类指令:加、减、乘、除(整数)等算术运算指令。加、减、乘、除(整数)等算术运算指令。3.逻辑运算和移位类指令逻辑运算和移位类指令:逻辑运算和移位指令。逻辑运算和移位指令。4.控制转移类指令控制转移类指令:有有/无条件转移指令(在分支程序设计中介绍),无条件转移指令(在分支程序设计中介绍),LOOP循环控制指令(在循环程序设计中介绍),循环控制指令(在循环程序设计中介绍),CALL/RET指令指令(在子程序设计中介绍)。(在子程
10、序设计中介绍)。5.串操作类指令串操作类指令(在循环程序设计中介绍)(在循环程序设计中介绍)6.处理机控制类指令处理机控制类指令1.数据传送指令类数据传送指令类数据传送类指令一共有数据传送类指令一共有14条。这里主要介绍:条。这里主要介绍:MOV 传送传送PUSH 压入堆栈压入堆栈POP弹出堆栈弹出堆栈XCHG 交换交换LEA取偏移取偏移IN 输入端口输入端口“读读”OUT输出端口输出端口“写写”数据传送类指令均数据传送类指令均不影响标志位不影响标志位。数据类型字节(数据类型字节(byte)/字(字(word)。绝大多数是)。绝大多数是双操作数双操作数,两个操作数(字节两个操作数(字节/字)字
11、)类型必须一致类型必须一致。寻址方式基本与寻址方式基本与MOV 指令指令的要求相同的要求相同。数据传送指令数据传送指令传送指令传送指令 MOV格式:格式:MOV dst,src操作:操作:dst(src)双操作数寻址方式:双操作数寻址方式:dst(目的操作数目的操作数)src(源操作数源操作数)reg(寄存器寄存器)reg|mem|imm(立即数立即数)|segregmem(内存内存)reg|imm|segregsegreg(段寄存器段寄存器)reg|mem注意:注意:1.两个操作数类型(字节两个操作数类型(字节/字)要一致。字)要一致。2.目的操作数不能是立即数,两个操作数不能都是内存寻址方
12、式。目的操作数不能是立即数,两个操作数不能都是内存寻址方式。堆栈操作指令堆栈操作指令PUSH 和和POP 是一对堆栈操作指令:是一对堆栈操作指令:堆栈是一个堆栈是一个“先进后出先进后出”的内存数据存取区域。逻辑地址的内存数据存取区域。逻辑地址SS:SP。数据进入堆栈的操作为数据进入堆栈的操作为压入压入(PUSH),从堆栈取出数据的操作为),从堆栈取出数据的操作为弹出弹出(POP)。堆栈操作是)。堆栈操作是单操作数单操作数指令指令,只能是只能是字类型数据字类型数据。压入指令压入指令PUSH 格式:格式:PUSH src操作:操作:(SP)-2SP (src)(SP)操作数寻址:操作数寻址:src
13、=|mem|reg|segreg例如:例如:MOVAX,100 PUSHAX SS:0000 SP 栈顶栈顶 栈底栈底堆栈操作指令堆栈操作指令弹出指令弹出指令POP格式:格式:POP dst操作:操作:(SP)dst (SP)+2SP操作数寻址:操作数寻址:dst=mem|reg|segreg例如例如:PUSHAX;AX(SS:SP)PUSHBX;(;(DS:BX)(SS:SP)POPCX;(;(SS:SP)CXPUSHCL;错误错误,堆栈操作必须是字类型数据,堆栈操作必须是字类型数据POP200;错误错误,立即数不能是堆栈操作数据,立即数不能是堆栈操作数据交换指令交换指令XCHG格式:格式:
14、XCHG opr1,opr2操作:操作:(opr1)(opr2)操作数寻址:操作数寻址:opr1=reg|mem opr2=reg|mem例如:例如:XCHG 2000H,BX;错误,错误,两个内存数据不可直接交换。两个内存数据不可直接交换。可改为:可改为:MOV AX,2000H;(;(DS:2000H)AX XCHG AX,BX;AX和(和(DS:BX)交换)交换 MOV 2000H,AX;AX(DS:2000H)数据交换指令数据交换指令查表换码指令查表换码指令XLAT格式:格式:XLAT;无操作数无操作数操作:操作:ALDS:(BX+AL);隐含操作数寻址隐含操作数寻址注意注意:BX为表
15、头的为表头的EA,AL是距离表头的位移量是距离表头的位移量。表最大容量为。表最大容量为256个个字节。字节。例如:例如:MEMDB ABCDEFGHIJKLMNOPQRSTUVWXYZMOV BX,OFFSET MEM MOV AL,2XLAT;AL=43H(C的的ASCII码值码值)查表换码指令查表换码指令装偏移指令装偏移指令LEA格式:格式:LEA dst,src操作:操作:src的的偏移址偏移址dst操作数寻址:操作数寻址:dst=reg src=mem 例如:例如:MEM DB ABCDEFGHIJKLMNOPQRSTUVWXYZLEA BX,MEM;BX取取MEM数据表头的数据表头的
16、EA(等同于:(等同于:MOV BX,OFFSET MEM)MOV AL,BX+2;AL=43H装偏移址指令装偏移址指令输入输入/输出(输出(I/O)指令)指令I/O接口指令的语句格式:接口指令的语句格式:IN AL,端口地址端口地址 OUT 端口地址端口地址,AL I/O接口的端口地址接口的端口地址16位,地址范围为位,地址范围为00FFFFH。若端口地址为。若端口地址为 00FFH(0255),可以),可以直接给出直接给出;超出字节范围的端口地址必须存;超出字节范围的端口地址必须存放在放在DX寄存器中,寄存器中,间接给出间接给出。例如:例如:IN AL,80H ;与;与 MOV AL,80
17、H 的区别的区别OUT 20H,AL;与;与 MOV 20H,AL 的区别的区别MOV DX,100H;DX=100HOUT DX,AL;与;与 MOV DX,AX 的区别的区别IN AL,80H;错误错误,端口寻址不能用方括号端口寻址不能用方括号算术运算类指令可以分成加、减、乘、(整)除和十进制(算术运算类指令可以分成加、减、乘、(整)除和十进制(BCD码)码)调整五组调整五组。这里介绍加、减、乘、除。这里介绍加、减、乘、除14条指令条指令。ADD 加法加法ADC 进位加进位加INC 加加1 SUB 减法减法SBB 借位减借位减DEC 减减1 CMP 比较比较NEG 求补求补MUL 无符号乘
18、法无符号乘法 IMUL 有符号乘法有符号乘法DIV 无符号除法无符号除法IDIV 有符号除法有符号除法CBW 字节符号扩展字节符号扩展CWD 字符号扩展字符号扩展算术运算类指令基本都均算术运算类指令基本都均影响标志位影响标志位(ZF、SF、CF、OF)。)。绝大多数是绝大多数是双操作数双操作数,操作数可为字节,操作数可为字节/字类型。字类型。寻址方式与寻址方式与MOV 指令指令基本相同。基本相同。2.算术运算指令类算术运算指令类加法指令加法指令ADD格式:格式:ADD dst,src;(dst)+(src)dst进位加指令进位加指令ADC格式:格式:ADC dst,src;(dst)+(src
19、)+CF dst加加1指令指令INC格式:格式:INC dst;(dst)+1 dst操作数寻址方式:操作数寻址方式:dstsrc regreg|mem|imm memreg|imm加法运算指令加法运算指令减法指令减法指令SUB格式:格式:SUB dst,src;(dst)-(src)dst 借位减指令借位减指令SBB格式:格式:SBB dst,src;(dst)-(src)-CF dst减减1指令指令DEC格式:格式:DEC dst;(dst)-1dst操作数寻址方式:操作数寻址方式:dstsrc regreg|mem|imm memreg|imm减法运算指令减法运算指令减法运算指令减法运算
20、指令比较指令比较指令CMPCMP格式:格式:CMP dst,src操作:(操作:(dst)-(src),仅根据计算结果设置相关标志位。仅根据计算结果设置相关标志位。求补指令求补指令 NEGNEG格式:格式:NEGdst操作:操作:0-(dst)dst;求互补码求互补码无符号乘法指令无符号乘法指令MUL有符号乘法指令有符号乘法指令IMUL格式:格式:MUL src IMUL src操作数寻址:操作数寻址:src=reg|mem操作:有操作:有/无符号数的乘法无符号数的乘法字节乘法字节乘法:(:(AL)(src)AX字乘法字乘法:(AX)(src)DX|AX(32位)位)注意:注意:被乘数和乘积是
21、固定寻址,只需给出乘数。被乘数和乘积是固定寻址,只需给出乘数。例如例如:无符号数无符号数字节乘法(字节乘法(2551)0FFH1=00FFH 有符号数有符号数字节乘法(字节乘法(-11)0FFH1=0FFFFH乘法运算指令乘法运算指令无符号除法指令无符号除法指令DIV有符号除法指令有符号除法指令IDIV格式:格式:DIV src IDIV src操作数寻址操作数寻址:src=reg|mem操作:有操作:有/无符号数的除法无符号数的除法字节除法字节除法:(:(AX)/(src)AL(商),(商),AH(余数)(余数)字除法字除法:(DX|AX)/(src)AX(商),(商),DX(余数)(余数)
22、注意注意:1.被除数,商和余数是固定寻址,只需给出除数。被除数,商和余数是固定寻址,只需给出除数。2.除法可能有除法可能有0作除数错误作除数错误;商超出字节商超出字节/字范围的字范围的溢出错误溢出错误。3.有符号数除法的有符号数除法的余数与被除数的符号相同余数与被除数的符号相同。除法运算指令除法运算指令符号扩展指令符号扩展指令CBW,CWD 格式:格式:CBW;把把AL字节数的符号扩展到字节数的符号扩展到AH,成,成AX字数字数CWD;把把AX字数的符号扩展到字数的符号扩展到DX,成,成DX|AX双字数双字数操作数操作数:隐含寻址隐含寻址(AL/AX/DX)标志位:不改变。标志位:不改变。例如
23、:例如:MOVAL,56HCBW;AX=0056HMOVAX,8600HCWD;AX=8600H,DX=0FFFFH符号扩展指令符号扩展指令例如:例如:MULAH;无符号数无符号数(AL)(AH)AX DIVBX;无符号数无符号数(DX|AX)/(BX)AXIMULAL;有符号数有符号数(AL)(AL)AX IMUL CX;有符号数有符号数(AX)(CX)DX|AX例如:计算例如:计算(-104)除以除以25。MOVAL,-104;AL=-104(98H)CBW ;AL扩展为扩展为 AX(0FF98H)MOVBL,25;BL=25 IDIVBL;AL=-4(商),(商),AH=-4(余数)(余
24、数)例如,如果例如,如果 AX=0010H(+16),),BL=0FDH(-3)IDIV BL;AX=01FBH,商,商=-5,余数,余数=1乘乘/除法指令应用例除法指令应用例3.逻辑运算和移位指令逻辑运算和移位指令逻辑运算和移位类指令是以逻辑运算和移位类指令是以2#数位为单位的数位为单位的“位操作位操作”指令,指令,逻辑运逻辑运算指令算指令5条,移位指令条,移位指令8条。条。NOT 逻辑非逻辑非AND 逻辑与逻辑与OR 逻辑或逻辑或XOR 逻辑异或逻辑异或TEST 位测试位测试SHL 逻辑左移逻辑左移ROL 循环左移循环左移 SHR 逻辑右移逻辑右移ROR 循环右移循环右移SAL 算术左移算
25、术左移RCL 带进位循环左移带进位循环左移SAR 算术右移算术右移RCR 带进位循环右移带进位循环右移操作数可为字节操作数可为字节/字类型,按位进行逻辑运算字类型,按位进行逻辑运算。多数情况不改变标志位。多数情况不改变标志位。逻辑运算指令逻辑运算指令逻辑非指令逻辑非指令NOT格式:格式:NOTdst ;求(求(dst)的互反码)的互反码逻辑与指令逻辑与指令 AND逻辑或指令逻辑或指令 OR逻辑异或指令逻辑异或指令XOR格式:格式:ANDdst,src 操作:操作:(dst)(src)dst ORdst,src (dst)(src)dstXORdst,src (dst)(src)dst测试指令测
26、试指令TEST格式:格式:TEST dst,src操作:(操作:(dst)(src);不保存与运算结果,只设置不保存与运算结果,只设置标志位标志位移位指令移位指令逻辑左移逻辑左移 SHL逻辑右移逻辑右移 SHR算术左移算术左移 SAL算术右移算术右移 SAR循环左移循环左移 ROL循环右移循环右移 ROR带进位循环左移带进位循环左移 RCL 带进位循环右移带进位循环右移 RCR格式:格式:dst,cnt操作数寻址:操作数寻址:dst是移位的对象,是移位的对象,dst=reg|memcnt是移位的位数,是移位的位数,cnt=1|CL操作:(图操作:(图3.1 移位指令操作图解)移位指令操作图解)
27、标志标志CF:左移取自:左移取自dst的最高位,右移取自的最高位,右移取自dst 的最低位的最低位D0位。位。逻辑运算和逻辑运算和移位指令应用例移位指令应用例;AX乘以乘以10SAL AX,1MOVBX,AXSALAX,1SALAX,1ADDAX,BX;双字算术右移;双字算术右移SARDX,1RCRAX,1 DX CF AX CFSAR DX,1 RCR AX,1AND AL,50H;AL=(AL)50HOR AX,8080H;AX=(AX)(DS:8080H)AND AL,0FH;AL高高4位清位清0,低,低4位保留位保留OR AL,0FH;AL高高4位保留,低位保留,低4位置位置1XOR
28、AL,0FH;AL高高4位保留,低位保留,低4位取反位取反6.处理器控制指令处理器控制指令标志位设置指令标志位设置指令:CLCCF=0STCCF=1CMC CF取反取反CLDDF=0 STDDF=1CLIIF=0 STI IF=1CPU控制指令控制指令:NOP无操作(空操作)无操作(空操作)HLT停机(暂停停机(暂停,等待外部中断等待外部中断,中断后恢复运行)中断后恢复运行)WAIT等待(等待测试信号等待(等待测试信号TEST,恢复运行)恢复运行)汇编语言程序的语句汇编语言程序的语句汇编语言源程序由三类指令语句组成:汇编语言源程序由三类指令语句组成:(符号)执行指令语句(符号)执行指令语句提供
29、给汇编程序提供给汇编程序“翻译翻译”成机器能成机器能直接执行的指令直接执行的指令。汇编汇编指示性指示性语句语句(伪指令)(伪指令)提供给汇编程序提供给汇编程序指示汇编操作的指令指示汇编操作的指令。宏指令语句宏指令语句提供给汇编程序的提供给汇编程序的扩展的扩展的“功能宏大功能宏大”的指令的指令。8086/8088汇编语句格式汇编语句格式汇编语言源程序语句的格式:汇编语言源程序语句的格式:;名字项名字项是自定义的一个符号串。是自定义的一个符号串。操作码项操作码项是执行指令、伪指令和宏指令的操作功能符。是执行指令、伪指令和宏指令的操作功能符。操作数项操作数项是是0个或个或1个或多个(个或多个(用逗号
30、分隔)的操作用逗号分隔)的操作对象对象。注释项注释项是开始于是开始于“;”,提供阅读的文字信息。,提供阅读的文字信息。注意:注意:各项之间用空格键符,或各项之间用空格键符,或TAB键符分界。键符分界。操作码项必有,其它项可选择有操作码项必有,其它项可选择有/无。无。汇编语言程序不区别大小写英文。汇编语言程序不区别大小写英文。名字项名字项名字项名字项是自定义的一个符号串,可以是是自定义的一个符号串,可以是标号名标号名(必须结束于(必须结束于“:”)、符号常数名、变量名、段名、过程名符号常数名、变量名、段名、过程名。名字项名字项的合法字符:英文字母的合法字符:英文字母AZ/az,数字,数字09,特
31、殊字符,特殊字符 _?等。等。注意:数字注意:数字09不能是第不能是第1个字符,句点个字符,句点“”只能只能做第做第1个字符。个字符。在执行指令语句的在执行指令语句的操作数项操作数项中:中:符号常数名符号常数名作为作为立即数立即数使用。使用。标号名、过程名标号名、过程名作为作为转移地址转移地址使用。使用。变量名变量名作为存储单元的作为存储单元的偏移址偏移址,可以直接寻址使用。,可以直接寻址使用。段名段名作为作为段基址(立即数)段基址(立即数)使用。使用。汇编表达式汇编表达式操作数项操作数项是是0个或个或1个或多个(个或多个(用逗号分隔)的指令操作的用逗号分隔)的指令操作的对象,用规对象,用规定
32、的定的汇编表达式汇编表达式描述。描述。汇编表达式汇编表达式是由(整数)常数、寄存器、标号、变量等,和一些运算是由(整数)常数、寄存器、标号、变量等,和一些运算符,或操作符组成的表达式。符,或操作符组成的表达式。汇编表达式汇编表达式能被汇编程序解释,并计算出数值能被汇编程序解释,并计算出数值/地址结果,所以分为数地址结果,所以分为数值表达式和地址表达式两种。值表达式和地址表达式两种。数值表达式数值表达式:由由常数、数值运算符常数、数值运算符组成的表达式,计算结果为组成的表达式,计算结果为字节字节/字字数据数据。地址表达式地址表达式:包含:包含地址地址(标号、变量和过程名都是地址)、(标号、变量和
33、过程名都是地址)、常数常数,以,以及及地址运算地址运算/操作符操作符的表达式,计算结果为的表达式,计算结果为内存地址值内存地址值。常数和数值运算符常数和数值运算符数字常数数字常数(立即数立即数):2/10/16进制数、进制数、ASCII字符字符(用引号括起来用引号括起来)符号常数符号常数给常数起的名字给常数起的名字数值运算符数值运算符(运算对象和结果是(运算对象和结果是整数整数常数):常数):算术运算符算术运算符:+、*、/、MOD逻辑运算符逻辑运算符:NOT、AND、OR、XOR 关系运算符关系运算符:EQ、NE、GT、GE、LT、LE (真值为全(真值为全1,假值为全,假值为全0)地址运算
34、地址运算/操作符操作符地址的属性:地址的属性:段基址段基址 偏移址偏移址 类型类型(BYTE、WORD、DWORD、NEAR,FAR)地址运算地址运算/操作符:操作符:地址运算符地址运算符:+、;取偏移址的相对位移量取偏移址的相对位移量分析运算符分析运算符:取地址类型值取地址类型值TYPE ;类型值有类型值有1/2/4/-1/-2 取段基址值取段基址值SEG 取偏移址值取偏移址值OFFSET 属性定义运算属性定义运算符符:PTR;确定寻址的类型确定寻址的类型换段前缀换段前缀;修改段地址寄存器修改段地址寄存器SHORT;确定为确定为“短短”转移地址转移地址汇编运算符的优先级汇编运算符的优先级运算
35、符号运算符号优先级优先级()、)、高高低低:、:、PTR、THIS、SEG、OFFSET、TYPEHIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT(短距离转移)(短距离转移)类型指示符类型指示符 PTR应用格式应用格式:PTR 例如,例如,INC WORD PTR BX;内存操作数为;内存操作数为字类型字类型INC BYTE PTR BX;内存操作数为;内存操作数为字节类型字节类型CALL FAR PTR sub1;段间调用段间调用子程序子程序 sub1CALL NEAR PTR sub2;段内调用段内调用子程序子程序 s
36、ub2地址表达式应用例地址表达式应用例换换段指示符应用格式:段指示符应用格式::例如,例如,MOV AX,SS:SI+2 SUB AX,ES:BXMOV ES:BX,AXMEM DB 10H,20H,30H,40HMOV AX,SEG MEM;AX取取MEM段址段址MOV DS,AXMOV BX,OFFSET MEM;BX取取 MEM偏移址偏移址MOV AL,BX+2;AL=30HMOV AX,WORD PTR MEM;AX=2010H MOV AL,TYPE MEM;AL=1 汇编指示语句(伪指令)汇编指示语句(伪指令)常用的常用的汇编指示语句汇编指示语句(伪指令伪指令)分成五组:)分成五组
37、:符号定义、内存数据定义、段定义、过程定义、模块定义符号定义、内存数据定义、段定义、过程定义、模块定义。常用的伪指令语句常用的伪指令语句:EQU 和和=(符号定义(符号定义/赋值)赋值)DB/DW/DD(存储单元类型和存储数据定义)(存储单元类型和存储数据定义)SEGMENT 和和 ENDS(段定义)(段定义)ORG(段内偏移址指针(段内偏移址指针$设置)设置)PROC 和和 ENDP(过程(过程子程序定义)子程序定义)NAME 和和 END(模块定义和源程序结束)(模块定义和源程序结束)符号定义伪指令符号定义伪指令等值伪指令等值伪指令EQU格式:格式:EQU 等号伪指令(等号伪指令(=)格式
38、:格式:=与与EQU不同:不同:=只能是合法的汇编表达式;只能是合法的汇编表达式;=的符号名可以重复的符号名可以重复定义。定义。例如:例如:count EQU 19;count=19b=20b=b+10;b重新定义,重新定义,b=30d=(count+4)*2;d=46f EQU 123456H;正确,;正确,“123456H”为符号对象为符号对象g=123456H;错误错误,123456H超过超过16位位2#的数值范围的数值范围数据定义伪指令数据定义伪指令内存数据定义伪指令内存数据定义伪指令DB、DW 和和 DD 格式:格式:DB/DW/DD 功能:定义内存变量和类型,分配和初始化内存单元数
39、据。功能:定义内存变量和类型,分配和初始化内存单元数据。伪指令伪指令类型类型字节数字节数数值数值范围范围DBBYTE1字节(字节(8位位)数)数DWWORD2字(字(16位位)数)数DDDWORD4双字数,即双字数,即2个字数个字数内存内存数据定义的数据表数据定义的数据表 数据表数据表为顺序存放在内存单元的数据,多个数据之间用为顺序存放在内存单元的数据,多个数据之间用“,”分隔。分隔。数值表达式数值表达式:DB(8位数值的数据表)位数值的数据表)DW(16位数值的数据表)位数值的数据表)DD(32位数值的数据表)位数值的数据表)地址表达式地址表达式:DW(偏移址的数据表)(偏移址的数据表)DD
40、(偏移址和段基址的数据表)(偏移址和段基址的数据表)ASCII码字符串码字符串:用单用单/双引号界定的双引号界定的字符串字符串的数据表。的数据表。?分配空单元,不放数据分配空单元,不放数据 DUP数据重复定义数据重复定义(可嵌套使用)(可嵌套使用)格式:格式:DUP()内存内存数据定义例数据定义例 DA1 DBDATA SEGMENTDA2 EQU$-DA1;$为当前偏移址指针,为当前偏移址指针,DA2=12DA3 DB6DH,62,15H,28DA4 DB10 dup(0,5 dup(1,2),0)DA5 DB12345DA6 DW 7,9,298,1967DA7=DA6 DA4;DA7=1
41、25DA8=$DA4;DA8=133段定义伪指令段定义伪指令段定义伪指令段定义伪指令SEGMENT格式:格式:SEGMENT 段结束伪指令段结束伪指令ENDS格式:格式:ENDS SEGMENT语句与对应的语句与对应的ENDS语句的语句的段名段名必须一致。必须一致。段基址说明伪指令段基址说明伪指令 ASSUME 格式:格式:ASSUME :,.段寄存器段寄存器可以是可以是CS/DS/ES/SS,段名段名是已定义的。是已定义的。偏移址指针设置伪指令偏移址指针设置伪指令 ORG格式:格式:ORG ;数值数值065535偏移址指针用偏移址指针用“$”表示。表示。程序的代码段结构程序的代码段结构:SE
42、GMENT ;段开始;段开始 ASSUME ENDS;此段结束;此段结束程序的数据段结构:程序的数据段结构:SEGMENT ;段开始;段开始 ENDS;此段结束;此段结束程序的段结构程序的段结构程序模块定义伪指令程序模块定义伪指令程序模块开始伪指令程序模块开始伪指令NAME格式:格式:NAME (源程序模块开始(源程序模块开始NAME伪指令可以伪指令可以省略省略不用。)不用。)程序模块结束伪指令程序模块结束伪指令END格式:格式:END 汇编语言源程序结构例汇编语言源程序结构例data SEGMENT xdb?y dw?zdd?data ENDSstack SEGMENT dw 100 dup
43、(?)topequ$stack ENDScode SEGMENTASSUME CS:code,DS:data,SS:stackSTART:MOV AX,data MOV DS,AX ;设置;设置DS MOV AX,4C00H ;返回;返回DOSINT 21Hcode ENDS END START汇编语言程序设计技术汇编语言程序设计技术结构化汇编语言程序设计结构化汇编语言程序设计结构化程序设计使程序结构清晰、易于理解、易于调试和结构化程序设计使程序结构清晰、易于理解、易于调试和修改,充分显示了修改,充分显示了程序模块化程序模块化的优点。的优点。汇编语言程序的基本结构汇编语言程序的基本结构汇编语言
44、程序设计有三种基本结构,即汇编语言程序设计有三种基本结构,即顺序结构、分支结顺序结构、分支结构构和和循环结构循环结构。它们是单入口。它们是单入口/出口的程序结构。这三种结出口的程序结构。这三种结构的任意组合和嵌套构成了构的任意组合和嵌套构成了结构化程序设计结构化程序设计。子程序设计技术子程序设计技术顺序程序设计例顺序程序设计例1【例【例3.1】计算计算S=(8000-(X*Y+Z)/X,其中,其中X,Y,Z,S均是有符号数字变量。均是有符号数字变量。;定义内存字变量定义内存字变量x,y,z,s:DATASEGMENT X DW600 Y DW25 Z DW-2000 S DW?,?;存放商和余
45、数;存放商和余数DATAENDS;计算计算S算术表达式程序段:算术表达式程序段:MOV AX,XIMUL Y;DX|AX=X*YMOV BX,AXMOV CX,DX;CX|BX=X*YMOV AX,ZCWD;Z扩展成双字扩展成双字DX|AXADD BX,AXADC CX,DX;CX|BX=X*Y+ZMOV AX,8000CWD;8000扩展成双字扩展成双字DX|AXSUB AX,BXSBB DX,CX;DX|AX=8000-(X*Y+Z)IDIV X;(;(8000-(X*Y+Z)/X MOV S,AX;商(;商(AX)存放到)存放到S单元单元MOV S+2,DX;余数(;余数(DX)存放到)
46、存放到S+2单元单元顺序程序设计例顺序程序设计例2【例【例3.2】把一个字节的压缩把一个字节的压缩BCD,转换成两个字节的,转换成两个字节的ASCII码。码。;定义数据段定义数据段:DATASEGMENT BCD DB48H ASC DB?,?;存放转换结果;存放转换结果DATAENDS;转换程序段:转换程序段:MOV AL,BCDMOV BL,AL;AL,BL取取BCD单元的值单元的值AND AL,0FH;AL=08HOR AL,30H;AL=38HMOV ASC,AL;38H存放到存放到 ASC单元单元MOV CL,4SHR BL,CL;BL=04HOR BL,30H;BL=34H MOV
47、 ASC+1,BL;34H存放到存放到ASC+1单元单元无条件转移指令无条件转移指令无条件转移指令无条件转移指令JMP JMP 操作:计算转移目标的地址,转移到目标处去执行。操作:计算转移目标的地址,转移到目标处去执行。段内段内直接转移直接转移(直接给出段内目标地址的标号直接给出段内目标地址的标号)格式:格式:JMP lab例如:例如:JMP sub1 ;直接转移到标号直接转移到标号sub1 JMP SHORT sub2;段内直接短转移到标号段内直接短转移到标号sub2 JMP NEAR PTR sub3;段内直接近转移到标号段内直接近转移到标号sub3段内段内间接转移间接转移(寄存器(寄存器
48、/内存单元给出目标地址)内存单元给出目标地址)格式:格式:JMP src操作数寻址:操作数寻址:src=reg|mem;字类型;字类型例如:例如:JMP BX;IP 从从BX 中取偏移址中取偏移址EA JMP WORD PTR BX;IP 从(从(BX)指示的内存)指示的内存2字节中取字节中取EA条件转移指令条件转移指令Jxxx格式:格式:Jxxx 操作数:为操作数:为段内短转移段内短转移,即标号偏移址的,即标号偏移址的位位移量移量在在(-128,+127)区间。)区间。操作:操作:IP=IP+(补码(补码)注意注意:1.条件转移指令通常用在能设置了标志位条件转移指令通常用在能设置了标志位的指
49、令之后的指令之后,根据根据状态标志状态标志条件的成立与条件的成立与否判断是否转移。否判断是否转移。2.条件转移指令只能使用条件转移指令只能使用段内短转移段内短转移寻址寻址方式。方式。条件转移指令条件转移指令条件成立?条件成立?yesno转目标语句转目标语句下一条语句下一条语句(单标志)条件转移指令表(单标志)条件转移指令表指令指令助记助记符符测试测试标志标志条件条件说说 明明JZ(JE)ZF=1为零转为零转(等于转等于转)JNZ(JNE)ZF=0非零转非零转(不等转不等转)JCCF=1有进有进/借借位转位转JNCCF=0无进无进/借借位转位转JSSF=1符号位为符号位为1转转JNSSF=0符号
50、位为符号位为0转转JOOF=1有溢出有溢出错错转转JNOOF=0无溢出无溢出错错转转JPPF=1“1”偶偶数个数个转转JNPPF=0“1”奇奇数个数个转转JCXZ(CX)=0CX为零转为零转(复合标志)条件转移指令表(复合标志)条件转移指令表指令指令助记助记符符测试测试标志标志条件条件A和和B比较情况比较情况JG(SF OF)ZF=0AB有有符符号号数数JGESF OF=0A=BJLSF OF=1ABJLE(SF OF)ZF=1AB无无符符号号数数JAECF=0A=BJBCF=1ABJBECFZF=1A=B分支结构程序设计分支结构程序设计用用条件转移条件转移(Jxxx)指令指令实现程序的实现程