下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 IBM-PC汇编语言程序设计

IBM-PC汇编语言程序设计.pdf

IBM-PC汇编语言程序设计

天堂鸟375
2009-08-06 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《IBM-PC汇编语言程序设计pdf》,可适用于IT/计算机领域

IBMPC汇编语言程序设计参考书目:沈美明温冬婵《IBMPC汇编语言程序设计》清华大学出版社。第章基础知识二进制数、十进制数和十六进制数ASCII码和BCD码二进制数、十进制数和十六进制数‡二进制数和十进制数之间的转换–二进制数转换为十进制数‡例:B==D–十进制数转换为二进制数‡降幂法(…,,,,,,,,,,,,…)例如:D===B‡除法例如:N=DD:=======D:*=*=*=*=结果:N=D=B‡十六进制数与二进制数的转换–例:B=,,,=BFHACH=,,,=B‡十六进制数与十进制数的转换–例:BFCH=××××=D–十进制转换为十六进制‡降幂法例:D=×××=××××=BFCH‡除法例:D====(C)(F)(B)结果:D=BFCHNULBELLFAFFCCRDSP!”#$’()*AB,C-DEF:AB<C=D>EFABCDEFGHIJAKBLCMDNEOFPQRSTUVWXYZABCD↑E←FabcdefghijAkBlCmDnEoFpqrstuvwxyzA{B|C}D~EASCII码和BCD码‡ASCII码–计算机处理的信息除数字外还有字符和字符串等计算机中字符一般采用美国信息交换标准代码ASCII码来表示。–特点:用byte表示一个字符其中低b为字符的ASCII值最高位D=。(’’~’’:~H‘A’~’Z’:~AH‘a’~’z’:~AH)‡BCD码–BCD码指用二进制编码表示的十进制数(用bb二进制数来表示一个十进制数)。又称为二-十进制数或码。–表示:–类型:‡在IBMPC机中表示十进制数的BCD码可以用压缩的BCD码和非压缩的BCD码两种格式来表示。压缩BCD码:用b二进制数表示个十进制数。非压缩BCD码:用b二进制数表示个十进制数(高b无定义低b是以的BCD码)。‡例如:Duuuuuuuuuuuuuuuu‡‘’~‘’的ASCII码为非压缩的BCD码:高b为低b为码。十进制数码BCD码第章寻址方式和指令系统‡汇编语言指令由操作码和操作数构成格式:【标号:】操作码【目的操作数】【,源操作数】【注释】–说明:‡标号:字母开头的字母和数字构成的字符串具有唯一性。用于确定程序中特定位置。‡操作码:指示计算机所要执行的操作必不可少。‡目的源操作数:指令执行过程中所需要的操作数。不同的操作码所对应的操作数数目会不同(个个个)‡注释:从“”起到回车符之前均为注释对程序起解释作用。–例如:MOVCX,循环次数MOVAX,AGAIN:DECAXPUSHAXLOOPAGAIN…寻址方式‡汇编语言指令中用到的操作数可能是具体的数据(立即数)、也可能是存放在寄存器或内存中的数据或地址。‡寻址方式是为得到指令中操作数据而对操作数采用的表示方式。‡IBMPC机的寻址方式:–立即寻址方式–寄存器寻址方式–直接寻址方式–寄存器间接寻址方式–寄存器相对寻址方式–基址变址寻址方式–相对基址变址寻址方式立即寻址方式寄存器寻址方式‡操作数直接存放在指令中紧跟在操作码之后。‡立即数可以是b或b的。若为b数则高字节数据放较高地址单元低字节数据放在较低地址单元中。‡例:MOVAL,指令执行后(AL)=HMOVAX,H指令执行后(AX)=HMOVAL,‘A’指令执行后(AL)=H‡说明:该寻址方式常用于给寄存器赋初值并且只能用于源操作数不用于目的操作数。‡操作数放在寄存器中指令中指定寄存器号。‡对b操作数寄存器可以是:AX,BX,CX,DX,SI,DI,SP和BP等对b操作数寄存器可以是:AL,AH,BL,BH,CL,CH,DL和DH。‡例:MOVAX,BX(AX)←(BX),(BX)保持不变。MOVDL,H指令执行后(DL)=H‡说明:操作数放在寄存器中无需服务存储器来得到操作数因而可以取得较高运算速度。以下寻址方式中操作数放在代码段以外的存储区中通过不同方式求得操作数地址从而得到操作数。直接寻址方式‡IBMPC机中将操作数的偏移地址称为有效地址EA直接寻址方式中EA就在指令中此时物理地址=×(段寄存器)EA默认段为DS若为其它段则应在指令中指定段跨越前缀。‡例:MOVAX,H注意:H为EA若(DS)=H地址为H的字定义内容为H则程序执行后(AX)=H。MOVAX,VALUE等效于MOVAX,VALUEMOVAX,ES:H(AX)←(×(ES)H)MOVAX,ES:VALUE等效于MOVAX,ES:VALUE寄存器间接寻址方式‡操作数有效地址EA在BX,BP或SI,DI中操作数在存储器中。–若指定的寄存器为BX,SI或DI,则操作数默认在DS中物理地址=×(DS)(SIDIBX)–若指定为BP则操作数默认在SS中。物理地址=×(SS)(BP)–若操作数不在默认段中则应在指令中指定段前缀。‡例:MOVAX,BX如果(AX)=H,(DS)=H,(BX)=H,(H)=H,则物理地址=H指令执行后(AX)=H。MOVAX,ES:BX(AX)←(×(ES)(BX))‡此寻址方式一般用于数组或表格处理执行完条指令后修改寄存器内容就可取出表格中的下一项。寄存器相对寻址方式‡此方式下操作数的有效地址EA和物理地址计算:–有效地址EA=(BXBPSIDI)bb偏移量–物理地址=×(DS)(BXSIDI)bb偏移量或物理地址=×(SS)(BP)bb偏移量‡例:MOVAX,SI也可写成MOVAX,SI如果(DS)=H,(SI)=H,(H)=H,则物理地址=H,指令执行后(AX)=HMOVDL,ES:STRSI(DL)←(×(ES)STR(SI))‡该指令可用于表格处理表格首地址设置为固定值利用修改寄存器内容来取得表格中的值。基址变址寻址方式‡此方式下操作数的有效地址EA和物理地址计算:–有效地址EA=(基址寄存器)+(变址寄存器)–物理地址=×(DS)(BX)(SIDI)或物理地址=×(SS)(BP)(SIDI)‡例:MOVAX,BXSI或写成:MOVAX,BXSI如果(DS)=H,(BX)=H,(SI)=H,(H)=H,则物理地址=H,指令执行后(AX)=HMOVAX,ES:BXSI(AX)←(×(ES)(BX)(SI))‡同样适用于数组或表格处理首地址放于基址寄存器而用变址寄存器访问数组中各个元素较直接变址方式灵活相对基址变址寻址方式‡此方式下操作数的有效地址EA和物理地址计算:–有效地址EA=(基址寄存器)(变址寄存器)bb偏移量–物理地址=×(DS)(BX)(SIDI)bb偏移量或物理地址=×(SS)(BP)(SIDI)bb偏移量‡例:MOVax,COUNTBPDI或写成MOVAX,COUNTBPDI–如果(SS)=H,(BP)=H,(DI)=H,COUNT=H,(H)=H,则物理地址=H指令执行后(AX)=H‡方便了堆栈处理:BP指向栈顶从栈顶到数组首地址用偏移量表示变址寄存器用来访问数组中某个元素。IBMPC机指令系统‡指令系统按功能分为类:–数据传送指令–算术运算指令–逻辑运算指令–串操作指令–控制转移指令–处理器控制指令数据传送指令‡通用数据传送指令–MOV指令PUSH指令POP指令XCHG指令‡累加器专用传送指令–IN指令OUT指令XLAT指令‡地址传送指令–LEA指令LDS指令LES指令‡标志寄存器传送指令–LAHF指令SAHF指令PUSHF指令POPF指令‡类型转换指令–CBW指令CWD指令通用数据传送指令(MOVPUSH,POPXCHG)①MOV指令–指令格式:MOVDST,SRCDST和SRC为b或b–执行操作:(DST)←(SRC)–注意:‡MOV指令不影响PSW‡DST和SRC的数据位数必须相同MOVAX,BL×–常用形式(种):‡MOVmemreg,memreg例:MOVAX,BX(AX)←(BX)MOVDAA,AX(DAA)←(AX)传送个字MOVDL,DAA(DL)←(DAA)传送个字节注意:个操作数不能同时为存储器操作数不允许用段寄存器。‡MOVreg,data例:MOVAL,H(AL)←HMOVDX,FEH(DX)←FEH,A~F作数头前加‡MOVmem,data例:MOVDAA,H(DAA)←H‡MOVac,mem例:MOVAX,DATASEGMOVAL,DAA(AL)←(DAA)MOVAX,DAA(AX)←(DAA)上述DAA必须为单字节存储单元,DAA必须为字存储单元MOVAX,YBPSI(AX)←(×(SS)(BP)(SI)Y)‡MOVmem,ac‡MOVsegreg,memreg例:MOVSS,BX(SS)←(BX)MOVDS,AX(DS)←(AX)注意:()segreg不能是CS()不允许将段地址直接传送给DS,必须通过寄存器传送MOVDSDSSEG×MOVAX,DSSEG正确方法MOVDS,AX()该指令执行完后不响应中断要等到下一条指令执行完后才可能响应中断。‡MOVmemreg,segreg例:MOVDAA,DS(DAA)←(DS)②堆栈操作指令(PUSHPOP)‡PUSH指令(进栈)─指令格式:PUSHSRC─执行操作:(SP)←(SP),((SP),(SP))←(SRC)‡POP指令(出栈)–指令格式:POPDST–执行操作:(DST)←((SP),(SP)),(SP)←(SP)‡说明:()两指令中的操作数必须以字为单位且不能是立即数()指令可以指定段寄存器作为操作数但POP指令不允许用CS寄存器()两指令不影响标志寄存器PSW。(SP)低地址H(SP)H进栈方向低地址(SP)低地址HH(SP)出栈方向低地址(BX)执行PUSHAX(AX)=H执行POPBX(BX)=H–用途:‡如果在程序中用到某些寄存器但它的内容却在将来还有用这时就可以用堆栈将它们保存然后在必要时再恢复其内容。‡例:PUSHAXPUSHBXPUSHCX…POPCXPOPBXPOPAX注意:进栈多个数据时出栈和进栈时顺序相反。(AH)(SP)(AL)低地址(BH)(BL)(CH)(CL)(SP)(SP)低地址CX低地址BXAX③XCHG交换指令–指令格式:XCHGOPROPR–执行操作:(OPR)↔(OPR)–例:XCHGBXBPSI‡如指令执行前:(BX)=FH,(BP)=H,(SI)=H,(SS)=FH,(FH)=H则指令执行后(BX)=H(FH)=FH‡MOVAL,DABYTE两个存储单元之间的数据交换XCHGAL,DABYTEXCHGAL,DABYTE–指令说明:‡该指令的两个操作数中必须有一个在寄存器中但不允许使用段寄存器‡指令允许字字节操作且不影响PSW中标志位累加器专用传送指令(IN,OUTXLAT)IO操作指令(INOUT)不影响PSW‡IN指令(从IO端口读)–指令格式:INALPORT(字节)操作:(AL)←(PORT)INAXPORT(字)操作:(AX)←((PORT,PORT)INAL,DX(字节)操作:(AL)←((DX))INAX,DX(字)操作:(AX)←((DX),(DX))–例:()INAX,H()MOVDX,FCHMOVDATAWORD,AXINAX,DX‡OUT指令(向IO端口写)–指令格式:OUTPORT,AL(字节)操作:(PORT)←(AL)OUTPORT,AX(字)操作:(PORT,PORT)←(AX)OUTDX,AL(字节)操作:((DX))←(AL)OUTDX,AX(字)操作:((DX),(DX))←(AX)–例:()MOVAX,DATAWORD()MOVDX,FCHOUTH,AXOUTDX,AXPORT为≤FFH的端口地址‡XLAT换码指令–指令格式:XLATOPRXLAT–执行操作:(AL)←((BX)(AL))–用途:常用于将一种代码转换为另一种代码。–例:如(BX)=H,(AL)=FH,(DS)=FH,则执行XLAT后(AL)=(FF)(BX)(AL)原代码要转换的代码FFF地址传送指令(LEA,LDS,LES)–LEA有效地址送寄存器‡指令格式:LEAREG,SRC‡执行操作:(REG)←SRC将原操作数地址送到指定REG。‡例:LEABX,BXSIFH如执行前(BX)=H,(SI)=CH则执行后(BX)=CFH=EH(BX)为偏移地址–LDS指针送寄存器和DS指令‡指令格式:LDSREG,SRC‡执行操作:(REG)←(SRC)(DS)←(SRC)‡例:LDSSI,H如执行前(DS)=CH,(CH)=H,(CH)=H则执行后(SI)=H,(DS)=H–LES指针送寄存器和ES指令‡指令格式:LESREG,SRC‡执行操作:(REG)←(SRC)(ES)←(SRC)‡例:LESDI,BX如执行前(DS)=BH,(BX)=AH,(BAH)=AEH,(BCH)=H则执行后(DI)=AEH,(ES)=H–说明:‡以上条指令中的REG不能用段寄存器且SRC必须使用除立即寻址方式和寄存器方式以外的其它寻址方式。‡这些指令不影响PSW。–LAHF标志送AH指令(不影响标志位)‡指令格式:LAHF操作:(AH)←(PSW低字节)–SAHFAH送标志寄存器指令‡指令格式:SAHF操作:(PSW低字节)←(AH)–PUSHF标志进堆栈指令(不影响标志位)‡指令格式:PUSHF操作:(SP)←(SP)((SP),(SP))←(PSW)–POPF标志出堆栈指令‡指令格式:POPF操作:(PSW)←((SP),SP)(SP)←(SP)–其它与FLAG有关的指令:‡CLD复位方向标志DF=STD设置方向标志DF=‡CLI复位可屏蔽中断允许标志IF=STI设置可屏蔽中断允许标志IF=‡CLC复位进位标志CF=STC设置进位标志CF=CMC进位标志CF取反。CF←CF标志寄存器FLAG传送指令类型转换指令–CBW字节转化为字‡指令格式:CBW将AL内容转换为AX‡执行操作:AL的内容符号扩展到AH。如(AL)的最高有效位为则(AH)=如(AL)最高有效位为则(AH)=FFH–CWD字转化为双字‡指令格式:CWD将AX内容转换为DX,AX‡执行操作:AX的内容符号扩展到DX。如(AX)的最高有效位为则(DX)=如(AX)最高有效位为则(DX)=FFFFH算术运算指令‡加法指令–ADDADCINC‡减法指令–SUBSBBDECNEGCMP‡乘法指令–MULIMUL‡除法指令–DIVIDIV‡十进制调整指令–压缩BCD码调整指令(DAADAS)–非压缩BCD码调整指令(AAAAASAAMAAD)加法指令–ADD加法‡指令格式:ADDDST,SRC(b)‡执行操作:(DST)←(SRC)(DST)‡说明:该指令的执行结果将影响PSW中ZF,CF,OF,SF无符号数溢出:用CF判断(CF=)有符号数溢出:用OF判断(OF=)(两操作数符号相同相加后符号相反则OF=,否则OF=)‡例:ADDDX,FFH如指令执行前(DX)=H则执行后(DX)=HZF=,SF=,CF=,OF=–ADC带进位的加法‡指令格式:ADCDST,SRC(b)‡执行操作:(DST)←(SRC)(DST)CF‡说明:同ADD指令(影响PSW中ZF,CF,OF,SF)‡例:执行个双精度数加法。设目的操作数存放在DX和AX其中DX存放高位字源操作数存于BX和CXBX存放高位字。ADDAX,CXADCDX,BX设执行前(DX)=H,(AX)=FH,(BX)=H,(CX)=EH则执行后:(DX)=H,(AX)=DH,SF=,ZF=,CF=,OF=–INC加指令‡指令格式:INCOPR(b)‡执行操作:(OPR)←(OPR)‡说明:同ADD指令但不影响CF标志。FED(CF)减法指令–SUB减法‡指令格式:SUBDST,SRC‡执行操作:(DST)←(DST)–(SRC)‡说明:该指令的执行结果影响PSW中的ZF,CF,OF和SF。若减数>被减数则CF=否则CF=若两数符号相反而结果符号与减数相同则OF=,否则OF=‡例:SUBDH,BP如执行前,(DH)=H,(SS)=H,(BP)=EH,(E)=AH在执行后(DH)=EH,SF=,ZF=,CF=,OF=-+A-–SBB带借位减法指令‡指令格式:SBBDST,SRC‡执行操作:(DST)←(DST)(SRC)CF‡说明:同SUB指令‡例:设X,Y,Z均为双精度数它们分别存放在地址X,XY,YZ,Z的存储单元中存放时高位字在高地址中低位字在低地址中实现:W←XY–Z。结果存于W和W单元。MOVAX,XMOVDX,XADDAX,YADCDX,YADDAX,ADCDX,SUBAX,ZSBBDX,ZMOVW,AXMOVW,DXXY-Z结果存入W,WxYZXYZ–DEC减指令‡指令格式:DECOPR‡执行操作:(OPR)←(OPR)‡说明:同SUB指令,但不影响CF标志。–NEG求补指令‡指令格式:NEGOPR‡执行操作:(OPR)←-(OPR)或(OPR)←FFFFH–(OPR)‡说明:影响CF,SF,ZF,OF。只有当OPR=时结果使CF=,其它情况下CF=–CMP指令‡指令格式:CMPOPR,OPR‡执行操作:(OPR)–(OPR)‡说明:与SUB指令不同处在于不保存结果。后面常跟条条件转移指令根据比较结果产生不同的程序分支。乘法指令–MUL无符号数乘法‡指令格式:MULSRC被乘数放在AL或AX中‡执行操作:字节操作(AX)←(AL)*(SRC)字操作(DX,AX)←(AX)*(SRC)‡说明:如果执行结果的AH(或DX)为则CF=OF=,否则均为其它标志位状态无法确定。‡例:如(AL)=BH,(BL)=H,则执行:MULBLBH-D,H-D,(AX)=BFH=DCF=OF=–IMUL带符号数乘法‡指令格式:IMULSRC‡执行操作:与MUL指令相同但必须是带符号数。‡说明:同MUL指令‡例:如(AL)=BH,(BL)=H,则执行:IMULBLBH--D,H-D,(AX)=FAFH=DCF=OF=除法指令–DIV无符号数除法‡指令格式:DIVSRC‡执行操作:–字节操作:执行前将(AX)←b被除数(SRC)←b除数执行结果:b商在AL中位余数在AH中。表示为:(AL)←(AX)(SRC)的商(AH)←(AX)(SRC)的余数–字操作:执行前将(DX,AX)←b被除数(SRC)←b除数执行结果:b商在AX中位余数在DX中。表示为:(AX)←(DX,AX)(SRC)的商(DX)←(DX,AX)(SRC)的余数‡说明:对所有条件码无定义。‡例:如(AX)=H,(BL)=BH,则执行:DIVBLH-D,BH-D,(AH)=CH=D,(AL)=H=DAXSRCALDXSRCAXAXAHDX–IDIV带符号数除法‡指令格式:IDIVSRC‡执行操作:与DIV指令相同但必须是带符号数商和余数均为带符号数且余数符号和被除数符号相同。‡说明:同DIV指令‡例:如(AX)=H,(BL)=BH,则执行:IDIVBL-D,BH--D(AH)=H=D,(AL)=FH=-D–例:计算(V(X*YZ–))X其中X,Y,Z,V均为位带符号数已分别装入X,Y,Z,V单元中要求上式计算结果的商存入AX余数存入DXMOVAX,XSUBCX,IMULYSBBBX,(BX,CX)=X*YZMOVCX,AXMOVAX,VMOVBX,DX(BX,CX)=X*YCWDMOVAX,ZSUBAX,CXCWDSBBDX,BX(DX,AX)=V(X*YZ)ADDCX,AXIDIVX(DX):余数(AX):商ADCBX,DX(BX,CX)=X*YZDXAX十进制调整指令‡压缩BCD码调整指令–DAA加法的十进制调整指令‡指令格式:DAA‡执行操作:(AL)←把AL中的和调整到压缩的BCD格式。该指令执行之前必须执行ADD或ADC指令加法指令必须把两个压缩的BCD码相加并把结果存放在AL中。‡说明:该指令对OF无定义但影响所有其它条件标志。‡例:()ADDAL,BLDAA如执行前(AL)=,(BL)=,ADD后(AL)=,DAA后(AL)=()如(BCD)=(BCD)=,要求编程序实现:(BCD)←(BCD)(BCD)MOVAL,BCD(AL)=MOVAL,BCD(AL)=ADDAL,BCDADCAL,BCDDAA(AL)=,(CF)=DAA(AL)=MOVBCD,ALMOVBCD,ALCF=,AF=–DAS减法的十进制调整指令‡指令格式:DAS‡执行操作:(AL)←把AL中的差调整到压缩的BCD格式。该指令执行之前必须执行SUB或SBB指令减法指令必须把两个压缩的BCD码相减并把结果存放在AL中。‡说明:同DAA指令。‡例:()SUBAL,AHDAS如执行前(AL)=,(AH)=,SUB后(AL)=F,DAS后(AL)=()如(BCD)=(BCD)=,要求编程序实现:(BCD)←(BCD)-(BCD)MOVAL,BCD(AL)=MOVAL,BCD(AL)=SUBAL,BCDSBBAL,BCDDAS(AL)=,CF=DASMOVBCD,ALMOVBCD,ALCF=,AF=‡非压缩BCD码调整指令–AAA加法的ASCII调整指令‡指令格式:AAA‡执行操作:(AL)←把AL中的和调整到非压缩的BCD格式。(AH)←(AH)+调整产生的进位值该指令执行之前必须执行ADD或ADC指令加法指令必须把两个非压缩的BCD码相加并把结果存放在AL中。‡说明:AAA指令影响AF和CF标志对其余标志位无定义。‡例:ADDAL,BLAAA如执行前(AX)=H,(BL)=H,AL和BL中分别为和的ASCII码。ADD后(AL)=E,DAS后(AX)=HCF=,AF=CF=,AF=–AAS减法的ASCII调整指令‡指令格式:AAS‡执行操作:(AL)←把AL中的差调整到非压缩的BCD格式。(AH)←(AH)-调整产生的借位值该指令执行之前必须执行SUB或SBB指令减法指令必须把两个非压缩的BCD码相减并把结果存放在AL中。‡说明:AAA指令影响AF和CF标志对其余标志位无定义。‡例:编程序实现:(DX)←UPUPUP其中参加运算的数均为二位十进制数。MOVAX,XCHGAL,DLMOVAL,UPSUBAL,UPADDAL,UPAASAAAXCHGAL,DLMOVDL,ALSBBAL,UPMOVAL,UPAASADCAL,UPMOVDH,ALAAA–AAM乘法的ASCII调整指令‡指令格式:AAM‡执行操作:–(AX)←把AL中的积调整到非压缩的BCD格式。–该指令执行之前必须执行MUL指令把两个非压缩的BCD码相乘并把结果存放在AL中。‡说明:影响SF,ZF和PF对OF,CF和AF无定义。‡例:MULAL,BLAAM如指令执行前(AL)=H,(BL)=HMUL后(AL)=FH,AAM后(AH)=H,(AL)=H。–AAD除法的ASCII调整指令‡指令格式:AAD‡执行操作:–如果被除数是放在(AX)中的位非压缩BCD码(AH中存放十位数AL中存放个位数)且AH和AL中高b均为除数是位非压缩BCD码且高b均为(AX)←把AL中的和调整到非压缩的BCD格式。–把两个数用DIV指令相除之前必须先用AAD指令把AX中的被除数调整成二进制并存放在AL寄存器中。‡说明:影响SF,ZF和PF对OF,CF和AF无定义。‡例:AAD如指令执行前(AX)=H则指令执行后(AX)=H。逻辑指令‡逻辑运算指令–AND逻辑与‡指令格式:ANDDST,SRC操作:(DST)←(DST)∧(SRC)–OR逻辑或‡指令格式:ORDST,SRC操作:(DST)←(DST)∨(SRC)–NOT逻辑非‡指令格式:NOTOPR操作:(OPR)←(OPR)–XOR异或‡指令格式:ANDDST,SRC操作:(DST)←(DST)∨(SRC)–TEST测试指令‡指令格式:TESTOPR,OPR操作:(OPR)∧(OPR)结果不保存只根据其特征设置条件码–说明:‡上条指令中NOT不允许使用立即数其它条指令除非源操作数是立即数至少有个操作数必须存放在寄存器中另个操作数则可以使用任意寻址方式。‡对标志位的影响:NOT不影响标志位其它种指令将使CF和OF为AF位无定义而SF,ZF和PF则根据运算结果设置。–例:()要求将AL中,两位屏蔽()要求将BL中第位置ANDAL,BORBL,B()要求将AX中位取反XORAX,B‡移位指令–SHL逻辑左移指令‡指令格式:SHLOPR,CNT‡执行操作:OPR可以是除立即数以外的任何寻址方式移位次数由CNT决定(CNT可以是或CL)‡说明:对条件码的影响是CF位根据指令规定设置OF只有当CNT=时才有效在移位后最高有效位的值发生变化(变或变)时OF置否则OF置–其它移位指令‡SALOPR,CNT算术左移指令(同SHL)‡SHROPR,CNT逻辑右移指令‡SAROPR,CNT算术右移指令CFOPRCFOPRCFOPR‡ROLOPR,CNT循环左移指令‡ROROPR,CNT循环右移指令‡RCLOPR,CNT带进位循环左移指令‡RCROPR,CNT带进位循环右移指令–例:()MOVCL,执行前(DS)=FH,(DI)=AH,(FA)=HSARDI,CL则执行后(FA)=H,CF=()MOVCL,执行前(SI)=HSHLSI,CL执行后(SI)=H,CF=()如(AX)=H,(BX)=H,要求将它们装配在一起形成(AX)=HMOVCL,ROLAX,CLADDAX,BXCFOPRCFOPRCFOPRCFOPR串处理指令‡串指令:–MOVS串传送–CMPS串比较–SCAS串扫描–LODS从串取–STOS存入串‡与上述基本指令配合使用的前缀指令:–REP重复–REPEREPZ相等为则重复–REPNEREPNZ不相等不为则重复–REP重复串指令‡指令格式:REP串指令‡执行操作:–MOVS串传送指令‡指令格式:MOVSDST,SRC在操作数中要表明字字节操作MOVSB(字节)MOVSW(字)‡执行操作:()(DI)←(SI)()字节操作:(SI)←(SI)±,(DI)←(DI)±()字操作:(SI)←(SI)±,(DI)←(DI)±‡说明:A该指令不影响条件码。B该指令可以把由(SI)指向的数据段中的个字字节→由(DI)指向的附加段中的个字字节中同时根据DF值及数据格式(字字节)对(SI)和(DI)进行修改。MOVS,STOS,LODS(CX)=(CX)←(CX)串指令NYDF=时用+,DF=时用-C该指令与REP联用则可将数据段中整串数据→附加段中但执行前要做准备工作步骤如下:‡例:将DS段中个字符送到DS段中。定义数据段DATAREASEGMENTMESSDB‘personalcomputer$’DATAREAENDS定义附加段EXTRASEGMENTMESSDBDUP()EXTRAENDS定义代码段CODESEGMENTASSUMECS:CODE,DS:DATAREA,ES:EXTRA…MOVAX,DATAREAMOVDS,AX(SI)←DS中源串首末地址(DI)←ES中目的串首末地址(CS)←数据串长度设置DF=REPMOVSSBSWMOVAX,EXTRAMOVES,AX…LEASI,MESSLEADI,MESSMOVCX,CLDREPMOVSB…CODEENDSEND–STOS存入串指令‡指令格式:STOSDSTSTOSB(字节)STOSW(字)‡执行操作:字节操作:((DI))←(AL),(DI)←(DI)±字操作:((DI))←(AX),(DI)←(DI)±‡说明:A该指令不影响条件码。B该指令把由(AL)(AX)→由(DI)指定的附加段某单元中并根据DF值及数据格式(字字节)修改(DI)。C该指令与REP联用则可将(AL)(AX)存入一个串长度为(CX)的缓冲区中。D该指令在初始化某一缓冲区时很有用。–LODS取出串指令‡指令格式:LODSDSTLODSB(字节)LODSW(字)‡执行操作:字节操作:(AL)←((SI)),(SI)←(SI)±字操作:(AX)←((SI)),(SI)←(SI)±‡说明:A该指令不影响条件码。B该指令把由(SI)指定的数据段某单元内容中→(AL)(AX)并根据DF值及数据格式(字字节)修改(SI)。C一般说来该指令不和REP联用。有时缓冲区中的一串字符需要逐次取出来测试时可用本指令。–REPEREPZ当相等为时重复串操作‡指令格式:REPEREPZ串指令‡执行操作:–REPNEREPNZ当不相等不为时重复串操作‡指令格式:REPEREPZ串指令‡执行操作:退出条件为(CX)=或ZF=其它与REPE相同。(CX)(ZF)=(CX)←(CX)串指令NYCMPS,SCAS–CMPS串比较指令‡指令格式:CMPSSRC,DSTCMPSB(字节)CMPSW(字)‡执行操作:((SI))-((DI))字节操作:(SI)←(SI)±,(DI)←(DI)±字操作:(SI)←(SI)±,(DI)←(DI)±‡说明:(SI)指向的DS段中的个字字节-(DI)指向的ES段中的个字字节不保存结果只根据结果设置条件码。–SCAS串扫描指令‡指令格式:SCASSRC,DSTSCASB(字节)SCASW(字)‡执行操作:字节操作:(AL)-(DI),(DI)←(DI)±字操作:(AL)-(DI),(DI)←(DI)±‡说明:把(AL)或(AX)与由(DI)指定的ES段中个字节字比较不保存结果只根据结果设置条件码。‡以上条指令与REPEREPZ或REPNEREPNZ结合可比较个数据串或在个串中查找个指定字符。‡串处理指令几个需要注意的问题:–用串处理指令在不同段之间传送或比较数据如果需要在同一段内处理数据可以在DS和ES中设置同样的地址或者在源操作数字段使用段跨越前缀来实现。例如:MOVSDI,ES:SI–注意循环次数的设置。对于字指令来说(CX)中预置的值应该是字的个数而不是字节的个数。–注意方向标志的设置。正向时设置DF=反向时设置DF=。控制转移指令①无条件转移指令–JMP②条件转移指令–根据单个标志情况转移(JZJE,JNZJNEJS,JNSJO,JNOJP,JNPJBJC,JNBJNC)–比较两无符号数由结果转移(JBJC,JNBJNC,JBEJNA,JNBEJA)–比较两带符号数由结果转移(JLJNGE,JNL,JLEJNG,JNLEJG)–测试CX的值为则转移(JC

用户评价(5)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/22

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利