收藏 分享(赏)

汇编指令、伪指令大全.doc

上传人:精品资料 文档编号:8899021 上传时间:2019-07-16 格式:DOC 页数:19 大小:123KB
下载 相关 举报
汇编指令、伪指令大全.doc_第1页
第1页 / 共19页
汇编指令、伪指令大全.doc_第2页
第2页 / 共19页
汇编指令、伪指令大全.doc_第3页
第3页 / 共19页
汇编指令、伪指令大全.doc_第4页
第4页 / 共19页
汇编指令、伪指令大全.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、 MOV 指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC / Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用 CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH 入栈指令及 POP出栈指令: 堆栈操作是以“后进先出“的方式进行数据操作.PUSH SRC /Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST /Word出栈操作数除不允许用立

2、即数和 CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行 POP SS指令后,堆栈区在存储区的位置要改变.执行 POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 /Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) /Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入 B

3、X中的表格首地址,执行后,AL 中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC /指令把源操作数 SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc 注: SRC 只能是各种寻址方式的存储器操作数,REG 只能是 16位寄存器MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONEMOV SP , BX /将 BX间接寻址的相继的二个存储单元的内容送入 SP中LEA SP , BX /将 BX的内容作为存储器有效地址送入 SP中LDS(Load DS wi

4、th pointer)指针送寄存器和 DS指令LDS REG , SRC /常指定 SI寄存器。执行操作: REG=(SRC), DS=(SRC+2) /将 SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入 DS段寄存器中。LES (Load ES with pointer) 指针送寄存器和 ES指令LES REG , SRC /常指定 DI寄存器执行操作: REG=(SRC) , ES=(SRC+2) /与 LDS大致相同,不同之处是将 ES代替 DS而已.LAHF ( Load AH with Flags ) 标志位送 AH指令LAHF /将 PSW寄存器中的低

5、 8位的状态标志(条件码)送入 AH的相应位, SF 送 D7位, ZF 送 D6位.执行操作: AH=PSW 的低位字节。SAHF ( Store AH into Flags ) AH 送标志寄存器指令SAHF /将 AH寄存器的相应位送到 PSW寄存器的低 8位的相应位, AH 的 D7位送 SF, D6位送 ZF执行操作: PSW 的低位字节=AH。PUSHF ( PUSH the Flags) 标志进栈指令PUSHF /将标志寄存器的值压入堆栈顶部, 同时栈指针 SP值减 2执行操作: SP=SP-1,(SP)=PSW 的高 8位, SP=SP-1, (SP)=PSW 的低 8位POP

6、F ( POP the Flags ) 标志出栈指令POPF /与 PUSHF相反, 从堆栈的顶部弹出两个字节送到 PSW寄存器中, 同时堆栈指针值加 2执行操作: PSW 低 8位=(SP), SP=SP+1, PSW 高 8位=(SP) , SP=SP+1输入输出指令(IN,OUT):只限于使用累加器 AX或 AL与外部设备的端口传送信息.IN (INput)输入指令:信息从 I/O通过累加器传送到 CPUIN AL , PORT /直接的字节输入,PORT 是外设端口编号(即端口地址),只能取 00H 0FFH 共 256个端口地址.IN AX , PORT /直接的字输入,AX 存储连

7、续两个端口地址 PORT+1,PORTIN AL , DX /间接的字节输入,端口地址范围可通过 DX设置为 0000H 0FFFFH共 65536个端口地址IN AX , DX /间接的字输入OUT( OUTput)输出指令 :信息从 CPU通过累加器传送到 I/OOUT PORT , AL /直接的字节输出,PORT 规定与 IN指令相同.OUT PORT , AXOUT DX , AL /间接的字节输出OUT DX , AXMOV AL,05H OUT 27H, AL /将字节 05H传送到地址 27H的端口ADD(ADD)加法指令ADD DST , SRC /Byte/Word执行操作

