资源描述
1 概述n汇编语言基本概念n程序汇编连接与调试方法1 汇编语言基本概念一、汇编语言相关特征l机器语言 是一种用二进制代码编写指令和程序的语言 例:B0 04 传送指令,将4送到累加器AL中l汇编语言 用助记符代替指令的操作码,用数字或符号代替指令中操作数或操作数存放位置的一种程序设计语言 例:MOV AL,04 ;传送指令,将4送到累加器AL中 MOV EAX,200209281 汇编语言基本概念二、汇编语句行基础知识基本格式 名字 操作符 操作数 ;注释操作符:机器指令、伪指令、宏指令的助记符操作数:操作数项有多个操作数时,用逗号 ,分开1 汇编语言基本概念三、汇编语言源程序示例1、程序的层次模块结构源程序堆栈段数据段代码段DEBUG直接编程初始化输 入运算处理转 换输 出返回DOS数值运算非数值运算1 汇编语言基本概念n汇编语言与机器特性密切相关汇编语言硬件特性CPU工作方式CPU寄存器体系指令系统存储管理机制中断与外部设备依赖于充分发挥1 汇编语言基本概念2、源程序的分段结构及示例说明例:程序输出显示:“Welcome!”,流程描述如下:定义堆栈段定义数据段定义代码段源程序模块结束指示段寄存器初始化显示输出字符串自动返回 DOS 源程序SAMPLE.ASM:STACKS SEGMENT STACK DW 128 DUP(?)STACKS ENDS DATAS SEGMENT STRING DB Welcome!,13h,10h,$DATAS ENDS CODES SEGMENT ASSUME CS:CODE,DS:DATAS START:MOV AX,DATAS MOV DS,AX LEA DX,STRING MOV AH,09H INT 21H MOV AX,4C00H INT 21H CODES ENDS END START堆栈段数据段代码段源程序模块结束2 程序汇编连接与调试方法设计、编写源程序(数据结构+算法+编码)汇编语言源程序文件(*.ASM)目标代码程序文件(*.OBJ)可执行程序文件(*.EXE/*.COM)运行正确?调试运行正确?结束否否否是是调试DEBUG编辑EDIT连接LINK执 行汇编MASM2 程序汇编连接与调试方法一、程序编辑 利用熟悉的文本编辑软件,对汇编语言源程序进行编辑,生成.ASM文件。汇编语言使用过程中,生成不同文件后缀名的含义:.ASM 汇编源程序 .OBJ 目标文件 .LST 列表文件 .CRF 交叉引用文件 .MAP 分配图文件 .LIB 库文件 .DEF 定义文件 .EXE/.COM 可执行文件2 程序汇编连接与调试方法二、程序汇编与连接执行n汇编程序 MASM.EXE MASM/?查看命令参数n连接程序 LINK.EXE LINK/?查看命令参数n汇编连接程序 ML.EXE ML/?查看命令参数n汇编过程:对源程序扫描后生成目标文件.OBJ 如有语法错误,则显示相应的错误信息,返回修改源程序2 程序汇编连接与调试方法n汇编示例:D:MASM6 masm p1.asm 显示如下:Assembling:p1.asm p1.asm(12):error A2006:undefined symbol:FIVE1 表示:源程序12行有错,未定义符号 FIVE1 源程序一直到修改后汇编无错误,则生成 p1.objn连接:D:MASM6 link p1n生成执行文件 p1.exe 则可直接运行:D:MASM6 p1 2 程序汇编连接与调试方法三、程序跟踪调试n汇编过程中可以检查程序的语法错误n汇编无误,生成可执行文件后,运行没有达到预期的结果,程序可能存在逻辑错误。需要用调试工具进行跟踪调试,查找程序的逻辑错误。n常用调试工具程序:DEBUG.EXE 提供一个监控程序环境,通过提供命令和相关参数了解程序执行过程中各寄存器和存储单元的值及其变化情况,帮助确定程序中的问题。(全部命令的详细格式参见教材附录)2 指令系统n指令格式n指令寻址方式n指令集2.1指令的基本格式 nIntel 32位处理器指令格式。指令长度不能超过15个字节。前缀 操作码 寻址方式 位移量 立即数 03B 12B 02B 04B 04B 16位寻址方式n立即寻址n寄存器寻址n直接寻址n寄存器间接寻址n寄存器相对寻址n基址变址寻址n相对基址变址寻址2.2 寻址方式n 32位的指令寻址包括数据寻址和程序转移寻址。现介绍如下:1、非存储器的数据寻址方式示例n(1)立即寻址n MOV EAX,19461201H;19461201H-EAX 与16位寻址相似。(2)寄存器寻址nMOV EAX,ECX ;ECX-EAX 与16位寻址相似2、存储器的数据寻址方式示例n(1)直接寻址nMOV EAX,4612H ;EA=4612,(EA)-EAX 与16位寻址相似。n(2)寄存器间接寻址nMOV ECX,EDX ;ECX间接指示存放操作数EA在ECX 中,EA=ECX,EDX-EA,与16位寻址相似。存储器的数据寻址方式示例(续)n(3)寄存器相对寻址nMOV ECX,EAX+24 ;EA=EAX,(EA)-ECXn(4)基址变址寻址nMOV EAX,EBX ESI;EA=EBX+ESI,(EA)-EAXn(5)相对基址变址寻址nSUB EAX,EBX+ESI+0FF0H ;EA=EBX+ESI+0FF0H,EAX-(EA)-EAX存储器的数据寻址方式示例(续)(6)带比例因子的变址nMOV ECX,ESI*4 ;EA=ESI4,(EA)-ECX(7)基址与带比例因子的变址寻址nMOV ECX,EAXEDX*8 ;EA=EAX+EDX8,(EA)-ECX(8)基址与带位移量及比例因子的变址寻址nMOV EAX,LTABEDI*4EBP+80 ;EA=LTAB+EDI4+EBP+80,(EA)-EAX3.程序转移寻址方式n有相对EIP的段内直接寻址,段内间接寻址、段间直接寻址和段间间接寻址。n段内转移是指程序在同一段代码内,仅改变EIP的值而不改变CS的值所发生的转移。n而段间转移是程序要从一个代码段转移到另一个代码段,则不仅改变EIP的值,同时也要改变CS的值。n无论是段内还是段间发生的转移都有直接和间接的形式,因此程序转移有四种寻址。n1.段内直接寻址(Intrasegment Direct Addressing)转移偏移地址EA是指令中位移量(与指令指针IP当前内容之和。即:EA=IP+DISP-IPn2.段内间接寻址(Intrasegment Indirect Addressing)转移偏移地址 EA 如果指定的是寄存器,则将寄存器的内容-IP。如果指定的是存储器中的一个字,则将该存储单元的内容-IP。段内转移过程段内转移图示n段内直接转移和间接转移寻址如下图:段间转移过程n1.段间直接寻址(Intersegment Direct Addressing)n 用指令中直接提供的转移偏移地址EA-IP,指令同时直接提供的转移段地址-CS,实现从一个代码段转移到另一个代码段。n2.段间间接寻址(Intersegment Indirect Addressing)n 根据存储器的数据寻址方式获得EA,再将EA双字单元第一个字的内容作为转移偏移地址-IP,EA双字单元第二个字的内容作为转移段地址-CS,然后CS+IP形成指令的实际转移地址。段间转移图示n程序段间的直接或间接转移如下图:4.前缀代码67H或66Hn32位机汇编指令或有32位操作数的情形识别涉及指令机器码格式的有关前缀表示。这些在相应的汇编列表文件(*.LST)或DEBUG过程中可以看到,如前缀代码67H或66H。(1)机器指令操作数长度属性前缀码66Hn66|83 E0 0F AND EAX,0FH ;EAX0FH-EAX 66|8B CB MOV ECX,EAX(2)机器指令寻址长度续性前缀n67|8B 1475 00000026 MOV DX,26HESI*2n67|66|8B 04B0 MOV EAX,EAX+ESI*43.3 指令系统n指令系统是一台机器所有指令的集合。Pentium系列机指令系统庞大、类型多样,约有300多条指令,其中包括基本指令100多条。具有支持多进程、多任务、虚拟存储器和多媒体等功能的32位指令。常用指令类型集n1.数据传送类指令n2.算术运算类指令n3.逻辑和移位操作类指令n4.串操作与重复前缀类指令n5.控制转移类指令n6.处理机控制类指令n7.其它指令本讲义约定:nOPD表示目的操作数;OPS表示源操作数;(OPS)表示OPS的内容;(OPD)表示OPD的内容;-表示传送;R表示通用寄存器;Sr表示段寄存器;M表示主存储器;nXXXX:XXXX 表示组合号,“:”表示其前后组成一个数;L表示操作数的长度;d表示立即数;B/W/D表示字节或字或双字。数据传送类指令n通用数据传送指令n堆栈操作指令n标志寄存器传送指令n地址传送指令n输入输出指令通用数据传送指令n1.传送指令MOVn2.数据交换指令XCHGn3.查表转换指令 XLAT语句格式:MOV OPD,OPSn功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)OPD。n下图描述了MOV指令在传送数据时允许传送的路径及类型。1.传送指令MOV注意:n(1)OPD,OPS的类型(8/16/32位)必须一致.n(2)OPD不能使用立即数。n(3)双操作数不能同时为内存中的数据。n(4)段寄存器不能直接送立即数.n(5)指令执行后不影响FLAGS的标志位的状态.n(6)不能任意改变CS示例:存储器与寄存器间数据传送。nMOV AX,BUF ;BUF是变量,源操作数为直接寻址nMOV BH,DI ;源操作数为寄存器间接寻址nMOV DI,ES:3SI ;源操作数为变址寻址,使用跨段前缀nMOV BP,3BX+SI ;源操作数为基址加变址寻址nMOV BUFA,DL ;BUFA是一字节变量nMOV BP,AX ;使用SS段寄存器nMOV DS:BP,DL ;使用跨段前缀nMOV BUF,DS ;BUF是个字变量nMOV ES,BUF2.数据交换指令XCHGn语句格式:XCHG OPD,OPSn功能:将源地址与目的地址中的内容互换。即(OPD)OPS,(OPS)OPD。n寄存器与存储器之间数据交换。nMOV AX,5678H;(AX)=5678HnMOV BX,0FFFFH;(BX)=0FFFFHnXCHG AX,BX;(AX)=0FFFH,(BX)=5678HMOVSX和MOVZX指令n格式:MOVSX OPD,OPS MOVZX OPD,OPSn它们将OPS的内容-OPD,但是对于OPD左边空缺的位,MOVSX全部用OPS的符号填充(作符号延伸),可以对有符号的数进行符号扩展;而MOVZX是全部以零(0)填充,可对无符号数进行0扩展.注意:OPD的位数比OPS的位数长示例:nMOV CL,88H MOVZX AX,CL ;AX=0088H MOVSX BX,CL ;BX=FF88Hn另外也可如下书写指令:nMOVSX CX,BL MOVSX EAX,BUFnMOVZX AX,CL MOVSX EBX,ALnMOVZX ESI,BUF MOVZX EDX,DI3.查表转换指令 XLAn语句格式:XLAT OPS或XLATn功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即(BX+AL)AL。堆栈操作指令n1.进栈指令PUSHn2.出栈指令POPn3.PUSHA/PUSHAD指令n4.POPA/POPAD指令1进栈指令PUSHn语句格式:PUSH OPS ;W/D,R/Sr/M/dn功能:将寄存器、段寄存器、立即数或存储器中的一个字数据压入堆栈顶部,指令视操作数长度为字(2字节)或双字(4字节)和地址为16位/32位,先将SP/ESP-2/4-SP/ESP,后将OPS-SP/ESP。2出栈指令POPn语句格式:语句格式:POP OPD ;W/D,R/Sr/M/dPOP OPD ;W/D,R/Sr/M/dn功功能能:视视OPDOPD长长度度为为字字或或双双字字,先先将将当当前前SP/ESPSP/ESP指指向的内容向的内容-OPD,-OPD,后将后将SP/ESP+2/4-SP/ESP SP/ESP+2/4-SP/ESP。n从从POPPOP指指令令功功能能可可看看出出,该该指指令令为为PUSHPUSH指指令令的的逆逆过过程程,一般成对使用。一般成对使用。3.PUSHA/PUSHAD指令n格式:PUSHA ;压入8个字通用寄存器.PUSHAD;压入8个双字通用寄存器.4.POPA/POPAD指令n格式:POPA ;弹出到8个16位通用寄存器 POPAD;弹出到8个32位通用寄存器标志寄存器传送指令n1.标志送AH指令LAHFn2.AH送标志指令SAHFn3.标志寄存器进栈指令PUSHFn4.标志寄存器出栈指令POPF1标志送AH指令LAHFn语句格式:LAHFn功能:将标志寄存器的低8位送入AH寄存器。即(FLAGS)7-0AH。该指令的执行对标志位无影响。n【例】标志寄存器传送。执行前:(FLAGS)=0485H,(AX)=0FFFFH执行指令:LAHF执行后:AH=85H2AH送标志指令SAHFn语句格式:SAHFn功能:将AH的内容送入标志寄存器的低8位,高8位不变。即(AH)FLAGS7-0。n从该指令功能可看出,SAHF为LAHF的逆过程。3标志寄存器进出栈指令PUSHF/POPFn语句格式:nPUSHF 功能:将标志寄存器的内容压入堆栈。即(FLAGS)-堆栈。nPOPFn功能:将堆栈顶端的内容送到标志寄存器。即堆栈-(FLAGS)。地址传送指令n1 1传送偏移地址指令传送偏移地址指令 LEALEAn2 2传送偏移地址及数据段首址指令传送偏移地址及数据段首址指令LDSLDSn3 3传送偏移地址及附加数据段指令传送偏移地址及附加数据段指令LESLES1传送偏移地址指令 LEAn语句格式:LEA OPD,OPS;OPS的EA-OPD ;OPD是16/32位的R,OPS是Mn功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。n【例】主存偏移地址的获取。MOV BX,0100H;(BX)=0100HMOV SI,0210H;(SI)=0210HLEA BX,1234BX+SI;(BX)=1544H2LDS/LES/LFS/LGS/LSS指令n语句格式:LDS/LES/LFS/LGS/LSS OPD,OPS;EA=OPSn功能:地址传送LDS等指令中,OPD为R(16位),OPS为M(32位).操作对FLAGS无影响,执行后结果为:(EA)-R ;全程指针的偏移地址(EA+2)-LDS/LES/LFS/LGS/LSS;全程指针的段地址输入输出指令n1输入指令INn2输出指令OUT1输入指令INn输入指令用来从指定的外设寄存器取信息送入累加器。它有四种形式:n(1)语句格式:INAL,PORT 功能:(PORT)ALn(2)语句格式:INAX,PORT 功能:(PORT)AXn(3)语句格式:INAL,DX 功能:(DX)ALn(4)语句格式:INAX,DX 功能:(DX)AL2输出指令OUTn输输出出指指令令用用来来把把累累加加器器的的内内容容送送往往指指定定的的外外设设存存储储器,它有四种形式:器,它有四种形式:n(1)语句格式:)语句格式:OUTPORT,AL 功能:(功能:(AL)PORTn(2)语句格式:)语句格式:OUTPORT,AX 功能:(功能:(AX)PORTn(3)语句格式:)语句格式:OUTDX,AL 功能:(功能:(AL)DXn(4)语句格式:)语句格式:OUTDX,AX 功能:(功能:(AX)DX算术运算类指令n加法指令n减运算指令n乘运算指令n除运算指令 加法指令n1加1指令 INCn2加指令ADDn3带进位加指令ADCn1加1指令 INCn语句格式:INC OPDn功能:将目的操作数加1,结果送目的地址。即(OPD)+1OPD。nINC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。如:INC BX,即(BX)+1BX。加1指令可用于对计数器和地址指针进行调整。2加指令ADDn语句格式:ADD OPD,OPSn功能:将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。n即(OPD)+(OPS)OPD。n语句格式:ADC OPD,OPSn功能:将目的操作数加源操作数再加低位进位,结果送目的地址。n即(OPD)+(OPS)+CF OPD。n【例】无符号双字加法运算。MOVAX,4652H;(AX)=4652HADDAX,0F0F0H;(AX)=3742H,CF=1MOVDX,0234H;(DX)=0234HADCDX,0F0F0H;(DX)=0F325H,CF=03带进位加指令ADC减运算指令n1减1指令DECn2减指令SUBn3求补指令NEGn4带借位减指令 SBBn5比较指令 CMP1减1指令DECn语句格式:DEC OPD n功能:将目的操作数减1,结果送目的地址。即(OPD)1OPD。nDEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。n如:DEC CX。即(CX)1CX。n减1指令DEC也一般用于对计数器和地址指针的调整。n语句格式:语句格式:SUB OPDSUB OPD,OPSOPSn功功能能:目目的的操操作作数数减减源源操操作作数数,结结果果存存于于目目的的地地址址,源地址内容不变。源地址内容不变。n即(即(OPDOPD)()(OPSOPS)OPDOPDn【例例】减法运算。减法运算。nMOVMOVAX AX,5678H5678H;(;(AXAX)=5678H=5678HSUBSUBAX AX,1234H1234H;(;(AXAX)=4444H=4444HnMOVMOVBX BX,3354H3354H;(;(BXBX)=3354H=3354HSUBSUBBX BX,3340H3340H;(;(BXBX)=0014H=0014H2减指令SUBn语句格式:语句格式:NEG OPDNEG OPDn功功能能:将将目目的的操操作作数数的的每每一一位位求求反反(包包括括符符号号位位)后加后加1 1,结果送目的地址。,结果送目的地址。n即(即(OPDOPD)+1OPD+1OPD。n【例例】求补运算。求补运算。MOVMOVAXAX,0FF64H0FF64HNEGNEGALAL;(;(AXAX)=0FF9CH=0FF9CHSUBSUBALAL,9DH9DH;(;(AXAX)=0FFFFH=0FFFFHNEGNEGAXAX;(;(AXAX)=0001H=0001HDECDECALAL;(;(AXAX)=0000H=0000HNEGNEGAXAX;(;(AXAX)=0000H=0000H3求补指令NEGn语句格式:SBB OPD,OPSn功能:目的操作数减源操作数再减低位借位CF,结果送目的地址。n即(OPD)(OPS)CF OPD4带借位减指令 SBB5比较指令 CMPn语句格式:语句格式:CMP OPDCMP OPD,OPSOPSn功功能能:目目的的操操作作数数减减源源操操作作数数,结结果果只只影影响响标标志志位位,不送入目的地址。不送入目的地址。n即(即(OPDOPD)()(OPSOPS)。)。n【例例】比较比较ALAL的内容数值大小。的内容数值大小。nCMPCMPALAL,5050;(;(ALAL)5050nJBJBBELOWBELOW;(;(ALAL)50=50=50,(,(ALAL)50AL50ALnINCINCAHAH;(;(AHAH)+1AH+1AHnBELOWBELOW:乘运算指令n1无符号数乘法指令MULn2有符号乘指令IMUL1无符号数乘法指令MULn语句格式:MUL OPSn功能:若是字节数据相乘,(AL)与OPS相乘得到字数据存入AX中;若是字数据相乘,则(AX)与OPS相乘得到双字数据,高字存入DX、低字存入AX中。n即字节乘法:(AL)*(OPS)AX,字乘法:(AX)*(OPS)DX,AX n【例】无符号数0A3H与11H相乘。nMOVAL,0A3H;(AL)=0A3HnMOVBL,11H;(BL)=11HnMULBL ;(AX)=0AD3H2有符号乘指令IMULn语句格式:IMUL OPSn功能:字节乘法:(AL)*(OPS)AX,字乘法:(AX)*(OPS)DX、AX。nIMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。n【例】有符号数0B4H与11H相乘。nMOV AL,0B4H;(AL)=B4HnMOV BL,11H;(BL)=11HnIMULBL ;(AX)=0FAF4H 除运算指令n1无符号除指令DIVn2有符号除指令IDIV1无符号除指令DIVn语句格式:DIV OPSn功能:字节除法:(AX)/(OPS)AL(商)、AH(余数)字除法:(DX、AX)/(OPS)AX(商)、DX(余数)n【例】写出实现无符号数0400H/0B4H运算的程序段。MOVAX,0400H;(AX)=0400HMOVBL,0B4H;(BL)=0B4HDIVBL ;商(AL)=05H,余数(AH)=7CH n语句格式:IDIV OPSn功能:字节除法:(AX)/(OPS)AL(商)、AH(余数)字除法:(DX,AX)/(OPS)AX (商)、DX(余数)除法指令DIV和IDIV虽然对标志的影响未定义,但可产生溢出。n【例】写出实现有符号数0400H/0B4H运算的程序段。MOVAX,0400H;(AX)=0400HMOVBX,0B4H;(BX)=0B4HIDIVBX ;(AL)=0F3H,(AH)=24H2有符号除指令IDIV符号扩展指令 n1字节转换成字指令CBWn2将字转换成双字指令CWD1字节转换成字指令CBW语句格式:CBWn功能:将AL中的符号位数据扩展至AH。n【例】将字节数据扩展成字数据。MOVAL,0A5H;(AL)=0A5HCBW ;(AX)=0FFA5HADDAL,70H;(AL)=25HCBW ;(AX)=0025Hn语句格式:CWDn功能:将AX中的符号位数据扩展至DX。n【例】将字数据扩展成双字数据。MOVDX,0;(DX)=0MOVAX,0FFABH;(AX)=0FFABHCWD;(DX)=0FFFFH (AX)=0FFABH2将字转换成双字指令CWD 十进制调整指令n1压缩BCD码调整指令n2非压缩BCD码调整指令(1)加法的十进制调整指令DAA n语句格式:语句格式:DAADAAn功功能能:如如果果ALAL寄寄存存器器中中低低4 4位位大大于于9 9或或辅辅助助进进位位(AFAF)=1=1,则则(ALAL)=(ALAL)+6+6且且(AFAF)=1=1;如如果果(ALAL)=0A0H=0A0H或或(CFCF)=1=1,则则(ALAL)=(ALAL)+60H+60H且且(CFCF)=1=1。同时,。同时,SFSF、ZFZF、PFPF均有影响。均有影响。n【例例】压缩压缩BCDBCD码的加法运算。码的加法运算。MOV ALMOV AL,68H68H;(ALAL)=68H=68H,表示压缩,表示压缩BCDBCD码码6868MOV BLMOV BL,28H28H;(BLBL)=28H=28H,表示压缩,表示压缩BCDBCD码码2828ADD ALADD AL,BLBL;二进制加法:;二进制加法:(ALAL)=68H+28H=90H=68H+28H=90HDAADAA ;十进制调整:;十进制调整:(ALAL)=96H=96H ;实现压缩;实现压缩BCDBCD码加法:码加法:68+28=9668+28=96(2)减法的十进制调整指令DASn语句格式:语句格式:DASDASn功功能能:如如果果(AFAF)=1=1或或ALAL寄寄存存器器中中低低4 4位位大大于于9 9,则则(ALAL)=(ALAL)6 6且且(AFAF)=1=1;如如果果(ALAL)=0A0H=0A0H或或(CFCF)=1=1,则则(ALAL)=(ALAL)60H60H且且(CFCF)=1=1。同同时时SFSF、ZFZF、PFPF均受影响。均受影响。n【例例】压缩压缩BCDBCD码的减法运算。码的减法运算。nMOVMOVALAL,68H 68H ;(ALAL)=68H=68H,表示压缩,表示压缩BCDBCD码码6868MOVMOVBLBL,28H 28H ;(BLBL)=28H=28H,表示压缩,表示压缩BCDBCD码码2828SUBSUBALAL,BLBL ;二二进进制制减减法法:(ALAL)=68H=68H28H=40H28H=40HDASDAS ;十进制调整:;十进制调整:(ALAL)=40H=40H ;实现压缩;实现压缩BCDBCD码减法:码减法:686828=4028=402非压缩BCD码调整指令n(1)加法的非压缩BCD码调整指令AAAn(2)减法的非压缩BCD码调整指令AASn(3)乘法的非压缩BCD码调整指令AAMn(4)除法的非压缩BCD码调整指令AADn语句格式:AAA n功能:如果AL的低4位大于9或(AF)=1,则:(AL)=(AL)+6(AH)=(AH)+1(CF)=(CF)=1且AL高4位清零。否则:(CF)=(AF)=0AL高4位清零。(1)加法的非压缩BCD码调整指令AAAn语句格式:AAS n功能:如果AL的低4位大于9或(AF)=1,则:(AL)=(AL)6(AH)=(AH)1(AF)=(CF)=1AL高4位清零。否则:(CF)=(AF)=0 AL高4位清零。其他标志位OF、PF、SF、ZF不确定。(2)减法的非压缩BCD码调整指令AASn语句格式:AAM n功能:被调整的乘积在AX中,对AL按10取模,则:(AL)0AHAH(商):AL(余数)其中AH为商,AL为余数,标志位AF、CF、OF、PF、SF、ZF受影响。(3)乘法的非压缩BCD码调整指令AAM语句格式:AAD n功能:除法运算前,先调整被除数AX内容,使:(AL)=(AL)+(AH)*0AH (AH)=0即把非压缩型十进制数变成二进制数。(4)除法的非压缩BCD码调整指令AAD逻辑运算和位操作类指令逻辑运算指令n1求反指令NOTn2逻辑乘指令ANDn3测试指令TESTn4逻辑加指令ORn5按位加指令XORn语句格式:语句格式:NOT OPDNOT OPDn功能:将目的地址中的内容逐位取反后送入目的地址。功能:将目的地址中的内容逐位取反后送入目的地址。即(即(OPDOPD)求反)求反OPD OPD 【例例】逻辑非运算。逻辑非运算。MOVMOVAXAX,878AH878AH;(AXAX)=878AH=878AHNOTNOTAXAX ;(AXAX)=7875H=7875H1求反指令NOTn语句格式:语句格式:AND OPDAND OPD,OPSOPSn功功能能:将将目目的的操操作作数数和和源源操操作作数数进进行行逻逻辑辑乘乘运运算算,结结果存目的地址。果存目的地址。即(即(OPDOPD)(OPSOPS)OPDOPD。该该指指令令用用于于清清除除目目的的操操作作数数中中与与源源操操作作数数置置0 0的的对对应应位位。说说明明:逻逻辑辑乘乘的的运运算算法法则则为为:11=111=1,10=010=0,01=001=0,00=000=0【例例】将将ALAL中第中第3 3位和第位和第7 7位清零。位清零。MOVMOVALAL,0FFH 0FFH ANDANDALAL,77H 77H 2逻辑乘指令ANDn语句格式:语句格式:TEST OPDTEST OPD,OPSOPS功功能能:源源地地址址和和目目的的地地址址的的内内容容执执行行按按位位的的逻逻辑辑乘乘运运算,结果不送入目的地址。算,结果不送入目的地址。即(即(OPDOPD)(OPSOPS)。)。【例例】测试测试AXAX中的第中的第1212位是否为位是否为0 0,不为,不为0 0则转则转L L。TESTTEST AX AX,1000H1000HJNEJNE L L 3测试指令TESTn语句格式:语句格式:OR OPDOR OPD,OPSOPS功功能能:将将目目的的操操作作数数和和源源操操作作数数进进行行逻逻辑辑加加运运算算,结结果果存存目的地址。目的地址。即(即(OPDOPD)(OPSOPS)OPDOPD。说说明明:逻逻辑辑加加的的运运算算法法则则为为:1 11=11=1,1 10=10=1,0 01=11=1,0 00=00=0。【例例】将将ALAL寄存器中第寄存器中第3 3位和第位和第7 7位置位置1 1。MOVMOVALAL,0 0 OR OR ALAL,88H88H 4逻辑加指令ORn语句格式:XOR OPD,OPS功能:目的操作数与源操作数做按位加运算,结果送入目的地址。即(OPD)(OPS)OPD。说明:按位加的运算法则为;11=0,10=1,01=1,00=0。【例】按位加运算。MOVAL,45H;(AL)=45HXORAL,31H;(AL)=74H5按位加指令XOR移位指令 n移移位位指指令令包包括括算算术术移移位位指指令令、逻逻辑辑移移位位指指令令和和循循环环移移位位指指令令,分分别别进行左移和右移操作。这些指令均有统一的语句格式:进行左移和右移操作。这些指令均有统一的语句格式:SAL/SHL OPD,OPS ;SAL/SHL OPD,OPS ;左移左移SAR OPD,OPS ;SAR OPD,OPS ;算术右移算术右移 SHR OPD,OPS ;SHR OPD,OPS ;逻辑右移逻辑右移其其中中,OPD,OPD是是8/16/328/16/32位位的的R/M;OPSR/M;OPS是是计计数数值值(即即移移位位次次数数),),有有三三种种情情形形:OPS:OPS即可是即可是8 8位的立即数或位的立即数或CLCL的内容的内容(移位前次数移位前次数-CL)-CL)。其其功功能能为为将将目目的的操操作作数数的的所所有有位位按按操操作作符符规规定定的的方方式式移移动动1 1位位或或按按寄寄存存器器CLCL规规定定的的次次数数(02550255)移移动动,结结果果送送入入目目的的地地址址。目目的的操操作作数数是是8 8位(或位(或1616位)的寄存器数据或存储器数据。位)的寄存器数据或存储器数据。语句格式:SAL OPD,1 或SHL OPD,1 SAL OPD,CL或SHL OPD,CL功能:将(OPD)向左移动CL指定的次数,最低位补入相应的,的内容为最后移入位的值。1算术左移和逻辑左移指令SAL(SHL)语句格式:SAR OPD,1或SAR OPD,CLnCF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。2算术右移指令SARMOVBH,0F4H;(BH)=0F4HMOVCL,2;(CL)=2SARBH,CL;(BH)=0FDH,(CF)=0该例语句“SAR BH,CL”实际上完成了(BH)BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)。【例】算术右移运算n语句格式:SHR OPD,1或SHR OPD,CLn功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的,CF的内容为最后移入位的值。3逻辑右移指令SHRn语句格式:ROL OPD,1或ROL LPD,CLn功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。4循环左移指令ROLn语句格式:ROR OPD,1或ROR OPD,CLn功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。5循环右移指令RORn语句格式:RCL OPD,1或RCL OPD,CLn功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。6带进位的循环左移指令RCLn语句格式:RCR OPD,1或RCR OD,CLn功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。7带进位的循环右移指令RCR串操作类指令n串操作指令:数据传送类指令每次只能传送一个数据,若要传送大批数据就需要重复编程,这样就浪费了大量的时间和空间。为此8086提供了一组处理主存中连续存放数据串的指令,这就是串操作指令。下图流程图总结了串操作的过程 串操作流程图串操作流程图n语句格式:MOVSB字节串传送 MOVSW字串传送功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。即:(DS:SI)ES:DI。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。1传送指令MOVSn语句格式:CMPSB字节串比较 CMPSW字串比较功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。即:(SI)(DI)。修改串指针,使之指向串中的下一个元素。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。2串比较指令CMPS n语句格式:SCASB字节串搜索 SCASW字串搜索功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存,即:字节操作:(AL)(DI),字操作:(AX)(DI)。修改指针使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。3串搜索指令SCASn语句格式:LODSB从字节串中取数 LODSW从字串中取数功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。即:字节操作:(SI)AL,字操作:(SI)AX。修改指针SI,使它指向串中的下一个元素。当DF=0时,(SI)增量。当DF=1时,(SI)减量。4从源串中取数指令LODSn语句格式:STOSB往字节串中存数(2)STOSW往字串中存数功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。即:字节操作:(AL)DI,字操作:(AX)DI。修改指针DI,使之指向串中的下一个元素。当DF=0时,(DI)增量)。当DF=1时,(DI)减量。5往目的串中存数指令STOSn(1 1)REP REP REPREP前缀用在前缀用在MOVSMOVS、STOS STOS、LODSLODS指令前。指令前。功能:每执行一次串指令(功能:每执行一次串指令(CXCX)1 1,直到(,直到(CXCX)=0=0,重复执行结束。,重复执行结束。n(2 2)REPZ REPZ 该指令一般用在该指令一般用在CMPCMP、SCASSCAS指令前。指令前。功功能能:每每执执行行一一次次串串指指令令(CXCX)1 1,并并判判断断ZFZF标标志志是是否否为为0 0,只只要要(CXCX)=0=0或或ZF=0ZF=0,则重复执行结束。,则重复执行结束。n(3 3)REPNZ REPNZ 该指令一般用在该指令一般用在CMPSCMPS、SCAS SCAS 指令前。指令前。功功能能:每每执执行行一一次次串串指指令令(CXCX)1 1,并并判判断断ZFZF标标志志是是否否为为0 0,只只要要(CXCX)=0=0或或ZF=1ZF=1,则重复执行结束。,则重复执行结束。6 6重复前缀指令重复前缀指令REP REPZ REPNZREP REPZ REPNZ控制转移类指令n条件转移指令n无条件转移指令n循环指令 n子程序调用指令n中断指令条件转移指令n1简单条件转移指令n2无符号数条件转移指令n3.有符号数条件转移指令 n语句格式:操作符 短标号功能:如果条件满足,则(IP)位移量IP。1简单条件转移指令2无符号数条件转移指令n【例】比较无符号数大小,将较大的数存放AX寄存器nCMP AX,BX ;(AX)(BX)JNBNEXT ;若AX=BX,转移到NEXTXCHG AX,BX ;若AX=BX,转移到NEXTXCHG AX,BX;若AXAL(出口参数);如果检测到读入的字符是CtrlBreak,则中止程序执行。例:nMOV AH,01H n键盘输入子程序,功能1-AH INT 21H DOS子程序调用,等待键入一个字符调用后,输入字符的ASCII码值-AL2、显示输出一个字符AH=02Hn将DL寄存器的字符(ASCII码值)送到标准输出设备上输出。若检测到CtrlBreak间,则执行中断“INT 23H”中止程序的执行。例:nMOV DL,AL;AL内容是字符的ASCII码-DL MOV AH,2 ;功能号2-AH INT 21H ;调用显示一个字符3.打印机输出一个字符AH=05Hn将要打印的字符DL,然后调用就可以打印输出。如果有标准打印设备不输出,可在执行时用DOS命令键CtrlBreak进行帮助。例:nMOV DL,AL;AL的字符ASCII码-DL MOV AH,5 ;功能号5-AH INT 21H ;调用打印一个字符4、直接控制台输入AH=07Hn输入时不回显,例如,从键盘输入一个字符,在屏幕上不显示,出口参数AL键入的字符。可用来设置保密口令。例:PASSWORD DB 10DUP(0).MOV CX,6 MOV SI,0 AGAIN:MOV AH,7 INT 21H MOV PASSWORDSI,AL INC SI LOOP AGAIN5、显示输出字符串AH=09H例:执行下语句后屏幕显示输出“WELCOME!”STRING DB WELCOME!,13,10,$MOV AX,SEG STRING MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H6、缓冲区键盘输入AH=0AHn如果需要键入最大的字符数位N,则由“DS:DX”指向的缓冲区可分为3个字段。n第一个字段:定义缓冲区可存放的字符数N+1,使机器自动控制检查,若键入实际的字符数个数超过N,则响铃报警。n第二个字段:定义缓冲区,当键盘输入调用退出后,系统自动计数并存放实际输入的字符。n第三个字段:定义可存放字符的缓冲区,调用退出后,存放实际输入的字符,最后一个字节总是回车符。0AH调用示例n例:编写在实地址方式(.586与USE16)下,定义一个能最多可输入20个字符到BUF缓冲区的程序。.586STACK SEGMENT USE16 ;定义16位段 DB 256 DUP(0)STACK ENDSDATAS SEGMENT USE16N EQU 20BUF DB N+1 ;定义第一个字段,BUF位21COUNT DB 0 ;定义第二个字段CHAR DB N+1 DUP(0);定义第三个字段PROMPT DB Please input:,13,10,$DATAS ENDS0AH调用示例(续)CODES SEGMENT USE16 ASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS MOV DS,AX LEA DX,prompt ;取prompt的偏移地址dx MOV AH,9 INT 21H LEA DX,BUF ;取BUF的偏移地址dx MOV AH,0AH INT 21H MOV AH,4CH INT 21HCODES ENDS END START7、返回DOS调用AH=4CHn功能:返回DOSn入口参数:AH=4CH,AL=返回码n出口参数:2 2 循环次数未知的循环程序设计循环次数未知的循环程序设计 例例5.14 设设STR字字符符串串是是以以0结结尾尾。试试编编写写一一个个把把字字符符串串中中的的所所有有大写字母改为小写字母大写字母改为小写字母的程序,并将转换后的字符串显示输出。的程序,并将转换后的字符串显示输出。由由于于字字符符串串是是以以0 0结结尾尾的的,所所以以字字符符串串的的长长度度是是一一个个未未知知数数,它它的的循循环环次次数数是是不不确确定定,需需根根据据字字符符串串尾尾这这个个条条件件来来控控制制程程序序的的循循环。环。如如果果是是大大写写字字母母,需需将将对对应应字字母母的的ASCIIASCII码码加加20H20H;如如果果是是其其他他字字符,则其字符保持不变。编写的程序清单如下:符,则其字符保持不变。编写的程序清单如下:DATADATA SEGMENT SEGMENTSTRSTR DB DB HOW arE YoUHOW arE YoU!,0 0;假设的字符串;假设的字符串DATADATA ENDS ENDSCODECODE SEGMENT SEGMENT ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA 例例5.145.14 START:MOV AX,DATA MOV DS,AX MOVSI,OFFSET STRAGAIN:MOV DL,SI ;取一字符;取一字符 OR DL,DL ;是否到字符串尾?;是否到字符串尾?JZ OK ;到字符串尾,转;到字符串尾,转OK CMP DL,A ;否则判是否为大写字母;否则判是否为大写字母 JBNEXT ;否,转继续;否,转继续 CMP DL,Z JA NEXT ;否,转继续;否,转继续 ADD DL,20H;是则改大写字母为小写字母;是则改大写字母为小写字母 MOV SI,DL ;送回到字符串中;送回到字符串中 例例5.145.14 NEXT:MOVAH,2 INT21H INC SI;调整指针;调整指针 JMP AGAIN;继续;继续OK:MOV AH,4CH INT 21HCODE ENDS END START
展开阅读全文