您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 汇编,ASM,MASM,计算机,编程第3章
3.380x86的指令系统80x86的指令系统中共有136种基本指令,可以分成6个功能组:数据传送(Datatransfer)25算术运算(Arithmetic)21逻辑运算和移位指令(Logic&Shift)21串处理(Stringmanipulation)7控制转移(ControlTransfer)47处理机控制(ProcessorControl)15先介绍以下内容:1.学习指令的要点2.指令中操作数的表示3.书写指令注意事项1.学习指令的要点从以下几个方面来掌握一条指令:指令的助记符指令的格式:操作数的个数、类型(B,W,DW)执行的操作:指令执行后的结果包括:哪些寄存器、内存单元的值发生了变化对标志位有无影响,哪些受影响特点及注意事项只介绍常用的指令,其他需要时可自学。D:\DEBUG-A;汇编指令0AF8:0100MOVAL,B50AF8:0102ADDAL,8F0AF8:0104-R;显示指令执行前各寄存器的值AX=0000BX=0000CX=0000DX=0000、、、、、、CS=0AF8IP=0100NVUPEIPLNZNAPONC-T=1002;执行指令,查看结果AX=0044BX=0000CX=0000DX=0000、、、、、、CS=0AF8IP=0104OVUPEIPLNZACPECY0AF8:01042080FC01AND[BX+SI+01FC],AL-10110101+10001111进位111111101000100编程完成B5h+8Fh=?学习加法ADD指令及其对状态标志位的影响。3.利用DEBUG学习指令系统(示例)2.指令中操作数的表示符号表示内容data立即数操作数reg通用寄存器操作数8位:AH、AL、BH、BL、CH、CL、DH、DL16位:AX、BX、CX、DX、BP、SP、SI、DIsegreg段寄存器CS、DS、SS、ESmem或[]存储器操作数(5种寻址方式)src源操作数dst目的操作数()注释时表示寄存器、存储器、端口的内容oprd1oprd2两操作数3.书写指令注意事项:不区分字母的大小写。下列写法表示同一条指令:MOVAX,1ABDHmovax,1abdh不添加指令系统没有的指令,即不自创助记符。将MOVAL,0写成MOVEAL,0JMPlable写成JUMPlable注意操作数的范围对字节操作指令0~FFH0~255对字操作指令0~FFFFH0~65535MOVAL,260MOVAX,70000MOVAL,1FFHMOVAL,2ABCDH对无操作数指令,不添加操作数。STCAL对单操作数指令,操作数不能是立即数。IMUL6对双操作数指令①不能两个同为存储器操作数MOV[DI],[SI]②目的操作数不能是立即数ADD3,AL③两个操作数的类型应相同SUBAX,BL若value定义为字类型存储器变量:MOVCL,value[BX]内存操作数的属性应明确。MOV[BX],0MOVbyteptr[BX],0MOVwordptr[BX],0MOV[BX],ALMOV[BX],AXA、B、C、D、E、F开头的十六进制数前面加0,与H结尾的标识符区别。如寄存器名:AH、BH、CH、DH变量名:abcdH等例movAL,0AHmovAL,AHmovBX,0abcdHCS和IP的值只在控制转移指令中修改。对非控制转移指令,取完指令后IP值自动指向下条指令。段寄存器CS的值,只在MOV、PUSH中可作操作数,且这两条指令执行结果不改变CS值。MOVAX,CSPUSHCSIP、PSW两个寄存器不作为操作数在指令中出现。movIP,1234HmovPSW,0F0FHPSW状态寄存器的值由指令执行后确定,不同的指令对各标志的影响不同。▲数据传送是最基本、最重要的一种操作实际程序中,使用的比例最高changePROCLEASI,num+2MOVCL,num+1MOVCH,0MOVAX,0MOVDI,10next:MULDIMOVBH,0MOVBL,[SI]ANDBL,0FHADDAX,BXINCSILOOPnextzero:MOVBX,AXRETchangeENDP汇编子程例:寄存器寄存器寄存器内存单元寄存器I/O端口设置寄存器、内存单元的初始值3.3.1数据传送指令▲按传送内容,可分为四类:通用数据传送指令累加器专用传送指令地址传送指令标志寄存器传送指令▲特点:1.除POPF/FD、SAHF外,其他传送指令对标志位均无影响2.唯一允许以段寄存器做操作数的指令且只有MOV、PUSH、POP这三条允许1.通用传送指令(8)MOVMOVSXMOVZXPUSHPOPPUSHA/PUSHADPOPA/POPADXCHG传送带符号扩展传送带零扩展传送进栈出栈所有寄存器进栈所有寄存器出栈交换(1)MOV传送指令格式MOVDST,SRC执行(DST)←(SRC)reg/mem/segreg←regreg/segreg←memreg/mem←segregreg/mem←data可实现例:①reg/mem/segreg←reg通用寄存器/存储器/段寄存器←通用寄存器MOVAL,BLMOV[BX],ALMOVDS,AX②reg/segreg←mem通用寄存器/段寄存器←存储器MOVAL,[BX]MOVDS,[BX+SI]③reg/mem←segreg通用寄存器/存储器←段寄存器MOVBX,CSMOV[BX],DS④reg/mem←data通用寄存器/存储器←立即数MOVAl,9MOVBX,OFFSETbufferMOVBYTEPTR[value],0MOVWORDPTR[BX],1MOV指令特点及注意事项:双操作数指令(注意双操作指令的特点)可进行字节或字传送不允许存储器传送到存储器MOV[BX],valueMOV[DI],[SI]MOVAX,valueMOV[BX],AXMOVAL,[SI]MOV[DI],AL可对DS、ES、SS赋值但不允许立即数直接传送给段寄存器MOVDS,AXMOVES,[BX]MOVDS,1000HMOVAX,1000HMOVDS,AXCS不能做目的操作数,不能通过传送指令改变CS的值MOVCS,AX不允许段寄存器传送到段寄存器MOVES,DSMOVAX,DSMOVES,AXD:\MASMDEBUG-A1693:0100MOVES,DS^Error1693:0100MOVAX,DS1693:0102MOVES,AX1693:0104-例编程将CL寄存器的内容传送到200:100H单元中。MOVAX,200HMOVDS,AX;(DS)=200HMOV[100H],CL;(02100H)=(CL)编程1:MOVAX,200HMOVDS,AX;(DS)=200HMOVDI,100H;(DI)=100HMOV[DI],CL;(02100H)=(CL)编程2:MOV[200:100H],CLMOVSX带符号扩展传送MOVZX带零扩展传送格式:MOVSX/MOVZXDST,SRC执行的操作:(DST)符号扩展(SRC)例:MOVSXEAX,CLMOVSXEDX,[EDI]MOVZXDX,ALMOVZXEAX,[EDI]注意:1.目的操作数必须是16位或32位寄存器2.源操作数的长度一定要小于目的操作数3.MOVSX的源操作数应是有符号数,而MOVZX的源操作数应是无符号数什么是堆栈,为什么需要堆栈堆栈是按照先进后出原则组织的一段内存区域存在于堆栈段中,SP在任何时候都指向栈顶。通常用于存放一些重要数据,如:程序的地址、或是需要恢复的数据。为方便数据的存放和恢复,设置专门的指针,指向堆栈中要操作的单元。段值由SS给出,偏移地址由SP给出SS→堆栈段寄存器(stacksegment)SP→堆栈指针寄存器(stackpoint)堆栈:“先进后出”的存储区,堆栈使用的场合用堆栈保存恢复信息子程序的调用、返回以及中断调用、返回用堆栈传送数据(程序设计中介绍)注意事项堆栈是一重要数据结构,使用堆栈应有明确目的。不乱用堆栈操作,不乱修改堆栈内容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET乱修改SS和SP的内容包括乱用BP参与的存储器操作数乱用指令进栈指令:PUSHSRC执行操作:(SP)(SP)-2((SP)+1,(SP))(SRC)把一个字从源操作数(src)由SP指向堆栈顶部。特点:单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:CS,DS,ES,SSmem:字类型例:假设(AX)=2107H,执行PUSHAX(SP)低地址高地址(SP)07H21H低地址高地址进栈方向********PUSHAX执行前PUSHAX执行后出栈指令:POPDST执行操作:(DST)(SP)+1,(SP))(SP)(SP)+2把现行SP所指向堆栈顶部的一个字指定的目的操作数(dest),同时进行修改堆栈指针的操作。特点:单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:DS,ES,SS,不允许是CSmem:字类型例:POPBX(SP)低地址高地址(SP)07H21H低地址高地址出栈方向07H21H(BX)=2107HPOPBX执行前POPBX执行后********PUSHA/PUSHADPOPA/POPAD所有16位/32位寄存器进栈所有16位/32位寄存器出栈执行操作进栈顺序AX,CX,DX,BX,SP,BP,SI,DIEAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI(SP)←(SP)-16(32)出栈顺序DI,SI,BP,SP,BX,DX,CX,AXEDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX(SP)←(SP)+16(32)交换指令:XCHGOPR1,OPR2执行操作:(OPR1)(OPR2)例:XCHGBX,[BP+SI]XCHGAL,BH注意:*可进行字或字节操作,不影响标志位*不允许对立即数、段寄存器做操作数XCHGAX,4XCHGBX,DS输入指令(I/OCPU)长格式:INAL,PORT(字节)INAX,PORT(字)INEAX,PORT(双字)累加器专用传送指令(只限使用AX或AL)执行操作:(AL)(PORT)(字节)(AX)(PORT+1,PORT)(字)(AX)(PORT+3,PORT+2,PORT+1,PORT)(双字)短格式:INAL,DX(字节)INAX,DX(字)INEAX,DX(双字)执行操作:(AL)((DX))(字节)(AX)((DX)+1,(DX))(字)(AX)((DX)+3,(DX)+2,(DX)+1,(DX))(双字)长格式:OUTPORT,AL(字节)OUTPORT,AX(字)OUTPORT,EAX(双字)执行操作:(PORT)(AL)(字节)(PORT+1,PORT)(AX)(字)(PORT+3,PORT+2,PORT+1,PORT)(EAX)(双字)输出指令(CPUI/O)短格式:OUTDX,AL(字节)OUTDX,AX(字)OUTDX,EAX(双字)执行操作:((DX))(AL)(字节)((DX)+1,(DX))(AX)(字)((DX)+3,(DX)+2,(DX)+1,(DX))(AX)(双字)注意:*不影响标志位*前256个端口号00H~FFH可直接在指令中指定(长格式)*如果端口号256,端口号DX(短格式)例:INAX,28H;MOVDX,28H;INAX,DXMOVDATA_WORD,AX例:MOVDX,3FCHINAX,DX例:OUT5,AL例:测试某状态寄存器(端口号27H)的第2位是否为1INAL,27HTESTAL,00000100BJNZER
本文标题:汇编,ASM,MASM,计算机,编程第3章
链接地址:https://www.777doc.com/doc-3585657 .html