8、: dst=dst+src1.两个存储器操作数不能通过 ADD指令直接相加, 即 DST 和 SRC必须有一个是通用寄存器操作数.2.段寄存器不能作为 SRC 和 DST.3.影响标志位 Auxiliary Crray Flag ,Carry Flag, Overflow Flag, Parity Flag, Sign Flag 和Zero Flag ,如下所示:CF 根据最高有效位是否有进(借)位设置的:有进(借)位时 CF=1, 无进(借)位时 CF=0. OF 根据操作数的符号及其变化来设置的:若两个操作数的符号相同,而结果的符号与之相反时 OF=1, 否则为 0. ZF 根据结果来设置

9、:不等于 0时 ZF=0, 等于 0时 ZF=1 SF 根据结果的最高位来设置:最高位为 0, 则 SF=0. AF 根据相加时 D3是否向 D4进(借)位来设置:有进(借)位时 AF=1, 无进(借)位时 AF=0 PF 根据结果的 1的个数时否为奇数来设置:1 的个数为奇数时 PF=0, 为偶数时 PF=1 ADC( ADd with Carry)带进位加法指令ADC DST , SRC /Byte/Word执行操作: dst=dst+src+CF /与 ADD不同之处是还要加上进位标志位的值.INC ( INCrement) 加 1指令INC OPR /Byte/Word执行操作: OP

10、R=OPR+11.OPR 可以是寄存器和存储器操作数, 但不能是立即数和段寄存器2.影响标志位 OF,SF,ZF,PF 和 AF,不影响 CF.SUB ( SUBtract ) 不带借位的减法指令SUB DST , SRC /Byte/Word执行操作:dst=dst - src1.DST 和 SRC寻址方式及规定与 ADD相同.2.影响全部标志位.(判断标志位参见 ADD)SBB ( SuBtract with Borrow) 带借位减法指令SBB DST , SRC /Byte/Word执行操作:dst= dst - src - CFDEC ( DECrement ) 减 1指令DEC O

11、PR /Byte/Word执行操作:OPR = OPR - 1 /除 CF标志位, 其余标志位都受影响.NEG ( NEGate ) 求补指令NEG OPR执行操作:opr = 0- opr /将操作数按位求反后末位加 1.CMP ( CoMPare ) 比较指令CMP OPR1 , OPR2 执行操作:OPR1 - OPR2 /与 SUB指令一样执行运算, 但不保存结果.比较情况 无符号数 有符号数A=B ZF=1 ZF=1 AB CF=0 一、内存单元别名定义伪指令 THIS在程序中,如果需要以另外一种数据类型来访问同一存储单元时,可用强制类型转换操作符 PTR来实现.但是,如果在程序中药

12、经常以某种其它数据类型来访问同一存储单元的话,就必须在每次访问时都要加上强制类型转换操作符 PTR;这样做虽然可行,但是,给编写程序带来了不必要的麻烦;于是,汇编语言提供了另外一种操作符:THIS,它为同一存储单元取了另外一个别名,该别名可具有其自身的数据属性,但是段地址和偏移量是不变的;THIS操作符的一般格式: THIS 数据类型其中,数据类型就是常用的数据类型:BYTE、WORD、DWORD、NEAR、FAR,等等;例如:WBUFFER EQU THIS WORD ;为下面一行的变量定义语句中定义的字节变量 BUFFER取另外一个别名WBUFFER,类型是 WORD类型;EQU 为等价操

13、作符;BUFFER DB 20 DUP(0) ;定义一个有 20个 DB型元素的数组变量;经过这样的别名定义之后,就可以使用 BUFFER来引用这个具有 20个 DB型元素的数组变量,通过变量BUFFER的别名 WBUFFER也可以引用这个数组,但是,使用别名 WBUFFER引用的是一个具有 10个 WORD(DW)型元素的数组;别名 WBUFFER与变量名 BUFFER具有完全相同的段地址和完全相同的段内偏移地址;它俩分别使用不同的数据类型来引用同一块内存区;这样,同一块内存区就具有两种不同的数据类型;于是,在指令中,引用不同的变量名,就具有不同的数据属性,但是段地址和段内偏移地址还是不变的

