ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:31.14KB ,
资源ID:8725852      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8725852.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(80x86指令系统.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

80x86指令系统.docx

1、80x86指令系统标志寄存器的条件位:进位位(CF):最高位有进位(借位)时置1,否则0;奇偶位(PF): 操作结果低8位hamming重量为偶则置1,否则0;辅助进位位(AF): 计算中低4位有进位置1,否则0;零值位(ZF): 计算结果为零则置1,否则0;符号位(SF): 计算结果为负则置1,否则0;溢出位(OF): 计算结果超过补码能表示的范围为1,否则0;不同于CF! 方向标志位(DF):串操作中DF=0用+,DF=1用;条件位的显示设置指令:CF:CLC 置CF=0;STC 置CF=1;CMC CF取反。 DF:CLD 置DF=0:STD 置DF=1。 IF:CLI 置IF=0:ST

2、I 置IF=1。特别说明:所有指令未说明均不影响条件标志位。1 数据传送指令1.1 通用数据传送指令(1) MOV 传送指令。 (2) MOVSX 带符号扩展传送,386后可用。 (3) MOVZX 带零扩展传送,386后可用。 (4) PUSH 进栈指令。 POP 出栈指令。操作数必须以字或双字为单位 (6) PUSHA/PUSHAD 所有通用寄存器进栈,进栈顺序是EAX, EBX, ECX, EDX,指令执行前的ESP, EBP, ESI, EDI。 POPA/PUSHAD 所有通用寄存器出栈,但是丢弃ESP而不装入当前的ESP中。 说明:PUSHA和POPA操作16位的寄存器,PUSHA

3、D和POPAD操作32位。 (7) XCHG 交换指令。1.2 累加器(EAX)专用传送指令(1) IN 格式: IN EAX, PORT或者IN EAX, DX,输入指令。 OUT 格式 OUT PORT, EAX或者OUT DX, EAX,输出指令。端口号从0000-FFFFH,其中00-FFH可以直接指定,否则必须放在DX中。(2) XLAT 换码指令。操作:AL = ( (EBX)+(AL) )。1.3 地址传送指令(1) LEA 有效地址送寄存器指令。(2) LDS, LES, LSS, LFS, LGS 指针送寄存器和段寄存器指令。后三个只能在386后可以用。 指令格式LDS: R

4、EG, SRC,把SRC单元中存放的内容连续的放如REG和DS中。1.4 标志寄存器传送指令(1) LAHF 标志送AH指令,把标志寄存器低8位送到AH。(2) SAHF AH送标志指令,把AH的内容送到标志的底8位。(3) PUSHF/PUSHFD 标志进栈指令,其中PUSH是16位。PUSHFD32位,进栈前清楚VM和RF位。(4) POPF/POPFD 标志出栈指令。但是POPFD不影响VM, RF, IOPL, VIF, VIP标志位。1.5 类型转换指令(1) CBW 字节转换成字。把AL符号扩展到AH形成AX字。(2) CWD/CWDE 字转换成双字。CWD把AX符号扩展形成DX:

5、AX双字。而CWDE把AX符号扩展成EAX。(3) CDQ 双字转换成四字。把EAX符号扩展成EDX:EAX四字。(4) BSWAP 字节交换指令。只能用与486以后。格式: BSWAP reg32,使得reg32中的1234字节变成4321字节。2 算术指令2.1 加法指令(1) ADD 加法指令。(2) ADC 带进位加法指令。(3) INC 加1指令。以上三条指令都影响条件标志位,但INC不影响CF。(4)XADD 交换并相加指令。486以后可以用,交换操作数的值,并做加法。2.2 减法指令(1) SUB 减法指令。(2) SBB 带借位减法指令。(3) DEC 减1指令。(4) NEG

6、 求补(负)指令。(5) CMP 比较指令。与SUB一样,但是不存结果。以上指令都影响条件标志位,但DEC不影响CF。2.3 乘法指令(1) MUL 无符号乘法指令。格式:MUL SRC,字操作AX = AL*SRC,字节操作DX:AX=AX*SRC,双字节操作EDX:EAX=EAX*SRC,SRC可以是除立即数以外的任何一种寻址方式。(2) IMUL 有符号乘法指令。操作同MUL。乘法指令对除CF和OF以外的条件标志位无定义。MUL中如果乘积的高一半为0则CF和OF都设置成0,否则设置成1。IMUL中如果高一半是低一半的符号扩展则设置成0,否则设置成1。(3) IMUL REG, SRC 操

7、作REG=REG*SRC。IMUL REG, SRC, IMM 操作 REG=SRC*IMM。根据溢出设置CF和OF。只有在286以后可用。2.4 除法指令(1) DIV 无符号除法指令。 格式:DIV SRC。字节操作AL=AX/SRC,AH=AX%SRC(即AL存商,AH存余数),字操作 AX=(DX:AX)/SRC,DX=(DX:AX)/SRC,双字操作 EAX=(EDX:EAX)/SRC,EDX=(EDX:EAX)/SRC。(2) IDIV 有符号乘法指令。操作同DIV。除法指令对条件标志位均无定义。2.5 十进制调整指令压缩的BCD码用4位二进制数表示一个十进制数位,非压缩的BCD码

8、用8位为一组表示一个十进制数位,8位中的低4位表示十进制数位,高4位则没有意义。所以十进制调整指令分成两组:1. 压缩BCD码调整指令 (1) DAA 加法的十进制调整指令。调整AL到BCD压缩码,指令执行之前必须执行ADD或ADC指令。调整的方法是:如果AF=1或者AL的低4位大于9,则AL内容加06H,设置AF=1;如果CF=1或者AL的高4位大于9,则AL内容加60H,设置CF=1。对OF无定义,但影响其他标志位。 (2) DAS 减法的十进制调整指令。调整AL到BCD压缩码,指令执行之前必须执行SUB或SBB指令。调整的方法是:如果AF=1或者AL的低4位大于9,则AL内容减60H,设

9、置AF=1;如果CF=1或者AL的高4位大于9,则AL内容减60H,设置CF=1。对OF无定义,但影响其他标志位。2. 非压缩BCD玛调整指令 (1) AAA 加法的ASCII调整指令。操作:把AL调整成非压缩的BCD码,AH=AH+调整产生的进位值,指令执行之前必须执行ADD或ADC指令。调整方法为:如果AF=1或者AL的低4位大于9,则AL内容加06H,AH内容加1,设置CF=AF=1,否则设置CF=AF=0;清除AL的高四位。其余标志位无定义。 (2) AAS 减法的ASCII调整指令。操作:把AL调整成非压缩的BCD码,AH=AH-调整产生的进位值,指令执行之前必须执行SUB或SBB指

10、令。调整方法为:如果AF=1或者AL的低4位大于9,则AL内容减06H,AH内容减1,设置CF=AF=1,否则设置CF=AF=0;清除AL的高四位。其余标志位无定义。 (3) AAM 乘法的ASCII调整指令。操作:AX=AL的积调整到非压缩BCD码。调整的方法是:把AL除以10,商放在AH中,余数保留在AL中。根据内容设置SF, ZF和PF,但OF, CF和AF无定义。3 逻辑指令3.1 逻辑运算指令(1) AND 逻辑与指令。(2) OR 逻辑或指令。(3) NOT 逻辑非指令。(4) XOR 逻辑异或指令。(5) TEST 测试指令,和AND一样,但是不保存结果,只影响标志位。以上指令都

11、设置CF=OF=0,AF无定义,根据结果设置SF, ZF, PF。3.2 位测试并修改指令本组指令在386以后可用。本组指令影响CF,其他标志无定义。(1) BT 位测试指令。格式:BT DEST, SRC,把DEST的第SRC位送入CF。(2) BTS 位测试并置1指令。先执行BT,并把DEST的该位置1。(3) BTR 位测试并置0指令。先执行BT,并把DEST的该位置0。(4) BTC 位测试并取反指令。先执行BT,并把DEST的该位取反。3.3 位扫描指令本组指令386以后可用,影响ZF,其他标志无定义。(1) BSF 正向位扫描指令。格式:BSF REG, SRC,从SRC的第0位开

12、始向右扫描,如遇到第一个为1的位,则把ZF置0,并把该位的位置送入REG;如果SRC=0,则把ZF置1,REG内容无定义。(2) BSR 反正位扫描指令。除了扫描的方向相反以外,其他和BSF一样。3.4 移位指令(1) SHL 逻辑左移指令。(2) SAL 算术左移指令。(3) SHR 逻辑右移指令。(4) SAR 算术右移指令。以上四条指令,在8086中如果移位次数大于1则必须把移位次数放在CL中,其他机型则可以使用立即数或者CL,移位次数从1-31。(5) ROL 循环左移指令。(6) ROR 循环右移指令。(7) RCL 带位循环左移指令。(8) RCR 带位循环右移指令。以上八条指令,

13、CF位根据各条指令的规定设置,OF位只有移位次数是1时才有效,否则无定义。如果移位次数是1,移位后最高有效位发生变化则OF=1,否则为0。移位指令根据结果影响SF, ZF, PF,AF则无定义;循环移位指令则不影响CF, OF以外的其他标志位。(9) SHLD 双精度左移指令。(10) SHRD 双精度右移指令。以上两条指令386以后可用。格式:SHLD DEST, REG, n,左移(DEST:REG),指令结束后不改变REG的值;格式:SHRD DEST, REG, n,右移(REG:DEST),指令结束后不改变REG的值。n在1到31之间,否则自动去模32。如果n=0则不影响各标志位。否

14、则根据结果设置SF, ZF, CF, PF,OF和AF的设置和其他移位指令一样。4 串处理指令(1) MOVS 串传送指令。(2) CMPS 串比较指令。(3) SCAS 串扫描指令。(4) LODS 从串取指令。(5) STOS 存入串指令。(6) INS 串输入指令。(7) PUTS 串输出指令。与上述指令配合只用的前缀指令有:(1) REP 重复。(2) REPE/REPZ 相等/为零则重复。(3) REPNE/REPNZ 不相等/不为零则重复。串操作指令是处理放在存储器中的数据串,所有串操作指令都可以处理字节或者字,386以后还可以处理双字。所有的串操作指令隐含的使用ESI当作源地址寄

15、存器(Source-Index),EDI当作目的地址寄存器(Destination-Index)。选择是加还是减由方向标志OF决定:OF=1时用加,OF=0时用减。4.1 与REP相配合的MOVS, STOS, LODS, INS, PUTS指令(1) REP 重复串操作直到记数寄存器(16位为CX,32位为ECX)的值为0。格式:REP 操作,每执行一次记数寄存器的内容减1,直到0停止。(2) MOVS 串传送指令:MOVSB(字节), MOVSW(字), MOVSD(双字)。操作:(Source-index)=(Destination-index)。Source-index= Source

16、-index1;destination-index=destination-index1。(字操作则2;双字操作则4) (3) STOS 存入串指令:STOSB(字节), STOSW(字), STOSD(双字)。操作: (Destination-index)=(AL)。 Destination-index=Destination-index1。(字操作则2,使用AX;双字操作则4,使用EAX) (4) LODS 从串取指令:LODSB(字节), LODSW(字), LODSD(双字)。操作: (AL)=(source-index)。 source-index=source-index1。(字操

17、作则2,使用AX;双字操作则4,使用EAX) (5) INS 串输入指令:INSB(字节), INSW(字), INSD(双字)。操作: (destination-index)=(DX)。(DX存放I/O端口) destination-index=destination-index1。(字操作则2;双字操作则4)(5) PUTS 串输出指令:PUTSB(字节), PUTSW(字), PUTSD(双字)。操作: (DX)=(source-index)。(DX存放I/O端口) source-index=source-index1。(字操作则2;双字操作则4)4.2 与REPE/REPZ和REPNE

18、/REPNZ联合工作的CMPS和SCAS指令(1) REPE/REPZ 执行方式和REP一样,但ZF=0时则退出。(2) REPNE/REPNZ 执行方式和REP一样,但ZF=1时则退出。(3) CMPS 串比较指令:CMPSB(字节), CMPSW(字), CMPSD(双字)。操作:(Source-index)-(Destination-index)。Source-index= Source-index1;destination-index=destination-index1。(字操作则2;双字操作则4) 相减后并不保留结果,只根据结果设置条件码。386后可用。(3) SCAS 串扫描指令

19、:SCASB(字节), SCASW(字), SCASD(双字)。操作:(AL)-(Destination-index)。destination-index=destination-index1。(字操作则2,使用AX;双字操作则4,使用EAX) 相减后并不保留结果,只根据结果设置条件码。386后可用。5 控制转移指令5.1 无条件转移指令JMP是无条件转移指令,分成两类:段内转移和段间转移。段内转移只是修改指令指针EIP(IP)的值,而段间转移还有修改代码段CS的值。(1) 段内直接短转移 JMP SHORT OPR 执行的操作是:EIP = EIP + OPR(8位的带符号位移量)(2) 段

20、内直接近转移 JMP NEAR PTR OPR 执行的操作是:EIP = EIP + OPR(32位的带符号位移量) (3) 段内间接近转移 JMP WORD PTR OPR 执行的操作是:EIP = (EA),即OPR的存储值。 (4) 段间直接远转移 JMP FAR PTR OPR 执行的操作是: EIP = OPR的段内地址偏移量 CS = OPR所在段的段地址 (5) 段间见解远转移 JMP DWORD PTR OPR 执行的操作是:EIP = (EA) CS = (EA+4)5.2 条件转移指令条件转移在8086和80286中只提供短转移格式,386以后还提供了近转移格式,这样就可以

21、访问段内的任何位置。但是条件转移指令不提供段间远转移格式,如需要可以转换成JMP指令来解决。1. 根据单个标志设置转移情况:(1) JZ(or JE) 结果为零(或相等)则转移 测试条件:ZF = 1(2) JNZ(or JNE) 结果不为零(或不相等)则转移 测试条件:ZF = 0(3) JS 结果为负则转移 测试条件:SF = 1(4) JNS 结果不为负则转移 测试条件:SF = 0(5) JO 溢出则转移 测试条件:OF = 1(6) JNO 不溢出则转移 测试条件:OF = 0(7) JP(or JPE) 奇偶位为1则转移 测试条件:PF = 1(8) JNP(or JNPE) 奇偶

22、位为0则转移 测试条件:PF = 0(9) JC(or JB, or JNAE) 进位,或低于,或不高于或者等于,则转移 测试条件:CF = 1(10) JNC(or JNB, or JAE) 不进位,或不低于,或高于或者等于,则转移 测试条件:CF = 02. 比较两个无符号数CMP A, B,并根据比较结果转移(1) JC(or JB, or JNAE) 转移条件:A = B(3) JBE(or JNA) 转移条件:A B 测试条件:CF OR ZF = 03. 比较两个带符号数CMP A, B,并根据比较结果转移 (1) JL(or JNGE) 转移条件:A =B 测试条件:SF XOR

23、 OF = 0 (3) JLE(or JNG) 转移条件:A B 测试条件:(SF XOR OF) OR ZF = 04. 测试CX或者ECX值为0则转移指令 (1) JCXZ CX寄存器内容为0则转移 测试条件:(CX) = 0 (2) JECXZ ECX寄存器内容为0则转移 测试条件:(ECX) = 0 这一组指令只能提供8位的位移量,即他们只能做短转移5. 条件指令设置 指令格式:SETcc DEST,把对应的条件码cc的值存入DEST,386后可用。其结果都相对于转移条件。根据单个标志位把DEST置1:(1) SETZ(or SETE) 测试条件:ZF = 1(2) SETNZ(or

24、SETNE) 测试条件:ZF = 0(3) SETS测试条件:SF = 1(4) SETNS测试条件:SF = 0(5) SETO测试条件:OF = 1(6) SETNO测试条件:OF = 0(7) SETP(or SETPE) 测试条件:PF = 1(8) SETNP(or SETPO) 测试条件:PF = 0(9) SETC(or SETB, or SETNAE) 测试条件:CF = 1(10) SETNC(or SETNB, or SETAE) 测试条件:CF = 0比较两个无符号数CMP A, B,并根据比较结果把DEST置 1(1) SETC(or SETB, or SETNAE)

25、测试条件:A = B(3) SETBE(or SETNA) 测试条件:A B比较两个有符号数CMP A, B,并根据比较结果把DEST置 1(1) SETL(or SETNGE) 测试条件:A = B(3) SETLE(or SETNG) 测试条件:A B5.3 循环指令(1) LOOP 测试条件:ECX(CX) = 0(2) LOOPZ/LOOPE 测试条件:ZF = 1 且 ECX(CX) = 0(3) LOOPNZ/LOOPNE 测试条件:ZF = 0 且 ECX(CX) = 0以上三条指令的执行步骤是: ECX(CX) = ECX(CX) 1 检查是否满足测试条件,如果满足则跳转到标号

26、处,只能是短转移。5.4 子程序(1) CALL DEST 调用程序段内直接近调用:PUSH(EIP); EIP = EIP + D32。段内间接近调用:PUSH(EIP); EIP = (EA)。段间直接远调用:PUSH(CS); PUSH(EIP); EIP = DEST指定的偏移地址 CS = DEST指定的段地址。段间间接远调用:PUSH(CS); PUSH(EIP); IP=(EA); CS = (EA+2)。上述CALL并没加上NEAR PTR和FAR PTR等属性操作符,实际中可以根据具体情况加上,使用方法参考JMP。(2) RET (EXP) 返回指令段内近返回RET:POP

27、EIP。段内带立即数近返回 RET EXP:POP EIP; ESP = ESP + EXP。段间远返回RET:POP EIP; POP CS。段间带立即数远返回RET EXP:POP EIP; POP CS; ESP = ESP + EXP。5.5 中断当CPU响应中断是,把EIP和CS还有标志寄存器FLAGS保存入栈;中断返回时恢复EIP, CS和FLAGS。中断入口地址称中断向量,存储器的最低地址区的1024字节称中断向量区,存放着256个类型中断例行程序入口地址。(1) INT N 中断指令。N的值在0到255之间,若缺省N则隐含类型号为3。不影响除IF, TF, AC以外的标志位(I

28、NTO也如此)。操作:PUSH(FLAGS); IF=0; TF= 0; AC=0; PUSH(CS); PUSH(IP); IP=N*4; CS = N*4 + 2。(2) INTO 若溢出则中断指令。若OF=1调用4号类型的中断。(3) IRET/IRETD 从中断返回指令。IRET用于16位,IRETD用于32位。操作(16位):POP IP; POP CS; POP FLAGS。6 处理机控制与杂项操作指令(1) NOP 无操作指令。机器码占用一个字节存储单元。(2) HLT 停机指令。使CPU处于停机状态等待一次外部中断到来,中断过后继续执行下面的程序。(3) WAIT 等待指令。使

29、CPU处于空转状态等待外部中断发生,中断后继续处于等待状态。(4) LOCK 封锁指令。该指令是一前缀,和其他指令配合使用,用来维持总线的锁存信息,知道与其联合的指令执行完。(5) BOUND REG, MEM 界限指令。检查数组的下标是否在上下界以内;如果是则执行下一指令,否则产生5号中断,中断返回时返回地址仍指向BOUND指令。REG存放数组下标,MEM存放上下界。(6) ENTER IMM16, IMM8 建立堆栈桢指令。IMM16指定堆栈桢的大小,IMM8给出过程嵌套层数,范围是0到31。执行的操作是:PUSH EBP; EBP = ESP; 建立堆栈;EBP = ESP IMM16。

30、7 伪操作(MASM)7.1 1. 处理器选择 .8086 .286 .286P .386 .386P .486 .486P .586 .586P7.2 2. 段定义(1) 完整的段定义 segment name SEGMENT align-type combine-type use-typeclass segment name ENDS此外,还必须用ASSUME指明段和段寄存器的关系:ASSUME register name : segment name。取消指定用ASSUME NOTHING。ASSUME只是指定,并不把段地址装入相应的段寄存器中,除了代码段其他都必须用MOV命令装入。 定位类型(align-

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1