IBMPC汇编语言程序设计.docx
- 文档编号:17372988
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:60
- 大小:36.84KB
IBMPC汇编语言程序设计.docx
《IBMPC汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《IBMPC汇编语言程序设计.docx(60页珍藏版)》请在冰豆网上搜索。
IBMPC汇编语言程序设计
IBMPC汇编语言程序设计
IBMPC汇编语言程序设计(第一章8086/8088指令系统)
第一章8086/8088指令系统
一、数据传送指令.MOV指令
格式为:
MOVDST,SRC
执行的操作:
(DST)<-(SRC)
.PUSH进栈指令
格式为:
PUSHSRC
执行的操作:
(SP)<-(SP)-2?
((SP)+1,(SP))<-(SRC)
.POP出栈指令
格式为:
POPDST
执行的操作:
(DST)<-((SP+1),(SP))
(SP)<-(SP)+2.XCHG交换指令
格式为:
XCHGOPR1,OPR2执行的操作:
(OPR1)<-->(OPR2).IN输入指令
长格式为:
INAL,PORT(字节)
INAX,PORT(字)
执行的操作:
(AL)<-(PORT)(字节)
(AX)<-(PORT+1,PORT)(字)
短格式为:
INAL,DX(字节)
INAX,DX(字)
执行的操作:
AL<-((DX))(字节)
AX<-((DX)+1,DX)(字)
.OUT输出指令
长格式为:
OUTPORT,AL(字节)
OUTPORT,AX(字)
执行的操作:
(PORT)<-(AL)(字节)
(PORT+1,PORT)<-(AX)(字)
短格式为:
OUTDX,AL(字节)
OUTDX,AX(字)
执行的操作:
((DX))<-(AL)(字节)
((DX)+1,(DX))<-AX(字)
在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.
其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个
字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256
个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从
0000到0FFFFH),然后再用IN或OUT指令来传送信息.格式为:
XLATOPR
或:
XLAT
执行的操作:
(AL)<-((BX)+(AL))LEA(Loadeffectiveaddress)有效地址送寄存器LDS(LoadDSwithPointer)指针送寄存器和DSLES(LoadESwithPointer)指针送寄存器和ES.LEA有效地址送寄存器
格式为:
LEAREG,SRC
执行的操作:
(REG)<-SRC
指令把源操作数的有效地址送到指定的寄存器中..LDS指针送寄存器和DS指令
格式为:
LDSREG,SRC
执行的操作:
(REG)<-(SRC)
(DS)<-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄
存器.
.LES指针送寄存器和ES指令
格式为:
LESREG,SRC
执行的操作:
(REG)<-(SRC)
(ES)<-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄
存器.
LAHF(LoadAHwithflags)标志送AH
SAHF(storeAHintoflags)AH送标志寄存器PUSHF(pushtheflags)标志进栈
POPF(poptheflags)标志出栈
.LAHF标志送AH
格式为:
LAHF
执行的操作:
(AH)<-(PWS的低字节)
.SAHFAH送标志寄存器
格式为:
SAHF
执行的操作:
(PWS的低字节)<-(AH)
.PUSHF标志进栈
格式为:
PUSHF
执行的操作:
(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
.POPF标志出栈
格式为:
POPF
执行的操作:
(PWS)<-((SP)+1,(SP))
(SP)<-(SP+2)
二、算术指令.ADD加法指令
格式:
ADDDST,SRC执行的操作:
(DST)<-(SRC)+(DST).ADC带进位加法指令
格式:
ADCDST,SRC执行的操作:
(DST)<-(SRC)+(DST)+CF.ADD加1指令
格式:
INCOPR
执行的操作:
(OPR)<-(OPR)+1.SUB减法指令
格式:
SUBDST,SRC
执行的操作:
(DST)<-(DST)-(SRC).SBB带借位减法指令
格式:
SBBDST,SRC
执行的操作:
(DST)<-(DST)-(SRC)-CF.DEC减1指令
格式:
DECOPR
执行的操作:
(OPR)<-(OPR)-1.NEG求补指令
格式:
NEGOPR
执行的操作:
(OPR)<--(OPR).CMP比较指令
格式:
CMPOPR1,OPR2执行的操作:
(OPR1)-(OPR2)
该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.
.MUL无符号数乘法指令
格式:
MULSRC
执行的操作:
字节操作数:
(AX)<-(AL)*(SRC)
字操作数:
(DX,AX)<-(AX)*(SRC).IMUL带符号数乘法指令
格式:
IMULSRC
执行的操作:
与MUL相同,但必须是带符号数,而MUL是无符号数..DIV无符号数除法指令
格式:
DIVSRC
执行的操作:
字节操作:
(AL)<-(AX)/(SRC)的商
(AH)<-(AX)/(SRC)的余数
字操作:
(AX)<-(DX,AX)/(SRC)的商
(AX)<-(DX,AX)/(SRC)的余数
.IDIV带符号数除法指令
格式:
DIVSRC
执行的操作:
与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除
数的符号相同.
.CBW字节转换为字指令
格式:
CBW
执行的操作:
AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有
效位为1,则(AH)=0FFH
.CWD字转换为双字指令
格式:
CWD
执行的操作:
AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.
这两条指令都不影响条件码.
三、逻辑指令.AND逻辑与指令
格式:
ANDDST,SRC执行的操作:
(DST)<-(DST)^(SRC).OR逻辑或指令
格式:
ORDST,SRC执行的操作:
(DST)<-(DST)V(SRC).NOT逻辑非指令
格式:
NOTOPR
执行的操作:
(OPR)<-(OPR).XOR异或指令
格式:
XORDST,SRC
执行的操作:
(DST)<-(DST)V(SRC)
.TEST测试指令
格式:
TESTOPR1,OPR2
执行的操作:
(DST)^(SRC)
两个操作数相与的结果不保存,只根据其特征置条件码
SHL(shiftlogicalleft)逻辑左移
SAL(shiftarithmeticleft)算术左移
SHR(shiftlogicalright)逻辑右移
SAR(shiftarithmeticright)算术右移
ROL(Rotateleft)循环左移
ROR(Rotateright)循环右移
RCL(Rotateleftthroughcarry)带进位循环左移
RCR(Rotaterightthroughcarry)带进位循环右移
格式:
SHLOPR,CNT(其余的类似)
其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.
循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算
术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运
算,SHL用来乘2,SHR用来除以2.
串处理指令
四、串处理指令
1.与REP相配合工作的MOVS,STOS和LODS指令.REP重复串操作直到(CX)=0为上
格式:
REPstringprimitive其中StringPrimitive可为MOVS,LODS或STOS指令执行的操作:
1)如(CX)=0则退出REP,否则往下执行.
2)(CX)<-(CX)-1
3)执行其中的串操作
4)重复1)~3)
.MOVS串传送指令
格式:
可有三种
MOVSDST,SRC
MOVSB(字节)
MOVSW(字)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
MOVSES:
BYTEPTR[DI],DS:
[SI]
执行的操作:
1)((DI))<-((SI))
2)字节操作:
(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1
当方向标志DF=0时用+,当方向标志DF=1时用-
3)字操作:
(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2
当方向标志DF=0时用+,当方向标志DF=1时用-
该指令不影响条件码.
.CLD(Cleardirectionflag)该指令使DF=0,在执行串操作指令时可使地址自动增量;.STD(Setdirectionflag)该指令使DF=1,在执行串操作指令时可使地址自动减量..STOS存入串指令
格式:
STOSDST
STOSB(字节)
STOSW(字)
执行的操作:
字节操作:
((DI))<-(AL),(DI)<-(DI)+-1
字操作:
((DI))<-(AX),(DI)<-(DI)+-2该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,
当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中..LODS从串取指令
格式:
LODSSRC
LODSB
LODSW
执行的操作:
字节操作:
(AL)<-((SI)),(SI)<-(SI)+-1
字操作:
(AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.
指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.
2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ当相等/为零时重复串操作
格式:
REPE(或REPZ)StringPrimitive其中StringPrimitive可为CMPS或SCAS指令.
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-1
3)执行其后的串指令
4)重复1)~3)
.REPNE/REPNZ当不相等/不为零时重复串操作
格式:
REPNE(或REPNZ)StringPrimitive其中StringPrimitive可为CMPS或SCAS指令
执行的操作:
除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同..CMPS串比较指令
格式:
CMPSRC,DST
CMPSB
CMPSW
执行的操作:
1)((SI))-((DI))
2)字节操作:
(SI)<-(SI)+-1,(DI)<-(DI)+-1
字操作:
(SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,
只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同..SCAS串扫描指令
格式:
SCASDST
SCASB
SCASW
执行的操作:
字节操作:
(AL)-((DI)),(DI)<-(DI)+-1
字操作:
(AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果
置条件码.指令的其他特性和MOVS的规定相同.
五、控制转移指令
1.无条件转移指令
.JMP(jmp)跳转指令
1)段内直接短转移
格式:
JMPSHORTOPR
执行的操作:
(IP)<-(IP)+8位位移量
2)段内直接近转移
格式:
JMPNEARPTROPR执行的操作:
(IP)<-(IP)+16位位移量
3)段内间接转移
格式:
JMPWORDPTROPR执行的操作:
(IP)<-(EA)4)段间直接(远)转移
格式:
JMPFARPTROPR执行的操作:
(IP)<-OPR的段内偏移地址
(CS)<-OPR所在段的段地址5)段间间接转移
格式:
JMPDWORDPTROPR执行的操作:
(IP)<-(EA)
(CS)<-(EA+2)2.条件转移指令
1)根据单个条件标志的设置情况转移.JZ(或JE)(Jumpifzero,orequal)结果为零(或相等)则转移
格式:
JE(或JZ)OPR
测试条件:
ZF=1
.JNZ(或JNE)(Jumpifnotzero,ornotequal)结果不为零(或不相等)则转移
格式:
JNZ(或JNE)OPR
测试条件:
ZF=0
.JS(Jumpifsign)结果为负则转移
格式:
JSOPR
测试条件:
SF=1
.JNS(Jumpifnotsign)结果为正则转移格式:
JNSOPR
测试条件:
SF=0
.JO(Jumpifoverflow)溢出则转移格式:
JOOPR
测试条件:
OF=1
.JNO(Jumpifnotoverflow)不溢出则转移格式:
JNOOPR
测试条件:
OF=0
.JP(或JPE)(Jumpifparity,orparityeven)奇偶位为1则转移
格式:
JPOPR
测试条件:
PF=1
.JNP(或JPO)(Jumpifnotparity,orparityodd)奇偶位为0则转移格式:
JNP(或JPO)OPR
测试条件:
PF=0
.JB(或JNAE,JC)(Jumpifbelow,ornotaboveorequal,orcarry)低于,或者不高于或等于,或进位位为1则
转移
格式:
JB(或JNAE,JC)OPR
测试条件:
CF=1
.JNB(或JAE,JNC)(Jumpifnotbelow,oraboveorequal,ornotcarry)不低于,或者高于或者等于,或进位位
为0则转移
格式:
JNB(或JAE,JNC)OPR
测试条件:
CF=0
2)比较两个无符号数,并根据比较的结果转移
.JB(或JNAE,JC)
格式:
同上
.JNB(或JAE,JNC)
格式:
同上
.JBE(或JNA)(Jumpifbeloworequal,ornotabove)低于或等于,或不高于则转移格式:
JBE(或JNA)OPR
测试条件:
CFVZF=1
.JNBE(或JA)(Jumpifnotbeloworequal,orabove)不低于或等于,或者高于则转移格式:
JNBE(或JA)OPR
测试条件:
CFVZF=0
3)比较两个带符号数,并根据比较的结果转移
.JL(或LNGE)(Jumpifless,ornotgreaterorequal)小于,或者不大于或者等于则转移格式:
JL(或JNGE)OPR
测试条件:
SFVOF=1
.JNL(或JGE)(Jumpifnotless,orgreaterorequal)不小于,或者大于或者等于则转移格式:
JNL(或JGE)OPR
测试条件:
SFVOF=0
.JLE(或JNG)(Jumpiflessorequal,ornotgreater)小于或等于,或者不大于则转移格式:
JLE(或JNG)OPR
测试条件:
(SFVOF)VZF=1
.JNLE(或JG)(Jumpifnotlessorequal,orgreater)不小于或等于,或者大于则转移格式:
JNLE(或JG)OPR
测试条件:
(SFVOF)VZF=0
4)测试CX的值为0则转移指令
.JCXZ(JumpifCXregisteriszero)CX寄存器的内容为零则转移格式:
JCXZOPR
测试条件:
(CX)=0
注:
条件转移全为8位短跳!
3.循环指令
.LOOP循环指令
格式:
LOOPOPR
测试条件:
(CX)<>0
.LOOPZ/LOOPE当为零或相等时循环指令
格式:
LOOPZ(或LOOPE)OPR
测试条件:
(CX)<>0且ZF=1
.LOOPNZ/LOOPNE当不为零或不相等时循环指令格式:
LOOPNZ(或LOOPNE)OPR
测试条件:
(CX)<>0且ZF=0
这三条指令的步骤是:
1)(CX)<-(CX)-1
2)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充.
4.子程序
.CALL调用指令
.RET返回指令
5.中断
.INT指令
格式:
INTTYPE
或INT
执行的操作:
(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(TYPE*4)
(CS)<-(TYPE*4+2).INTO若溢出则中断
执行的操作:
若OF=1则:
(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(10H)
(CS)<-(12H)
.IRET从中断返回指令
格式:
IRET
执行的操作:
(IP)<-((SP)+1,(SP))
(SP)<-(SP)+2
(CS)<-((SP)+1,(SP))
(SP)<-(SP)+2
(PSW)<-((SP)+1,(SP))
(SP)<-(SP)+2
六、处理机控制指令
1.标志处理指令
.CLC进位位置0指令(Clearcarry)CF<-0.CMC进位位求反指令(Complementcarry)CF<-CF.STC进位位置1指令(Setcarry)CF<-1.CLD方向标志置0指令(Cleardirection)DF<-0.STD方向标志置1指令(Setdirection)DF<-1.CLI中断标志置0指令(Clearinterrupt)IF<-0.STI中断标志置1指令(Setinterrupt)IF<-02.其他处理机控制指令
NOP(NoOpreation)无操作
HLT(Halt)停机
WAIT(Wait)等待
ESC(Escape)换码
LOCK(Lock)封锁
这些指令可以控制处理机状态.这们都不影响条件码.
.NOP无操作指令
该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在
正式运行时用其他指令取代.
.HLT停机指令
该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.
.WAIT等待指令
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行.
.ESC换码指令
格式ESCmem
其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
.LOCK封锁指令
该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.
第二章伪操作
汇编语言程序语句除指令以外还可以由伪操作和宏指令组成.伪操作又称伪指令,它不像机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,这们可以完成如数据定义、分配存储区、指示程序结束等功能。
一、数据定义及存储器分配伪操作
这一类伪操作的格式是:
[Variable]MnemonicOperand,…,Operand[;Comments]
其中变量(Variable)字段是可有可无的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号.如果语句中有变量则汇编程序使其记以第一个字节的偏移地址.
注释(Comments)字段用来说明该伪操作的功能,它也是可有可无的.
助记符(Mnemonic)字段说明所用伪操作的助记符,常用的有以下几种:
DB伪操作用来定义字节,其后的每个操作数都占有一个字节.
DW伪操作用来定义字,其后的每个操作数都占有一个字(低位字节在第一个字节地址中,高位字节在第二个字节地址中).
DD伪操作用来定义双字,其后的每个操作数占有二个字.
DQ伪操作用来定义四个字,其后的每个操作占有四个字.
DT伪操作用来定义十个字节(五个字),其后的每个操作数占有十个字节,形成压缩的BCD码.
操作数字段还可以使用复制操作符(duplicationopreator)来复制某个操作数,例:
ARRAY1DB2DUP(0,1,2,?
)
注1:
使用PTR属性操作符,可以指定操作数的类型属性.
例:
MOVAX,WORDPTROPER1
注2:
使用LABEL伪操作可以使同一变量具有不同的类型属性.
例:
BYTE_ARRAYLABELBYTE
WORD_ARRAYDW50DUP(?
)二、表达式赋值伪操作EQU
格式:
变量名EQU表达式
例:
CONSTEQU25
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IBMPC 汇编语言 程序设计