14、:A.如果引用变量别名 WBUFFER,则是按照“字“属性来访问的;B.如果引用变量名 BUFFER,则是按照“字节“属性来访问的;下面两条指令的效果是等价的:MOV AX,WORD PTR BUFFERMOV AX,WBUFFER二、符号定义伪指令符号定义伪指令有:等价伪指令 EQU、等号伪指令=、符号名/标号名伪指令 LABEL1、等价伪指令 EQU:一般格式:符号名 EQU 表达式功能:使用 EQU左边的“符号名“代表 EQU右边的“表达式“;注意:等价定义语句不会给符号名分配存储空间,符号名不能与其它符号名同名,必须唯一,也不能被重新定义;A.用符号名代表常量或表达式:当把一个常量或表

15、达式定义成一个具有一定含义的符号名之后,在程序中就可以使用该符号名来代表该常量或表达式了;例如:NUMBER EQU 100 ;给缓冲区的长度取一个符号名BUFF_LEN EQU NUMBER+2CR EQU 13 ;给“回车“符的 ASCII码定义一个符号名LN EQU 10 ;给“换行“符的 ASCII码定义一个符号名BUFFER DB NUMBER,?,NUMBER DUP(?) ;用符号名来定义缓冲区;B.用符号名代表字符串:用一个具有一定含义的符号名定义某一个较长的字符串,在随后的程序中就是用该符号名;例如:GREETING EQU How are you!在该定义之后,就可直接使用

16、符号名 GREETING带代表字符串“How are you!“了;C.用符号名代表关键字或指令码例如:MOVE EQU MOV ;给指令码 MOV取另外一个别名 MOVECOUNTER EQU CX ;给寄存器 CX取一个叫做 COUNTER的符号名在该定义之后,就可以直接使用 MOVE和 COUNTER来分别代表 MOV和 CX了:MOVE AX,CX ;相当于指令 MOV AX,CXMOV COUNTER,BX ;相当于指令 MOV CX,BXD.用符号名代表存储单元的别名:可对同一片存储区定义另一个数据类型的符号名;例如:WORD1 EQU THIS WORD ;给后面的字节存储单元

17、BYTE1取一个字属性的符号名BYTE1 DB 12H,21HFLAG DW 1234HFLAG1 EQU BYTE PTR FLAG ;给字变量 FLAG的低字节取一个字节属性的符号名 FLAG1FLAG2 EQU BYTE PTR FLAG+1 ;给字变量 FLAG的高字节取一个字节属性的符号名 FLAG2在该定义之后,就可以这样使用了:MOV AX,WORD1 ;执行后,(AX)=2112HMOV BL,FLAG1 ;执行后,(BL)=34HMOV AL,FLAG2 ;执行后,(AL)=12HE.使用符号名代表系统提供的一串符号:例如:BT EQU BYTE PTR ;给强制类型转换语句

18、“BYTE PTR“取个符号名 BTWT EQU WORD PTR ;给强制类型转换语句“WORD PTR“取个符号名 WT有了这样的定义,就可以这样使用了:SCORE DW 90 ;定义一个字类型变量MOV AL,BT SCORE ;取字类型变量 SCORE的低字节存放到 AL中;2.等号伪指令“=“汇编语言提供了使用等号“=“伪指令来定义符号常数的方法,即:可用符号名代表一个常数;一般格式如下:一般格式如下:符号名 = 数值表达式功能:用等号伪指令“=“左边的“符号名“代表等号伪指令“=“右边的“数值表达式“;注意:数值表达式在汇编时就应该可以计算出数值,它不能含有向前引用的符号名;使用等

