【文档说明】[计算机软件及应用]汇编语言课件.ppt,共(42)页,225.468 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2092.html
以下为本文档部分文字说明:
⚫串的基本概念顺序存放在内存中的一组数据,称为串。用串的首(末)地址、元素类型、串的长度表示。1234:0000stringDS:BX‘A’‘B’‘C’‘D’‘’‘E’、、、‘Y’‘Z’1122331a2b3c4d3.3.4串处理指令•MOVS串传送指令•STOS存入串指令•LOD
S从串取指令•CMPS串比较指令•SCAS串扫描指令•INS串输入指令•OUTS串输出指令配合使用的前缀有:REP重复REPE/REPZ相等/为零则重复REPNE/REPNZ不相等/不为零则重复1、与REP配合工作的MOVS/STOS/LODS/INS/
OUTS格式:REPMOVS/STOS/LODS/INS/OUTS执行操作:(1)如(CX)=0则退出REP,否则转(2)(2)(CX)(CX)-1(3)执行MOVS/STOS/LODS/INS/OUTS(4)重复
(1)~(3)MOVS串传送指令格式:MOVSDST,SRC须指明传送的是字节、字、双字MOVSB(字节)MOVSW(字)MOVSD(双字)(386后)例:MOVSES:BYTEPTR[DI],DS:[SI]低地址高地址DSES(SI)→
(DI)执行操作:(1)((DI))←((SI))(2)字节操作:(SI)←(SI)±1,(DI)←(DI)±1字操作:(SI)←(SI)±2,(DI)←(DI)±2方向标志DF=0时用+,DF=1时用-。执行REPMOVS之前,应先做好:(1
)首地址(末地址)→SI(2)目的串首地址(末地址)→DI(3)串长度→CX(4)建立方向标志(CLD使DF=0,STD使DF=1)注意:源串默认在数据段中,目的串必须在附加段中,但源串可以使用段跨越前缀来修改例datareasegmentmess1db‘personal_c
omputer’datareaendsextrasegmentmess2db17dup(?)extraendscodesegment…(ES,DS装填)leasi,mess1leadi,mess2movcx,17cldrepmovsb…code
endsleasi,mess1+16leadi,mess2+16movcx,17stdrepmovsbSTOS存入串指令STOSDST(例:STOSES:BYTEPTR[DI])STOSB(字节)STO
SW(字)执行操作:字节操作:((DI))←(AL),(DI)←(DI)±1字操作:((DI))←(AX),(DI)←(DI)±2例:把附加段中的5个字节缓冲区mess2置为20Hleadi,mess2moval,
20Hmovcx,5cldrepstosb自学:LODS从串取指令INS串输入指令OUTS串输出指令与REPE/REPZ和REPNE/REPNZ配合工作的CMPS和SCAS格式:REPE/REPZ(REPNE/REPNZ)CM
PS/SCAS执行操作:(1)如(CX)=0或ZF=0(ZF=1)则退出,否则转(2)(2)(CX)←(CX)-1(3)执行CMPS/SCAS(4)重复(1)~(3)CMPS串比较指令CMPSSRC,DSTCMPSB(字节)CMPSW(字)执行操作:(1)((SI))-((DI))根据比较结
果设置条件标志位:相等ZF=1不等ZF=0(2)字节操作:(SI)←(SI)±1,(DI)←(DI)±1字操作:(SI)←(SI)±2,(DI)←(DI)±2SCAS串扫描指令SCASDSTSCASB(字节)SCASW(字)执行操作:字节操作:(AL)-((DI)),(DI)←(
DI)±1字操作:(AX)-((DI)),(DI)←(DI)±2CMPS/SCAS与REPE/REPZ和REPNE/REPNZ配合用于比较两个数据串,或从一个字符串中查找一个指定的字符例:从一个字符串中查找一个指定的
字符messdb‘COMPUTER’leadi,messmoval,‘T’movcx,8cldrepnescasb(DI):相匹配字符的下一个地址(CX):剩下还未比较的字符个数COMPUTER(di)→COMPUTER(di)→例比较两个字符串,
都是8个元素,找出它们不相匹配的位置leasi,mess1leadi,mess2movcx,8cldrepecmpsb无条件转移指令JMP格式:JMP标号段内直接短转移JMPSHORTOPR执行操作:(IP)←(IP)+8位位移量(-128~127)例:…...JMPSHORTHELLO……
HELLO:MOVAL,33.3.5控制转移指令段内直接近转移JMPNEARPTROPR执行操作:(IP)←(IP)+16位位移量段内间接转移JMPWORDPTROPR执行操作:(IP)←(EA)段间直
接转移JMPFARPTROPR执行操作:(IP)←OPR的段内偏移地址(CS)←OPR所在段的段地址段间间接转移JMPDWORDPTROPR执行操作:(IP)←(EA)(CS)←(EA+2)条件转移
指令条件转移指令根据上一条指令所设置的条件码来判断测试条件,满足测试条件则转移到由指令指定的转向地址去执行那里的程序;如果不满足条件则执行下一条指令。8086中的条件转移只可以使用短转移,即只能使用段内直接寻址的8位位移量(-128~127)所有的条件转移指令都不
影响条件码根据单个条件标志的设置情况转移格式测试条件JZ(JE)OPRZF=1JNZ(JNE)OPRZF=0JSOPRSF=1JNSOPRSF=0JOOPROF=1JNOOPROF=0JP(JPE)OPRPF=1JNP(JPO)OPRPF=
0JCOPRCF=0JNCOPRCF=1比较两个无符号数,并根据比较结果转移*格式<JB(JNAE,JC)OPR≥JNB(JAE,JNC)OPR≤JBE(JNA)OPR>JNBE(JA)OPR比较两个带符号数,并根据比较结果转移*格式<JL(JNGE)O
PR≥JNL(JGE)OPR≤JLE(JNG)OPR>JNLE(JG)OPR测试CX的值为0则转移格式测试条件JCXZOPR(CX)=0例3.76X>50,转到TOO_HIGH;计算X-Y,溢出转到OVERFLOW,否则|X-Y|→RESULTMOVAX,XCMPAX,50JNLETOO_H
IGHSUBAX,YJOOVERFLOWJNSNONNEGNEGAXNONNEG:MOVRESULT,AX…TOO_HIGH:……OVERFLOW:……例3.77、是双精度数,分别存于DX,AX及BX,CX中,>
时转X,否则转Y。CMPDX,BXJNLEXJLYCMPAX,CXJNBEXY:…...X:…...循环指令注意:*CX中存放循环次数*只能使用段内直接寻址的8位位移量(-128~127)LOOPLOOPZ/LOOPELOOPNZ/LOOPNE执行步骤:(1)(CX)←(
CX)-1(2)检查是否满足测试条件,如满足则(IP)←(IP)+8位位移量,实行循环;不满足则IP不变,退出循环。循环指令:LOOPOPR测试条件:(CX)0为零或相等时循环指令:LOOPZ(LOOPE)OPR测试条件:ZF=1且(CX)0不为零或不
相等时循环指令:LOOPNZ(LOOPNE)OPR测试条件:ZF=0且(CX)0MOVCX,N……AGAIN:………………DECCXJNZAGAINMOVCX,N……AGAIN:………………LOOPAGAIN循环的条件转移指令实现方法循环的循环指令实现方法例:在
多重循环的程序结构中,CX计数器的保存和恢复MOVCX,MAGAIN:……PUSHCXMOVCX,NNEXT:……LOOPNEXT……POPCXLOOPAGAINMOVDI,MAGAIN:……MOVCX,NNEXT:……LOOPNEXT……DECDIJNZ
AGAIN子程序调用和返回指令codesegmentmainprocfar……callsub……retmainendpsubprocnear……retsubendpcodeends段内调用和返回code1segmentm
ainprocfar……callsub……retmainendpcode1endscode2segmentsubprocfar……retsubendpcode2ends段间调用和返回CALL调用指令(以16位为例)段内直接近调用:CAL
LDST执行操作:PUSH(IP)(IP)←(IP)+16位位移量例:CALLSUB段内间接近调用:CALLDST执行操作:PUSH(IP)(IP)←(EA)例:CALLBXCALLWORDPTR[3000H]段间直接远调用:CALLDST执行操作:PUSH(CS)PUSH(IP)(I
P)←DST偏移地址(CS)←DST段地址例:CALLSUB_NAME段间间接远调用:CALLDST执行操作:PUSH(CS)PUSH(IP)(IP)←(EA)(CS)←(EA+2)例:CALLDWORDPTR[BX]RET返回指令段内近
返回:RET执行操作:(IP)POP()段内带立即数近返回:RETEXP执行操作:(IP)POP()(SP)←(SP)+D16(由EXP计算得到)带立即数用于调用程序调用子程序时的参数传递段间远返回:RET执行操作:(IP)←POP()(CS)←POP()段间带立即数远返回:R
ETEXP执行操作:(IP)←POP()(CS)←POP()(SP)←(SP)+D16(由EXP计算得到)(AX)(BX)(CX)(SP)→(IP)例:带立即数返回codesegmentmainprocfa
r……pushaxpushbxpushcxcallsub……retmainendpsubprocnear……ret6subendpcodeends(SP)→堆栈段(SP)→中断指令1、什么是中断?2、什么是中断例行程序?3、CPU响应一次中断的过
程是怎样的?4、什么是中断向量?中断例行程序的入口地址当系统运行或程序运行期间在遇到某些特殊情况时,需要计算机自动执行的一组专门的例行程序进行处理。中断时所执行的这组程序类似与子程序的调用,只不过多了保护FLAGS中断向量:中断例行程序的入口地址,存放于中断向量区。类型0的(I
P)类型0的(CS)类型1的(IP)类型1的(CS)类型N的(IP)类型N的(CS)类型255的(IP)类型255的(CS)00000000044*N003FC类型0类型1类型N类型255中断向量区中断指令:INTTYPE或INT(隐含的类型号为3)执行操作:PUSH(FLAG
S)IF0TF0AC0PUSH(CS)PUSH(IP)(IP)←(TYPE*4)(CS)←(TYPE*4+2)溢出中断指令:INTO执行操作:若OF=1,(IP)←(10H)(CS)←(12H)从中断返回指令:IRETIRET执行操作:(IP)POP()(CS)POP()(FL
AGS)POP()注意:*TYPE(0~255)是中断类型号。*INT(INTO)指令执行完,把IF和TF置0,但不影响其它标志位。*IRET指令执行完,标志位由堆栈中取出的值确定。3.3.6处理机控制指令1、标志处理指令:CLCCF←0CMCCF←CFSTCCF
←1CLDDF←0STDDF←1CLIIF←0STIIF←1注意:*只影响本指令指定的标志进位位置0进位位置取反进位位置1方向标志置0方向标志置1中断标志置0中断标志置12、其他处理机控制指令:NOP无操作(机器码占一个字节)HLT
暂停机(次外中断,之后继续执行程)ESC换码WAIT等待(等待外中断,之后仍继续等待)LOCK封锁BOUND界限ENTER建立堆栈帧LEAVE释放堆栈帧注意:*不影响条件标志空操作指令NOP格式NOP指令不执行任何操
作movBX,[100]00B801073AcmpAL,[BX]B8FE11movBX,[100]00B8019090cmpAL,[BX]903A07nopnopnopmovCX,20HB92000例:也可用NOP指令进行短延时(教
材中的一些例子用到)其机器码占一个字节单元,在调试程序时,修改程序用。作业:P107-1163,12,18,22,37