19、号伪指令“=“定义的符号可以被重新定义,可被重新赋值;例如:ABC = 10 + 200*5 ;ABC的值是 1010ABC1 = 5*ABC + 21 ;ABC1的值是 5071COUNT = 1 ;COUNT的值是 1COUNT = 2*COUNT + 1 ;COUNT的值是 3等价伪指令 EQU与等号伪指令“=“的区别:A.使用 EQU伪指令定义的符号名不能与其它符号名重名,符号名必须唯一,且不能被重新定义;而使用等号伪指令“=“定义的符号名可以重名,可以被重新定义,可被重新赋值;B.使用 EQU伪指令定义的符号名不仅可以代表某个常数或常数表达式,还可以代表字符串、关键字、指令码、一串符

20、号(如:WORD PTR),等等;而使用等号伪指令“=“定义的符号名仅仅用于代表数值表达式;C.使用等价伪指令 EQU定义的符号名和使用等号伪指令定义的符号名都不会被系统分配存储空间;3.符号名定义伪指令 LABEL符号名定义伪指令 LABEL与存储单元别名操作符 THIS的功能类似,该伪指令定义一个指定的符号名,该符号名的段地址和段内偏移地址与下面紧跟着的一条变量定义语句中定义的变量的相应属性完全相同;但是该符号的类型是新指定的;LABEL 伪指令的一般格式如下:符号名 LABEL 数据类型其中,数据类型就是常用的数据类型:BYTE、WORD、DWORD、结构类型、记录类型、NEAR、FAR

21、,等等;前面 5种类型是变量的类型,后面 2种类型是标号的类型;如果格式中的“数据类型“是前面 5种类型之一,那么,符号名就是变量名;如果格式中的“数据类型“是后面 2中类型之一,那么,符号名就是标号名;例如:WBUFFER LABEL WORD ;WBUFFER与 BUFFER具有相同的段地址和段内偏移地址,但是它们的数据类型不同;BUFFER DB 200 DUP(?)NEXT1 LABEL FAR ;NEXT1与 NEXT具有相同的段地址和段内偏移地址,但是,NEXT1 是“远标号“,NEXT是“近标号“NEXT: MOV AX,BX标号 NEXT1和 NEXT可用于不同的情况:当在同一

22、个模块内部转移时,可使用近标号 NEXT;当在不同的模块之间转移时,可使用远标号 NEXT1;三、偏移量调整伪指令偏移量调整伪指令是在内存变量定义时用来调整内存变量起始偏移量的,它们在把源程序文件汇编成目标文件时起作用的;常用于偏移量调整的伪指令有:EVEN、ALIGN 和 ORG;它们的主要目的是:为了更有效地读取内存单元的内容;1、偶对齐伪指令 EVEN:一般格式: EVEN该伪指令的作用是:告诉汇编程序(Assember),本伪指令下面的内存变量从下一个偶地址单元开始分配;如果下一个存储单元的偏移地址恰好是个偶地址,那么该伪指令不起作用,否则,汇编程序将空出一个字节,从下一个偶地址单元处

23、开始为其后的变量分配内存单元;假设有如下变量定义,并且变量 B1的偏移量是偶数,其内存单元分布,如下“图甲“所示:B1 DB 12H ;为了方便理解,不妨设 B1的偏移量为 XXXX0HW1 DW 4567H在上述定义情况下,在许多 CPU系统中,当要读取字变量 W1及其后面的字内容时,硬件设备将按照“图乙“所示的方式分两次读出该字内从容,然后再拼接成一个字的内容,这样,很明显,需要两个读内存周期,从而影响程序执行速度;出现上述问题的原因主要是字变量 W1在数据段内的偏移地址是奇数,为了保证其偏移量是偶数,需要在其定义之前加上伪指令 EVEN:B1 DB 12HEVENW1 DW 4567H这

24、样定义之后,变量的内存分配机诶读取字变量 W1的过程,如“图丙“所示:这个时候,要读取字变量 W1及其后面的字内存是,只需要一个读内存周期既可;2、对齐伪指令 ALIGN一般格式:ALIGN Num其中,Num 必须是 2的幂次方,比如:1、2、4、8、16,等等;该伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能够被 Num整除的内存单元地址处开始分配内存;如果下一个内存单元的地址恰好能被 Num整除,则该伪指令不起作用,否则,汇编程序将会空出若干字节,直到下一个内存单元地址能被 Num整除为止;下面的两组对齐效果是一致的:第一组:B1 DB 12HEVENW1 DW 45

25、67H第二组:B1 DB 12HALIGN 2W1 DW 4567H不难看出,伪指令 ALIGN的功能要比 EVEN更强大;3.ORG伪指令一般格式:ORG 数值表达式该伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量从“数值表达式“所指定的偏移地址处开始分配内存;假设有如下定义,且变量 WORD1的偏移量为 0:WORD1 DW 1234H ;offset = 0BYTE1 DB 56HWORD2 DW 0abcdHORG 1BYTE2 DB ?WORD3 DW ?BYTE3 DB ?其中,前三个内存变量的分配如“图丁“左边所示,但是,由于伪指令“ORG 1“的作用,说明其后面所定义的变

26、量要从偏移地址为“1“的内存地址处开始分配内存;所以,后面三个变量的内存分布如“图丁“右边所示;由此可见,这些变量的内存分配是相互重叠的,对某个变量的操作,很明显,会影响到与之重叠的变量;另外,BYTE2、WORD3、BYTE3 没有被赋初值,如果赋初值的话,则重叠部分的内存单元中原来的初值将会被覆盖掉;以上就是三个伪指令 EVEN、ALIGN 和 ORG的使用,其中,伪指令 EVEN的使用频率较高;我学习的时候整理出来的,希望对新手有所帮助,我总时犯这方面的错误数据传送指令MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器 CS 不能作为目的;指令指针 IP 不能作为源和目

27、的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。XCHG 交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。LEA 16 位寄存器 存储器操作数 传送有效地址指令:必须是一个 16 位寄存器和存储器操作数。LDS 16 位寄存器 存储器操作数 传送存储器操作数 32 位地址,它的 16 位偏移地址送 16 位寄存器,16位段基值送入 DS 中。LES :同上,只是 16 位段基址送 ES 中。堆栈操作指令PUSH 操作数,操作数不能使用立即数,POP 操作数, 操作数不能是 CS 和立

28、即数标志操作指令LAHF:把标志寄存器低 8 位,符号 SF,零 ZF,辅助进位 AF,奇偶 PF,进位 CF 传送到 AH 指定的位。不影响标志位。SAHF:与上相反,把 AH 中的标志位传送回标志寄存器。PUSHF:把标志寄存器内容压入栈顶。POPF:把栈顶的一个字节传送到标志寄存器中。CLC:进位位清零。STC:进位位为 1。CMC:进位位取反。CLD:使方向标志 DF 为零,在执行串操作中,使地址按递增方式变化。STD:DF 为 1。CLI:清中断允许标志 IF。Cpu 不相应来自外部装置的可屏蔽中断。STI:IF 为 1。加减运算指令注意: 对于此类运算只有通用寄存器和存储单元可以存

29、放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。ADD。ADC:把进位 CF 中的数值加上去。INC:加 1 指令SUB。SBB:把进位 CF 中数值减去。DEC:减 1 指令。NEG 操作数:取补指令,即用 0 减去操作数再送回操作数。CMP:比较指令,完成操作数 1 减去操作数 2,结果不送操作数 1,但影响标志位。可根据 ZF(零)是否被置 1 判断相等;如果两者是无符号数,可根据 CF 判断大小;如果两者是有符号数,要根据 SF 和 OF判断大小。乘除运算指令MUL 操作数 :无符号数乘法指令。操作数不能是立即数。操作数是字节与 AL 中的无符

30、号数相乘,16 位结果送 AX 中。若字节,则与 AX 乘,结果高 16 送 DX,低 16 送 AX。如乘积高半部分不为零,则 CF、OF 为 1,否则为 0。所以 CF 和 OF 表示 AH 或 DX 中含有结果的有效数。IMUL 操作数 :有符号数乘法指令。基本与 MUL 相同。DIV 操作数 :被除数是在 AX(除数 8 位)或者 DX 和 AX(除数 16 位) ,操作数不能是立即数。如果除数是 0,或者在 8(16)位除数时商超过 8(16)位,则认为是溢出,引起 0 号中断。IDIV:有符号除法指令,当除数为 0,活着商太大,太小(字节超过 127,127 字超过 32767,3

31、2767)时,引起 0 号中断。符号扩展指令CBW,CWD: 把 AL 中的符号扩展到寄存器 AH 中,不影响各标志位。CWD 则把 AX 中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用 XOR 清高 8 位或高 16 位。逻辑运算指令与位移指令注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。NOT:取反,不影响标志位。AND 操作数 1 操作数 2:操作结果送错作数 1,标志 CF(进位) 、 OF(溢出)清 0,PF (奇偶)ZF(0 标志) SF(符号)反映运算结果,AF(辅助进位)

32、未定义。自己与自己 AND 值不变,她主要用于将操作数中与 1 相与的位保持不变,与 0 相与清 0。 (都为 1 时为 1)OR 操作数 1 操作数 2:自己与自己 OR 值不变,CF(进位) 、OF(溢出)清 0,PF(奇偶)ZF(0 标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置 1:与 1 相或为 1,保持不变的位与 0 相或。 (都为 0 时为 0)XOR 操作数 1 操作数 2:自己与自己异或结果为 0,标志 CF(进位) 、OF(溢出)清 0,PF(奇偶)ZF(0)SF(符号)反映运算结果,AF(辅助进位)未定义。主要用于将若干位取反的操作:与 1 异

33、或取反,与 0 异或保持不变。 (相同为 0,不同为 1)TEST 操作数 1 操作数 2:测试指令,和 AND 相同,但结果不送操作数 1,各标志位同 AND 操作。位移指令SAL/SHL 操作数 1 或 CL:算术左移与逻辑左移进行相同的动作,操作数是通用寄存器或者存储器操作数,位移数为 1 或为 CL;最高位移 CF(进位) ,右边用 0 补位。左移一次相当源操作数乘 2。SAR 操作数 1 或 CL:算术右移,位移数为 1 或为 CL;操作数是通用寄存器或者存储器操作数,左符号位保持不变,移出最低位进 CF(进位) 。相当源操作数除 2。SHR 操作数 1 或 CL :逻辑右移,操作数

34、是通用寄存器或者存储器操作数,位移数为 1 或为 CL;左边用 0 补足,移出的最低位进 CF(进位)对于无符号数,右移一位相当于除 2。ROL/ROR 操作数 1 或 CL: 不带进位左移/右移,操作数是通用寄存器或者存储器操作数,位移数为 1或为 CL。RCL/RCR 操作数 1 或 CL: 带进位左移 /右移,CF(进位)参与循环。操作数是通用寄存器或者存储器操作数,位移数为 1 或为 CL。转移指令注意:由于代码段可分为多个段,所以根据转移时是否重置代码段寄存器 CS 内容,可分为段内转移和段间转移。段内转移仅重置 IP 的转移,转移后指令仍在同一代码段中。段间转移重置 CS,所以转移

35、后继续执行的指令在另一个段中。JMP 标号 :无条件跳转到标号位置执行,段内直接转移指令。地址差用一个字节表示为短转移,用一个字表示为近转移。JMP 通用寄存器 /存储单元:无条件段间间接转移指令,操作数给定的是目标地址处。JMP FAR PTR 标号:无条件段间直接转移指令,她的具体动作是把指令中包含的目标地址的段值和偏移分别置茹 CS 和 IP。JMP 操作数:无条件段间间接转移指令,操作数是双字存储单元,给定目标地址,低字节送 IP,高字节送 CS。条件转移指令:所有的条件转移指令都是段内转移。她是由 J 加上相应的含义字母组合成。有符号数关系G(大于) ,E(等于) ,L(小于) ;无

36、符号数关系 A(高于) 、E(等于)和 B(低于) ;字母 N 表示“不”:NB (不小于) ,NE(不等于) 。循环指令LOOP 标号:她使寄存器 CX 减 1,若结果不等于 0 则转到标号,否则顺序执行 LOOP 指令后的指令。最多循环 65536 次。LOOPE/LOOPZ 标号:等于/全零循环指令。CX 的值减 1,如果结果不等于 0,并且 ZF(0 标志)等于 1,则转移到标号。LOOPNE/LOOPNZ 标号:不等于/非零循环指令,CX 的值减 1,如果结果不等于 0,并且 ZF(0 标志)等于 0,则跳转到标号。JCXZ 标号: 该指令实现当寄存器 CX 的值等于 0 转移到标号

37、,否则顺序执行。通常该指令用在循环开始前,以便在循环次数位 0 时,跳过循环体。数据传送指令MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器 CS 不能作为目的;指令指针 IP 不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。XCHG 交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。LEA 16 位寄存器 存储器操作数 传送有效地址指令:必须是一个 16 位寄存器和存储器操作数。LDS 16 位寄存器 存储器操作数 传送存储器操作数 32 位地址,它

38、的 16 位偏移地址送 16 位寄存器,16 位段基值送入 DS 中。LES :同上,只是 16 位段基址送 ES 中。堆栈操作指令PUSH 操作数,操作数不能使用立即数,POP 操作数, 操作数不能是 CS 和立即数标志操作指令LAHF:把标志寄存器低 8 位,符号 SF,零 ZF,辅助进位 AF,奇偶 PF,进位 CF 传送到 AH 指定的位。不影响标志位。SAHF:与上相反,把 AH 中的标志位传送回标志寄存器。PUSHF:把标志寄存器内容压入栈顶。POPF:把栈顶的一个字节传送到标志寄存器中。CLC:进位位清零。STC:进位位为 1。CMC:进位位取反。CLD:使方向标志 DF 为零,

39、在执行串操作中,使地址按递增方式变化。STD:DF 为 1。CLI:清中断允许标志 IF。Cpu 不相应来自外部装置的可屏蔽中断。STI:IF 为 1。加减运算指令注意: 对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。ADD。ADC:把进位 CF 中的数值加上去。INC:加 1 指令SUB。SBB:把进位 CF 中数值减去。DEC:减 1 指令。NEG 操作数:取补指令,即用 0 减去操作数再送回操作数。CMP:比较指令,完成操作数 1 减去操作数 2,结果不送操作数 1,但影响标志位。可根据 ZF(零)是否

40、被置 1 判断相等;如果两者是无符号数,可根据 CF 判断大小;如果两者是有符号数,要根据SF 和 OF 判断大小。乘除运算指令MUL 操作数 :无符号数乘法指令。操作数不能是立即数。操作数是字节与 AL 中的无符号数相乘,16 位结果送 AX 中。若字节,则与 AX 乘,结果高 16 送 DX,低 16 送 AX。如乘积高半部分不为零,则 CF、OF 为 1,否则为 0。所以 CF 和 OF 表示 AH 或 DX 中含有结果的有效数。IMUL 操作数 :有符号数乘法指令。基本与 MUL 相同。DIV 操作数 :被除数是在 AX(除数 8 位)或者 DX 和 AX(除数 16 位),操作数不能

41、是立即数。如果除数是 0,或者在 8(16)位除数时商超过 8(16)位,则认为是溢出,引起 0 号中断。IDIV:有符号除法指令,当除数为 0,活着商太大,太小(字节超过 127,127 字超过 32767,32767)时,引起 0 号中断。符号扩展指令CBW,CWD: 把 AL 中的符号扩展到寄存器 AH 中,不影响各标志位。CWD 则把 AX 中的符号扩展到 DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用 XOR 清高8 位或高 16 位。逻辑运算指令与位移指令注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类

42、型必须一致。NOT:取反,不影响标志位。AND 操作数 1 操作数 2:操作结果送错作数 1,标志 CF(进位)、OF(溢出)清 0, PF(奇偶)ZF (0 标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己 AND 值不变,她主要用于将操作数中与 1 相与的位保持不变,与 0 相与清 0。(都为1 时为 1)OR 操作数 1 操作数 2:自己与自己 OR 值不变, CF(进位)、OF(溢出)清 0,PF(奇偶)ZF(0 标志) SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置 1:与 1 相或为1,保持不变的位与 0 相或。(都为 0 时为 0)XOR

43、 操作数 1 操作数 2:自己与自己异或结果为 0,标志 CF(进位)、OF(溢出)清 0,PF(奇偶)ZF (0 )SF (符号)反映运算结果,AF(辅助进位)未定义。主要用于将若干位取反的操作:与1 异或取反,与 0 异或保持不变。(相同为 0,不同为 1)TEST 操作数 1 操作数 2:测试指令,和 AND 相同,但结果不送操作数 1,各标志位同 AND 操作。位移指令SAL/SHL 操作数 1 或 CL:算术左移与逻辑左移进行相同的动作,操作数是通用寄存器或者存储器操作数,位移数为 1 或为 CL;最高位移 CF(进位),右边用 0 补位。左移一次相当源操作数乘 2。SAR 操作数

44、1 或 CL:算术右移,位移数为 1 或为 CL;操作数是通用寄存器或者存储器操作数,左符号位保持不变,移出最低位进CF(进位)。相当源操作数除 2。SHR 操作数 1 或 CL :逻辑右移,操作数是通用寄存器或者存储器操作数,位移数为 1 或为 CL;左边用 0 补足,移出的最低位进 CF(进位)对于无符号数,右移一位相当于除 2。ROL/ROR 操作数 1 或 CL: 不带进位左移 /右移,操作数是通用寄存器或者存储器操作数,位移数为 1 或为 CL。RCL/RCR 操作数 1 或 CL: 带进位左移/ 右移,CF (进位)参与循环。操作数是通用寄存器或者存储器操作数,位移数为 1 或为

45、CL。转移指令注意:由于代码段可分为多个段,所以根据转移时是否重置代码段寄存器 CS 内容,可分为段内转移和段间转移。段内转移仅重置 IP的转移,转移后指令仍在同一代码段中。段间转移重置 CS,所以转移后继续执行的指令在另一个段中。JMP 标号 :无条件跳转到标号位置执行,段内直接转移指令。地址差用一个字节表示为短转移,用一个字表示为近转移。JMP 通用寄存器/存储单元:无条件段间间接转移指令,操作数给定的是目标地址处。JMP FAR PTR 标号:无条件段间直接转移指令,她的具体动作是把指令中包含的目标地址的段值和偏移分别置茹 CS 和 IP。JMP 操作数:无条件段间间接转移指令,操作数是

46、双字存储单元,给定目标地址,低字节送 IP,高字节送 CS。条件转移指令:所有的条件转移指令都是段内转移。她是由 J 加上相应的含义字母组合成。有符号数关系 G(大于),E (等于),L(小于);无符号数关系 A(高于)、E(等于)和 B(低于);字母 N 表示“不” :NB (不小于),NE(不等于)。循环指令LOOP 标号:她使寄存器 CX 减 1,若结果不等于 0 则转到标号,否则顺序执行 LOOP 指令后的指令。最多循环 65536 次。LOOPE/LOOPZ 标号:等于/全零循环指令。CX 的值减 1,如果结果不等于 0,并且 ZF(0 标志)等于 1,则转移到标号。LOOPNE/LOOPNZ 标号:不等于/非零循环指令, CX 的值减 1,如果结果不等于 0,并且 ZF(0 标志)等于 0,则跳转到标号。JCXZ 标号: 该指令实现当寄存器 CX 的值等于 0 转移到标号,否则顺序执行。通常该指令用在循环开始前,以便在循环次数位 0 时,跳过循环体。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报