自己整理的指令 收藏
1 通用数据传送指令
MOV(move) 传送//不影响标志位
MOV mem/reg1, mem/reg2(两 个操作数必有一个是寄存器,且这种方式不允许指定段寄存器)
reg, data(data为 立即数) ac, mem(ac为 累加器)mem, ac segreg, mem/reg(不允许用CS寄 存器)
mem/reg, segreg mem/reg, data(这 种方式目的操作数只用存储器寻址方式而不用寄存器方式)
MOVSX (move with sign-extended) 带符号扩展传送//不影响标志位
MOVSX reg1, reg2 reg, mem (原 操作数是带符号数,所以做符号扩展)
MOVZX(move with zero-extended) 带零扩展传送//不影响标志位
MOVSX reg1, reg2 reg, mem (原 操作数是无符号整数所以做零扩展,不管原操作熟符号位是否为1)
PUSH (push onto the stack) 进栈//不 影响标志位
push reg mem data segreg
POP (pop from the stack) 出栈//不影响标志位
pop reg mem segreg
其中段地址存放于SS寄存器中。 SP(16位)或ESP(32位)的内容在任何时候都指向当前栈顶。
堆栈的存取在16位指令中必须以字为单位(不允许字节堆栈),在32位指令中必须以双字为单位。
8086不允许PUSH指令使用立即数寻址方式,286及后继机型允许立即数进栈。
PUSHA/PUSHAD(push all registers) 所有寄存器进栈//不影响标志位
PUSHA:进 栈次序:AX,CX,DX,BX,指令执行前的SP,BP,SI,DI.指 令执行后(sp)←(SP)-16仍指向栈顶
PUSHAD:32位, 进栈次序同PUSHA
POPA/POPAD(pop all registers) 所有寄存器出栈//不影响标志位
POPA(16位)出 栈次序:DI,SI,BP,SP,BX,DX,CX,AX. 指 令执行后(sp)←(SP)+16仍指向栈顶
POPAD:32位, 进栈次序同POPA.
XCHG(exchange) 交换//不影响标志
执 行操作 (OPR1)←→(OPR2)这 两个操作数必有一个在寄存器中,不允许使用段寄存器。该指令可用于除立即数外的任何寻址方式。
2 累加器专用传送指令
IN(input) 输入//不影响标志位
OUT(output) 输出//不影响标志位
这 两个指令只限于累加器EAX,AX,AL。IN指 令完成从I/O到CPU的 信息传送,而OUT指 令完成从CPU到I/O信 息传送。CPU只 能用累加器接受或发送信息。
XLAT(translate) 换码//不影响标志位
在 使用这条指令前应先建立一个字节表格,其首地址提前存入BX/EBX,需要转换代码应该是相对于表格首地址的位移量也提前存放在AL中, 表格内容则是所要换取的代码,指令执行完后就可在AL中得到转换后的代码。32位:(
3 地址传送指令
LEA(load effective addresss) 有效地址送寄存器//不影响标志位
目 的操作数:可用于16位或32位寄存器,但不能使用段寄存器。源操作数:除立即数和寄存器外的任一种存储器寻址方式。
注意1:LEA BX,[BX+SI+0F62H]这里BX寄 存器得到的是有效地址而不是该存储单元内容。如果是MOV BX,[BX+SI+0F62H],则BX中得到是偏移地址为ⅹⅹⅹ那个单元内容而不是其偏移地址。
注意2 : 比较 LEA BX, LIST 和MOV BX, OFFSET LIST。
这两条指令功能上相同,且MOV指令速度快,但OFFSET只能与简单的符号地址相连,而 不能和诸如LIST[SI]或[SI]等复杂操作数相连。
LDS(load DS with pointer) 指针送寄存器和DS//不影响标志位
LES(load ES with pointer) 指针送寄存器和ES//不影响标志位
LFS(load FS with pointer) 指针送寄存器和FS//不影响标志位
LGS(load GS with pointer) 指针送寄存器和GS//不影响标志位
LSS(load SS with pointer) 指针送寄存器和SS//不影响标志位
该 组指令的源操作只能用存储器寻址方式。目的寄存器不允许使用段寄存器。
4 标志寄存器传送指令
LAHF(load AH with flags) 标志送AH//不影响标志位
执 行操作:(AH)←(FLAGS低 字节)
SAHF(store AH into flags) AH送标志寄存器//由装入值来确定标志位值
执 行操作:(FLAGS低 字节)←(AH)
PUSHF/PUSHFD 标志进栈//由装入值来确定标志位值
执 行操作: PUSHF (SP)←(SP)-2 ( (SP)+1), (SP) )←(FLAGS)
PUSHFD (ESP)←(ESP)-4 ( (ESP+3), (ESP+2), (ESP+1), (ESP) ) ←(EFLAGS AND OFCFFFFH)(清VM和RF 位)
POPF/POPFD(pop the flags or eflags) 标志出栈//由装入值来确定标志位值
执 行操作:POPF (FLAGS)←( (SP)+1), (SP) ) (SP)←(SP)+2
POPFD (EFLAGS)←((ESP)+3,(ESP+2),(ESP+1),(ESP)) (ESP)←(ESP)+4
POPFD指 令不影响VM,RF,IOPL,VIF和VIP的 值。
5 类型转换指令
CBW(convert byte to word) 字节转换为字//不影响标志位
执 行操作:AL的内容扩展到AH,形 成AX中的字。即如果(AL)的 最高有效位为0,则(AH)=0;如 果为1(AH)=OFFH
CWD/CWDE(convert word to double word) 字转换为双字//不影响标志位
执 行操作:AX的内容扩展到DX,形 成DX:AX的双字。即若(AX)的 最高有效位为0,(DX)=0;若为1,(DX)=0FFFFH
CDQ(convert double to quad) 双字转换为4字//不影响标志位
执 行操作:EAX的 内容扩展到EDX,形 成EDX:EAX中 的4字。
BSWAP(byte swap) 字节交换//不影响标志位
BSWAP EAX。 字节次序变反,具体为1,4字 节互换,2,3字 节互换。该指令只能用于486及其后继机型。
算术指令
1 加法指令
ADD(add) 加法//影响条件标志位
ADC(add with carry) 带进位加法//影响条件标志位
注:ADC这 条指令里,其中CF为进位位的值。
INC(increment) 加1//影响条件标志位(除了CF标志)
(上 3条)可 做字或字节运算。OF位 可以用来表示带符号数溢出,CF位则可以用来表示无符号数的溢出。
XADD(exchange and add) 交换并相加//影响条件标志位
该 指令源操作数只能用寄存器寻址方式,目的操作数可用寄存器或任一种存储器寻址方式。
执 行操作:TEMP←(SRC)+(DST) (SRC)←(DST) (DST)←TEMP
2 减法指令
SUB(subtract) 减法//影响条件标志位
SBB(subtract with borrow) 带借位减法//影响条件标志位
执 行操作:(DST)←(DST)-(SRC)-CF
DEC(decrement) 减1//影响条件标志位(除了CF标志)
NEG(negate) 求补 //影响条件标志位
执 行操作:(OPR)←-(OPR)亦 即把操作数按位求反后末位加1,因而执行可表示为(OPR)←0FFFFH-(OPR)+1
只 有当操作数为0时,求补运算结果使CF=0,其他情况均为1。
CMP(compare) 比较//影响条件标志位
(OPR1)-(OPR2),不 保存结果,只是根据结果设置条件标志位。其后往往跟着条件转移指令。
CMPXCHG(compare and exchange) 比较并交换 //影响条件标志位
该 指令只能用于486及 其后继机型。SRC只 能用8,16,或32位寄存器。DST则可用寄存器或任何一种存储器寻址方式。执行操作:累加器和DST比 较 。
CMPXCHG8B(compare and exchange 8 byte) 比较并交换8字节 //影响ZF标志位
该 指令只能用于Pentium及 其后继机型。源操作数存放于EDX,EAX中64位字,目的操作数可用存储器寻址方式确定一个64位 字。执行操作EDX,EAX和DST相 比较。
注:条件码。OF标志位同加法指令,这里若两个数符号相反而结果的符号与减数相同,则OF=1;除上述情况外OF=0。OF=1说明带符号 数的减法溢出,结果错误。
减 法的CF值反映无符号运算中的借位情况,因此当作无符号数运算时,若减数>被减数,此时有借位,则CF=1;否则 CF=0。即有进位时CF=0,无进位时CF=1。
另 外注意8086中处理双字的方法(也适用于386及其后继机型中对4字的处理)。
3 乘法指令
MUL(unsigned multiple) 无符号数乘法//对除CF和OF以外的条件码位无定义
IMUL(signed multiple) 带符号数乘法//对除CF和OF以外的条件码位无定义
执行操作: 字节操作数: (AX)←(AL)*(SRC),字操作数和双字操作数操作同字节操作数。
目的操作数必须是累加器(累加器为隐含),字运算为AX,字节运算为AL。两个8位数相乘得到16位数存放在AX中,两个16 位数相乘得到32位数存放在DX,AX中,其中DX存放高位字,AX存放低位字。386以后可做双字运算。
对于80286及其后继机型,IMUL除上述单操作数指令(累加器为隐 含),还有双操作数和三操作数。如:
IMUL REG,SRC IMUL REG,SRC,IMM
IMUL REG,SRC 执行操作:
字操作数:(REG16)←(REG16)*(SRC) 双字操作数:(REG32)←(REG32)*(SRC)
其中目的操作数必须是16位或32位寄存器;源操作数可用任一种寻址方式取得和目的操作数长度相同
的数;但如源操作数为立即数时,除相应地用16位或32位立即数外,指令中也可指定8位立即数,在运算时机器会自动把该数符号 扩展成与目的操作数长度相同的数。
IMUL REG,SRC,IMM 执行操作:
字 操作数:(REG16)←(SRC)*IMM 双字操作数:(REG32)← (SRC)*IMM
目 的和源操作数同上,IMM表示立即数,可以为8,16,32,运算时必须和目的操作数长度一致。
注:条件码。对 于MUL指令,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)或双字操作的(EDX)为0,则CF和OF均为0;否则CF和OF均为1。
对 于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF和OF均为0,否则就为1。
机 器规定:16位 操作数相乘得到的乘积在16位之内或32位操作数相乘得到的乘积在32位 之内时,OF和CF位 置0, 否则置1, 这时的OF位 为1是 说明溢出的。其它标志位无定义。
4 除法指令
DIV(unsigned divide) 无符号数除法//对所有条件码均无定义
执 行操作:(商和余数均为无符号数)
字节操作:16位 被除数在AX中,8位 除数为源操作数,结果的8位商在AL中,8位 余数在AH中。表示为:(AL)←(AX)/(SRC)的 商 (AH)←(AX)/(SRC)的 余数
字操作:32位 被除数在DX,AX中。 其中DX为高位字;16位 除数为源操作数,结果的16位商在AX中,16位 余数在DX中。表示为: (AX)←(DX,AX)/(SRC)的 商 (DX)←(DX,AX)/(SRC)的 余数
双字操作:64位 被除数在EDX,EAX中。 其中EDX为高位双字;32位 除数为源操作数,结果的32位商在AX中,32位 余数在EDX中。表示为:(EAX)←(EDX,EAX)/(SRC)的 商 (EDX)←(EDX,EAX)/(SRC)的 余数
IDIV(signed divide) 带符号数除法//对所有条件码均无定义
执 行操作:同DIV,但操作数必须是带符号数,商和余数也都是带符号数,且余数的符号和 被除数的符号相同。
除 法指令寻址方式同乘法指令。由于除法指令的字节操作要求被除数为16位, 字操作要求被除数为32位,双字操作要求被除数为64位, 因此往往需要用符号扩展方法取得除法指令所需的被除数格式。
另 外需注意一个问题,除法指令要求字节操作时商为8位,字操作时商为16位, 双字操作时商为32位。如果字节操作时,被除数的高8位 绝对值≥除数绝对值;或者字操作时,被除数的高16位绝对值≥除数绝对值;或者双字操作时,被除数高32位 绝对值≥除数绝对值,则商就会产生溢出。
5 十进制调整指令
1 .压缩的BCD码调整指令
DAA(decimal adjust for addition) 加法的十进制调整指令//对OF标志位无定义,影响其它位
执 行操作:(AL)←把AL中 的和调整到压缩的BCD格式,这条指令之前必须执行ADD或ADC指 令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄 存器中。
本指令调整方法:如果AF标 志(辅助进位位)为1, 或者ALa存器的低4位 是16进制的A~F, 则使AL寄存器的内容加06H, 且将AF位置1; 如果CF标志为1, 或者AL寄存器的高4位 是16进制的A~F, 则AL寄存器内容加60H, 并将CF位置1。
DAS(decimaladjust for subtraction)减法十进制调整指令//对OF标志位无定义,影响其它位
执 行操作:(AL)←把AL中 的差调整到压缩的BCD格式。执行这条指令前必须先执行SUB或SBB指 令,
减法指令必须把两个BCD码 相减,并把结果存放在AL寄存器中。本指令调整方法同DAA指 令。
2 .非压缩的BCD码调整指令
AAA(ASCII adjust for addition) 加法的ASCII调整指令//除影响AF和CF标 志
外,其余标志位无定义
执行操作:(AL)←把AL中的和调整到非压缩的BCD格 式 (AH)←(AH)+ADC生 的进位值
执行这条指令前必须先执行ADD或ADC指 令,加法指令必须把两个非压缩的BCD码相加,并把结果存
放在AL寄存器。
本指令的调整步骤:①如AL寄存器的底4位 在0~9之 间,且AF位 为0, 则跳过第②步,执行第③步;
②如AL寄 存器的低4位在十六进制数A~F之 间或AF为1, 则AL寄存器的内容加6,AH寄 存器的内容加1,
并将AF位置1;
③清除AL的 高4位
④AF的值送CF位
AAS(ASCII adjust for subtraction) 减法的ASCII调 整指令//除影响AF和CF标志外,其余标志位无定义
执行操作:(AL)←把AL中的差调整到非压缩的BCD格 式 (AH)←(AH)- 调整产生的借位值
执行这条指令前必须先执行SUB或SBB指 令,减法指令必须把两个非压缩的BCD码相减,并把结果存放
在AL寄存器。
本指令的调整步骤:①如AL寄存器的底4位 在0~9之 间,且AF位 为0, 则跳过第②步,执行第③步;
②如AL寄 存器的低4位在十六进制数A~F之 间或AF为1, 则AL寄存器的内容减6,AH寄 存器的内容减1,
并将AF位置1;
③清除AL的 高4位
④AF的值送CF位
AAM(ASCII adjust for multiplication) 乘法的ASCII调整指令//根据AL寄存器的内容设置条件
码SF、ZF和PF,但OF,CF和AF位无定义
执行操作:(AX)← 把AL中的积调整到非压缩的BCD码。
在执行这条指令之前,必须先执行MUL指 令,把两个非压缩的BCD码相乘(此时要求其高4位 为0),结果
放在AL寄存器中。
本指令调整方法:把AL寄 存器的内容除以0AH,商放在AH寄 存器中。
AAD(ASCII adjust for division) 除法的ASCII调 整指令//根据AL寄 存器的内容设置条件 码SF、ZF和PF,但OF,CF和AF位无定义
执 行操作:(AH)←10*(AH)+(AL) (AH)←0
如 果被除数是存放在AX寄存器中的二位非压缩BCD数,AH中 存放十位数,AL中存放个位数,而且要求AH和AL中 的高4位均为0。 除数是一位非压缩的BCD数,同样要求高4位 为0。在把这两个数用DIV指 令相除以前,必须先用AAD指令把AX中 的被除数调整成二进制数,并存放在AL寄存器里。因此,AAD指 令执行如上。
逻辑指令
1 逻辑运算指令
AND(and) 逻辑与//使CF和OF为0,AF位无定义
执 行操作:(DST)←(DST)∧(SRC)
用AND指 令可以使操作数的某些位被屏蔽。只需要把AND指令的源操作数设置成一个立即数,并 把需要屏蔽的位设为0,这 样指令执行的结果就可以把操作数的相应位置0,其他各位保持不变.
OR (or) 逻辑或//使CF和OF为0,AF位无定义
执 行操作:(DST)←(DST)∨(SRC)
用OR指 令可以使操作数的某些位置1,其他位保持不变.只需把OR指 令的源操作数设置为一个立即数,并把需要置1的位设为1,就 可达到目的.
NOT (not) 逻辑非//不影响标志位
执 行操作:(OPR)←(OPR)
XOR (exclusive or ) 异或//使CF和OF为0,AF位无定义
(DST)←(DST)⊕(SRC)
要 使操作数的某些位变反,可 以用XOR指 令,只 要把源操作数的立即数字段的相应位置成1就可以达到目的.
XOR指 令还可以测试某一操作数是否与另一确定的操作数相等.这种操作在检查地址是否匹配时常用.
TEST( test) 测试//使CF和OF为0,AF位无定义
执 行操作:(OPR1)∧(OPR2)
用 途:要测试操作数的某些位是否为0,可 用TEST指令,同 样把TEST指令的源操作数设置成一个立即数,其 中需要测试的位应设为1.要测试操作数的某位是否为1,可 先把该操作数求反,然后用TEST指 令测试.这里常用于条件转移.
2 位 测试并修改指令
BT(bit test) 位测试//影响CF值,对其它位无定义
执 行操作:把目的操作数中由源操作数所指定位的值送往标志位CF。
BTS(bit test and set) 位测试并置1//影响CF值,对其它位无定义
执 行操作:把目的操作数中由源操作数所指定位的值送往标志位CF, 并将目的操作数中的该位置1。
BTR (bit test and reset) 位测试并置0//影响CF值,对其它位无定义
执 行操作:把目的操作数中由源操作数所指定位的值送往标志位CF, 并将目的操作数中的该位置0。
BTC (bit test and complement) 位测试并变反//影响CF值,对其它位无定义
执 行操作:把目的操作数中由源操作数所指定位的值送往标志位CF, 并将目的操作数中的该位变反。
本组指令中 的SRC可以使用寄存器方式或立即数方式,即可以在指令中用8位 立即数直接指出目的操作数所要测试位的位位置。也可以用任一字寄存器或双字寄存器的内容给出同一个值。目的操作数则可用除立即数外的任一种寻址方式指定一 个字或双字。由于目的操作数的字节最大为32位,所以位位置的范围应是0~31。
3 位扫描指令
BSF (bit scan forward) 正向位扫描//影响ZF位,其他标志位无影响
执 行操作:指令从位0开始自右向左扫描源操作数,目的是检索第一个为1的 位。如遇到第一个为1的位则将ZF位 置0,并把该位的位位置装入目的寄存器中;如源操作数为0, 则将ZF位置1, 目的寄存器无定义。
BSR (bit scan reverse) 反向位扫描//影响ZF位,其他标志位无影响
与BSF指 令唯一区别是BSR指令检索从高位向低位,而BSF检 索从低位开始第一个出现的1。
4 移位指令
1.移位指令
SHL (shift logical left) 逻辑左移//根据移位后的结果设置SF、ZF和PF的值
格 式:SHL OPR,CNT
其 中OPR用除立即数外的任何寻址方式。移位次数由CNT决 定。在8086中可以是1或CL。 若移位次数大于1,可在该移位指令前把移位次数置于CL寄 存器,而移位指令中的CNT写为CL。 当然其它机型可以直接把CNT写成用8位 立即数指定范围从1到31的 移位次数。
逻 辑移位指令适用于无符号数运算。其中SHL用来乘以2。
SAL (shift arithmetic left) 算术左移//根据移位后的结果设置SF、ZF和PF的值
格 式同上。算术指令适用于带符号数运算。SAL用来乘以2。
SHR (shift logical right) 逻辑右移//根据移位后的结果设置SF、ZF和PF的值
格 式同上。逻辑移位指令适用于无符号数运算。其中SHR用 来除以2。
SAR (shift arithmetic right) 算术左移//根据移位后的结果设置SF、ZF和PF的值
格 式同上。算术指令适用于带符号数运算。SAR用来除以2。
这 里最高有效位右移,同时再用它自身值填入。
移位指令常用来乘以2或除以2的操作。
CF OPR OPR CF OPR CF
(1)逻辑及算术左移 (2)逻辑右移 (3)算术右移
2.循环移位指令
ROL (rotate left) 循环左移//CF根 据各条指令规定设置,OF当CNT=1时有效,否则无定义
ROR (rotate right) 循环右移//同上
RCL ( rotate left through carry) 带进位循环左移//同上
RCR (rotate right through carry ) 带进位循环右移//同上
以 上2组 指令都可以作字或字节操作,386及后继机型还可以做双字操作。
CF OPR OPR CF
循环左移 循环右移
CF OPR OPR CF
带进位循环左移 带进位循环右移
3.双精度移位指令
SHLD (shift left double ) 双精度左移//当移位次数为0时, 不影响标志位;否则
根据移位后的结果设置SF、ZF、PF、CF值
SHRD (shift right double ) 双 精度右移//同上
格式: SHLD(SHRD) DST,REG,CNT
DST可 以用除立即数以外任一种寻址方式指定字或双字操作数。源操作数只能使用寄存器方式指定与目的操作数相同长度的字或双字。CNT为 移位次数,可以是一个8位 立即数,也可是CL, 其内容存放移位计数值,范围从1到31,大于31则 自动取模32的 值来取代。
这组指令在边界不对准的位串传送中很有用。如所要传送的位串的第一个位的位位置 不在字节地址的边界上时,就可以用这组指令来处理。
DST |
DST
T |
CF CF
REG |
REG |
双精度左移 双精度右移
串处理指令
特性:
数据类型 |
字节 |
字 |
双字 |
|
方向(DF) |
向前(DF=0) |
向后(DF=1) |
||
串长度 |
1 |
重复REP(Count Reg)次 |
||
源串((source-index)) 目的串((destination-index)) |
在数据段中(可用段跨越前缀 修改) 在附加段中 |
|||
REP重 复串操作直到计数器寄存器count reg的内容为0为止。格式:REP string primitive
其 中string primitive可为MOVS,STOS,LODS,INS和OUTS指 令。执行操作:(1)如(count reg)=0,则 退出ERP, 否则往下执行 (2)(count reg)←(count reg-1) (3)执 行其后的串指令 (4)重复(1)~(3)
CLD(clear direction flag)该指令使DF=0, 在执行串处理指令时可使地址自动增量
STD (set direction flag)该指令使DF=0,在执行串处理指令时可使地址自动减量
1 MOVS 串传送指令// 不影响标志位
MOVS DST,SRC MOVSB(字节) MOVSW(字) MOVSD(386及后继机型可用)
MOVS寻址方式是隐含的。所以这种格式中的DST和SRC只 提供给汇编程序做类型检查用,并且不允许用其他寻址方式来确定操作数。
在执行操作前有如下准备工作:
①把存放在数据段中的源串首地址(如反向传送则是末地址)放入源变址寄存器
②把将要存放数据串的附加段中的目的串首地址(或反向传送时的末地址)放入目的变 址寄存器中;
③把数据串长度放入计数寄存器中
④建立方向标志
功 能:把由源变址寄存器指向的数据段中的一个字(或双字,或字节)传送到由目的变址寄存器指向的附加段中的一个字(或双字,或字节)中去。同时根据方向标志 及数据格式(或双字,或字节)对源变址寄存器和目的变址寄存器进行修改。
2 STOS 存入串指令//不影响标志位
STOS DST STOSB(字节) STOSW(字) STOSD(双字)386及 后继机型可用
该 指令把AL,AX或EAX的 内容存入由目的变址寄存器指向的附加段的某单元中,并根据DF的值及数据类型修改目的变址寄存器的内容。当它与REP联 用时,可把AL、AX或EAX的 内容存入一个长度为(count reg)的缓冲区中。
STOS在 初始化某一缓冲区时很有用。
3 LODS 从串取指令//不影响标志位
LODS SRC LODSB(字节) LODSW(字) LODSD(双字)
该 指令把由源变址寄存器指向的数据段中某单元的内容送到AL、AX、EAX中,并根据方向标志和数据类型修改源变址寄存器的内 容。指令允许使用段跨越前缀来指定非数据段的存储区。
4 INS 串输入指令//不影响标志位
INS DST,DX INSB(字节) INSW(字) INSD(双字)
把 段口号在DX寄 存器中的I/O空 间的字、字节、双字传送到附加段中的由目的变址寄存器所指向的存储单元中,并根据DF的值和数据类型修改目的变址寄存器的内容。
5 OUT 串输出指令//不影响标志位
OUTS DX,SRC OUTSB(字节) OUTSW(字) OUTSD(双字)
该 指令把由源变址寄存器所指向的存储器中的字节、字或双字传送到端口号在DX寄存器中的I/O端 口中去,并根据DF的 值和数据类型修改目的变址寄存器的内容。
6 与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令
1.REPE/REPZ 当相等/为0时重复操作
格 式:REPE(或REPZ) string primitive(可 为CMPS或SCAS)
执 行操作:①如(count reg)=0或ZF=0(即 某次比较的结果两个操作数不等)时退出,否则往下执行。
②(count reg)←(count reg)-1 ③执行其后的串指令 ④重复①~③
2. REPNE/REPNZ 当不相等//不为0时重 复串操作
格式:REPNE(或REPNZ) string primitive(可 为CMPS或SCAS)
执行操作:只要两数比较的结果不相等,就可继续执行串处理指令,如某次两数比较相等或(count reg)= 0 时,就可结束操作。退出条件为(count reg)=0或ZF=1外,其它与REPE完全相同。
3. CMPS 串比较指令//根据结果设置条件码
CMPS SRC,DST CMPSB CMPSW CMPSD
执行操作:指令把由源变址寄存器指向的数据段中的一个字节、字或双字与由目的变址寄存器所指向的附加段中的一个字节、字或双字 相减,但不保存结果,只根据结果设置条件码。指令的其它特性和MOVS指令的规定相同。
4.SCAS 串扫描指令//根据结果设置条件码
SCAS DST SCASB SCASW SCASD
执行操作:指令把AL、AX或EAX的内容与由目的变址寄存器指向的在附加段中的一个字节、字或双字进行比较,并不保存结果,只根据结果设置条 件码。指令的其他特性和MOVS的规定相同。
控制转移指令
1段内转移:指同一段的范围内进行转移,此 时只需修改IP或EIP,用新转移目标地址去替转移分为:
2段间转移:要转到另一个段去执行程序, 要修改IP(EIP)和CS寄存器内容。段地址+偏移地址
1 无条件转移指令
JMP(jump) 无条件转移指令//不影响条件码
(1)段内直接短转移 JMP SHORT OPR
执行操作:(IP)←(IP)+8位 位移 如果操作数16位,则还需(EIP)←(EIP) AND 0000FFFFH
8位 位移量是由目标地址 OPR确 定。转移的目标地址在汇编格式中可直接使用符号地址,而在机器执行时则是当前的IP或EIP的 值(即JMP指 令的下一条指令的地址)与 指令中指定的8位 位移量之和。位移量既可表示向前又可表示向后移,是一个带符号数。(所以这种格式只允许在-128到+127字节范围内转移)
(2)段内直接近转移 JMP NEAR PTR OPR
执行操作:(IP)←(IP)+16位 位移 80386及后继机型为:(EIP)←(EIP)+32位位移量
如果操作数16位,则还需(EIP)←(EIP) AND 0000FFFFH
同样采用相对寻址。在8086及其它机型的实模式下段长为64K,所以16位 位移量可以转移到段内的任一个位置。在386及后继机型的保护模式下,段的大小可达4G,32位 位移量可以转到段内任何位置。
(3)段内间接近转移 JMP WORD PTR OPR
执行操作:(IP)←(EA),386及 后继机型则为:(EIP)←(EA)。如果操作数16位,则还需(EIP)←(EIP) AND 0000FFFFH
其 中有效地址EA值 由OP R寻 址方式确定。它可以使用除立即数方式以外的任一种寻址方式。如果指定是寄存器,则把寄存器的内容送到IP或EIP寄 存器中;如果指定是存储器中的一个字或双字,则把该存储单元的内容送到IP或EIP寄存器中去。
(4)段间直接远转移 JMP FAR PTR OPR
直接 执行操作:(IP)← OPR的 段内偏移地址 (CS)← OPR所 在段的段地址
寻址 386及 后继机型为:(EIP)← OPR的段内偏移地址 (CS)← OPR所在段的段地址
(5)段间间接远转移 JMP DWORD PTR OPR
执行操作: (IP)←(EA) (CS)←(EA+2) 操作数16位,则还需
386及 后继机型 (EIP)←(EA) (CS)←(EA+4) ( EIP)←(EIP) AND 0000FFFFH
其 中有效地址EA值 由OP R寻 址方式确定。它可以使用除立即数方式以外的任一种寻址方式。根据寻址方式求出EA后, 把指定存储单元的字内容送到IP或EIP寄存器,并把下一个字内容送到CS寄 存器。
2 条件转移指令 //所有条件转移指令都不影响条件码
条件转移指令使用了相对寻址方式,它只可用JMP中 的短转移和近转移两种格式。(在8086和80286中 只提供短转移格式,目标地址应在本条转移指令下一条指令地址的
-128~+127个字节范围之内。80386以 后除短转移外还提供近转移,这样就可到达段内任何位置。)但条件转移不提供段间远转移格式。满足测试条件 时,IP或EIP与8位、16位或32位位移量相加得到转向地址;如不满足测试条件,则IP或EIP不变。
1 根据单个条 件标志的设置情况转移。
适用于 测试某一次运算的结果并根据其不同特征产生分支作不同处理。
(1)JZ(或JE)(jump if zero,or equal) 结果为零(或相等)则转移
格式:JZ(或JE) OPR 测试条件:ZF=1
(2)JNZ(或JNE)(jump if not zero,or not equal) 结果不为零(或不相等)则转移
格式:JNZ(或JNE) OPR 测试条件:ZF=0
(3)JS(jump if sign) 结果为负则跳转
格式:JS OPR 测试条件:SF=1
(4)JNS(jump if not sign) 结果为正则跳转
格式:JNS OPR 测试条件:SF=0
(5)JO(jump if overflow) 溢出则转移
格式:JO OPR 测试条件:OF=1
(6)JNO(jump if not overflow) 不溢出则转移
格式:JNO OPR 测试条件:OF=0
(7)JP(或JPE) (jump if parity,or parity even) 奇偶位为1则跳转
格式:JP(或JPE) OPR 测试条件:PF=1
(8)JNP(或JPO) (jump if not parity,or parity odd) 奇偶位为0则跳转
格式:JNP(或JPO) OPR 测试条件:PF=0
(9)JB(或JNAE, 或JC)(jump if below,or not above or equal,or carry)
低于,或者不高于或者等于,或进位为1则转移
格式:JB(或JNAE,或JC) OPR 测试条件:CF=1
(10)JNB(或JAE, 或JNC)(jump if not below,or above or equal,or not carry)
不低于,或者高于或等于,或进位为零则转移
格式:JNB(或JAE, 或JNC) OPR 测试条件:CF=0
2 比较两个无 符号数,并根据比较结果转移。
(1) JB(或JNAE, 或JC)(jump if below,or not above or equal,or carry)
(2) JNB(或JAE, 或JNC)(jump if not below,or above or equal,or not carry)
以上两个 指令同上面第一组(9)(10)完全相 同
(3) JBE(或JNA) (jump if below or equal,or not above)
低于或等于,或不高于则转移
格式:JBE(或JNA) OPR 测试条件:CF∨ZF=1
(4)JNBE(或JA)(jump if not below or equal,or above)
不低于或等于,或高于则转移
格式:JNBE(或JA) OPR 测试条件:CF∧ZF=1
3 比较两个带符号数,并根据比较结果转移
(1) JL(或JNGE)(jump if less,or not greater or equal)小于,或者不大于或等于则跳转
格式:JL(或JNGE) OPR 测试条件:SF⊕OF=1
(2)JNL(或JGE)(jump if not less,or greater or equal)不小于,或者大于或等于则转移
格:JNL(或JGE) OPR 测试条件:SF⊕OF=0
(3)JLE(或JNG)(jump if less or equal,or not greater)小于或等于,或者不大于则转移
格式:JLE(或JNG) OPR 测试条件:(SF⊕OF)∨ZF = 1
(4)JNLE(或JG)(jump if not less or equal,or greater)不小于或等于,或大于则转移
格式:JNLE(或JG) OPR 测试条件:(SF⊕OF)∨ZF =0
4 测试CX或ECX的值为0则转移指 令
(1)JCXZ(jump if CX register is zero) CX寄存器的内容为零则转移
格式:JCXZ OPR 测试条件:(CX)= 0
(2)JECXZ(jump if ECX register is zero) ECX寄存器的寄存器内容为零则转移
格式:JECXZ OPR(386J及后继机型可用) 测试条件:(E X)= 0
3 条件设置指令(本组指令只在386及后继机型才提供)
格式:SETcc DST
执行操作:DST可使用寄存器或任一种存储器寻址方式,但只能指定一个字节单元。指令根据所指定的条件码情况,如满足条件则把目的字节置为1;如不满足条件则把目的字节置为0。条件设置可分为3组:
1.根据单个 条件标志的值把目的字节置1。
(1)SETZ(或SETE)(set byte if zero,or equal) 结果为零(或相等)则目的字节置1
测试条件: ZF = 1
(2)SETNZ(或SETNE)(set byte if not zero,or not equal)结果不为零或不相等则目的字节置1
测试条件:ZF = 0
(3)SETS(set byte if sign) 结果为负则目的字节置为1
测试条件:SF = 1
(4)SETNS(Set byte if not sign) 结果为正则目的字节置为1
测试条件:SF = 0
(5)SETO(set byte if overflow) 溢出则目的字节置1
测试条件:OF = 1
(6)SETNO(set byte if not overflow) 不溢出则目的字节置1
测试条件:OF = 0
(7)SETP(或SETPE)(set byte if parity,or parity even)奇偶位为1则目的字节置1
测试条件:PF = 1
(8)SETNP(或SETB,或SETNAE) (set byte if parity,or parity odd) 奇偶位为0则目的字节置1
测试条件:PF = 0
(9)SETC(或SETB,或SETNAE) (set byte if carry,or below,or not above or equal)
进位位为1,或低于,或不高于或等于则目的字节置1
测试条件:CF = 1
(10)SETNC(或SETNB,或SETAE) (set byte if carry,or below,or not above or equal)
进位位为1,或不低于,或高于或等于则目 的字节置1
测试条件:CF = 0
2.比较两个 无符号数,并根据比较结果把目的字节置1。
(1)SETC(或SETB,或SETNAE) (set byte if carry,or below,or not above or equal)
(2)SETNC(或SETNB,或SETAE) (set byte if carry,or below,or not above or equal)
以上两个 指令同上面第一组(9)(10)完全相 同
(3)SETBE(或SETNA)(set byte if below or equal,or not above)
低于或等于,或不高于则目的字节置1
测试条件:CF∨ZF=1
(4)SETNBE(或SETA) (set byte if not below or equal,or above)
不低于或等于,或高于则目的字节置1
测试条件:CF∨ZF=0
3.比较两个 带符号数,并根据比较结果把目的字节置1。
(1)SETL(SETNGE)(set byte if less,or not greater or equal)
小于,或不大于或等于则目的字节置1
测试条件: SF⊕OF = 1
(2)SETNL (SETGE)(set byte if not less,or greater or equal)
不小于,或大于或等于则目的字节置1
测试条件: SF⊕OF = 0
(3)SETLE(SETNG) (set byte if less or equal,or not greater)
小于或等于,或不大于则目的字节置1
测试条件:(SF⊕OF)∨ZF=1
(4)SETNLE(SETG)(set byte if not less or equal,or greater)
不小于或等于,或大于则目的字节置1
测试条件:(SF⊕OF)∨ZF=0
5 循环指令 //循环指令不影响条件码
使用相对寻址方式
(1)LOOP 循环
格式:LOOP OPR 测试条件:(count Reg)≠0
(2)LOOPZ/LOOPE 当为零或相等时循环指令
格式:LOOPZ(或LOOPE) OPR 测试条件:ZF=1且(count Reg)≠0
(3)LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式:LOOPNZ(或LOOPNE) OPR 测试条件:ZF=0且(count Reg)≠0
其中第二和第三条指令提供了提前结 束循环的可能性。
这 三条指令执行步骤:①(count Reg)←(count Reg)-1
② 检查是否满足测试条件,如满足且操作数长度为16位,则(IP)←(IP)+D8的符号扩展;如满足且操作数长度为32位,则(EIP)←(EIP)+D8的符号扩展;
上 面OPR必须指定一个表示转向地址的标号(符 号地址),而在机器指令里则用8位位移量D8来表示转向地址与当前IP(或EIP)值的差。由于位移量只有8位,所以转向地址必须在该循环指令的下一条指令地址的-128~+127字节范围内。
6 子程序
子程序相当于高 级语言中的“过程”,(procedure)。程序中可以由调用程序(或称主程序)调用这些子程序,而 在子程序执行完后又返回调用程序继续执行。
1. CALL 调用指令 //不影响标志位
⑴段内直接近调用
执行操作:当 操作长度为16位时,Push(IP) (IP)←(IP)+D16
或(EIP)←( (EIP)+D16 )AND0000FFFFH
操作数长度 为32位时,Push(EIP) (EIP)←(EIP)+D32
指 令中DST给 出转向地址(即子程序的入口地址,亦即子程序的第一条指令的地址),D16即为机器指令
中 的位移量,它是转向地址和返回地址之间的差值。
⑵段内间接近调用
执行操作:当 操作长度为16位时,Push(IP) (IP)←(EA)
或(EIP)←(EA)AND0000FFFFH
操作数长度 为32位时,Push(EIP) (EIP)←(EA)
指 令中的DST可 使用寄存器寻址方式或任一种存储器寻址方式,由指定的寄存器或存储单元的内容给出转向地址。当操作长度为16位 时,则有效地址EA应 为16位; 操作数长度为32位 时,EA应 为32位。
以上两种 方式均为近调用,转向地址中只包含其偏移地址部分,段地址是保持不变的。
⑶段间直接远调用
执行操作:当 操作长度为16位时, Push(CS) Push(IP)
(IP)←DST指定的偏移地 址 (CS)←DST指定的段地址
当操作长度为32位时, Push(CS) Push(EIP)
(EIP)←DST指定的偏移地 址 (CS)←DST指定的段地址
由 于调用程序和子程序不在同一段内,因此返回的地址的保存以及转向地址的设置都必须把段地址考虑在内。
⑷段间间接远调用
执行操作:当 操作长度为16位时, Push(CS) Push(IP)
(IP)←(EA) (CS)←(EA+2)
当操作长度为32位时, Push(CS) Push(EIP)
(EIP)←(EA) (CS)←(EA+4)
其 中EA是 由DST的 寻址方式确定的有效地址,这里可用任一种存储器寻址方式来取得EA值。
2.RET 返回指令 //不影 响标志位
RET指 令放在子程序的末尾,它使子程序在功能完成后返回调用程序继续执行,而返回地址是调用程序调用子程序(或称转子)时存放在堆栈中的,因此RET指令的操作是返回地址出栈送IP或EIP寄存器(段内或段间)和CS寄存器(段间)。
(1)段内近返回 格式:RET
执行操作:当 操作数长度为16时,(IP)←POP()
386及后继机型:(EIP)←(EIP)AND0000FFFFH
当操作数长 度为32位时,(EIP)←POP()
(2)段内带立即数近返回 格式:RET EXP
执行操作:在 执行完与(1)的RET完全相同的操 作后,还需要修改堆栈指针:
(SP或ESP)←(SP或ESP)+D16
其中EXP是一个表达式,根据它的值计算出来的常数成为机器指令中的位移量D16。这种指令允许返回地址出栈后修改堆栈的指针,这就便于调用程序在用CALL指令调用子程序以前把子程序所需要的参数入栈,以便子程序运行时使用这些参数。 当子程序返回后,这些参数已不在有用,就可以修改指针使其指向参数入栈以前的值。
(3)段间远返回 格式:RET
执行操作:当 操作数长度为16时,(IP)←POP()
386及后继机型:(EIP)←(EIP)AND0000FFFFH
(CS)←POP()
当操作数长 度为32位时,(EIP)←POP()
(CS)←POP()(32位数出栈、高16位废除)
(4)段间 带立即数远返回 格式:RET EXP
执行操作:在 执行完与(3)的RET完全相同的操 作后,还需要修改堆栈指针:
(SP或ESP)←(SP或ESP)+D16
这里EXP的含义及使用情况与带立即数返回指令相同。
7 中断
中断分为内部中断和外部中断两类。内部中断包括像除法运算中所遇到需要除以0时
产生的中断,或者程序中为了做某些 处理而设置的中断指令等。外部中断则主要用来处理I/O设备与CPU之间的通信。
当CPU响应一次中断时,也要和调用子程序时类似地把(IP)或(EIP)和(CS)保存入栈。除此之外,为了能全面地保存现场信息,以便在中断处理结束时返回 现场,还需要把反映现场状态的(FLAGS)或(EFLAGS)保存入栈,然后才能转到中断例行程序去执行。返回同理要恢复(FLAGS)或(EFLAGS)。
中 断例行程序入口地址称为中断向量。在80X86中,在实模式下工作时,存储器的最低地址区的1024个字节(地址从00000H到003FFH)为中断向量区,其中存放着256种类型中断例行程序的入口地址 (中断向量)。由于每个中断向量占有4个字节单元,所以中断指令中指定的类型号N需要乘以4才能取得所指定类型的中断向量。在保护模式下,中断例行程序的入口通过中断描 述符表找到找到中断描述符来取得的。由于每个描述符为8字节长,所以类型号应乘以8才能取得所指定类型的中断描述符。
(1)INT (interrupt) 中断//不影响除IF、TF和AC以外的标志位
格式:INT TYPE 或 INT
执行操作:PUSH(FLAGS)
IF←0
TF←0
AC←0
PUSH(CS)
PUSH(IP)
(IP)←(TYPE * 4)
(CS)←(TYPE * 4+2)
其中TYPE为类型号,它可以是常数或表达式,其 值必须在0~255范围内,格式中的INT是一个字节的中断指令,它隐含的类型 号为3。
(2)INTO(interrupt if overflow) 如溢出则中断//同上
格式:INTO
执行操作:若OF = 1,则:PUSH(FLAGS)
IF←0
TF←0
AC←0
PUSH(CS)
PUSH(IP)
(IP)←(10H)
(CS)←(12H)
(3)IRET(return from interrupt) 从中断返回//标志位由堆栈中取出来的值设 置
格式:IRET 适用于操作数长度为16位的情况
执行操作:(IP)←POP() (CS)←POP() (FLAGS)←POP()
(4)IRETD(return from interrupt) 从 中断返回 //标志位由堆栈中取出来的值设置
格式:IRETD 适用于操作数长度为32位的情况
执行操作:(IP)←POP() (CS)←POP() (EFLAGS)←POP()
处理机控制和杂项操作指令
1. 标志处 理指令 //只影响本指令指定的标志,而不影 响其他标志位
·CLC(clear carry) 进位位置置零指令 CF←0
·CMC (complement carry) 进位位求反指令 CF←CF
·STC (set carry) 进位位置1指令 CF←1
·CLD (clear direction) 方向标志位置0指令 DF←0
·STD (set direction) 方向标志位置1指令 DF←1
·CLI (clear interrupt) 中断标志置0指令 IF←0
·STI (set interrupt) 中断标志置1指令 IF←1
2. 其它处 理机控制与杂项操作指令 //以下指令不影响条件码
(1)NOP(no operation) 无操作指令
该 指令不执行任何操作,其机器码占有一个字节单元,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代。
(2)HLT (halt) 停机
该 指令可使机器暂停工作,使处理机处于停机状态以等待一次外部中断的到来,中断结束后继续执行下面.
(3)WAIT (wait) 等待
该 指令使处理机处于空转状态,它也可以用来等待外部中断发生,但中断结束后仍返回WAIT指 令继续等待。
它 也可以与ESC指令配合等待协处理机的执行结果。
(4)ESC (escape) 换码
格式: ESC op,reg/mem
这 条指令在使用协处理机时,可以指定由协处理器执行的指令。指令的第一个操作数即指定其操作码,第二个操作数即指定其操作数。自486起, 浮点协处理器已装入CPU芯片,系统可以直接支持协处理器指令,因此ESC指 令已成为未定义指令,如遇到程序中的ESC指令将引起一次异常处理。
(5)LOCK (lock) 封锁
该 指令是一种前缀,它可以与其它指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止。当CPU与 其它协处理机协同工作时,该指令可避免破坏有用信息。
LOCK前 缀可与下列指令联用:
BTS,BTR,BTC mem,reg/imm
XCHG reg,mem
XCHG mem,reg
ADD,OR,ADC,SBB,AND,SUB,XOR mem,reg/imm
NOT,NEG,INC,DEC mem
CMPXCHG,XADD
(6)BOUND(bound) 界限
格式:BOUND reg,mem
执行操作:BOUND指令检查给出的数组下标是否在规定 的上下界之内。如在上下界之内,则执行下一条指令;如超出了上下界范围,则产生中断5。如发生中断,则中断返回时返回地址仍指向BOUND指令,而不是其下一条指令。 指令中第一个操作数必须用寄存器,用来存放当前数组下标。当操作数长度为16位时,使用16位寄存器;而当操作数长度为32位时,则使用32位寄存器。第二个操作数必须使用存储 器方式,该操作数用来存放数组的上下界。当操作数长度为16位时,使用相继的两个16位字存放下界和上界,下界存放在低地址所指定的字单元中,上界存放在高地址所指 定的字单元中。当操作数为32位时,使用相继的两个双字来存放下界和上界。
(7)ENTER 建立堆栈帧指令
ENTER指令用于过程调用时为便于过程间传 递参数而建立堆栈帧所用。
格式:ENTER imm16,imm8
执行操作:指令中给出地两个操作数均 为立即数。第一个操作数为16位立即数,由其指定堆栈帧的大小,即其所占据的字节数。第二个操作数为8位立即数,它给出过程的嵌套层数,此数范围应为0~31。
该指令完成 以下操作:
①PUSH(BP)或PUSH(EBP),以保存该寄存器的原始内容。
②(BP)←(SP)或(EBP)←(ESP),使BP或EBP寄存器保存当前堆栈指针SP或ESP的内容,以便在过程运行期间,以BP(或EBP)为基准访问堆栈帧中存放的变量。
③(BP)←(SP)-imm16 或 (EBP)←(ESP)-imm16,这样就建立了堆栈帧所占有的存储空 间。
(8)LEAVE 释放堆栈帧指令
LEAVE指令在程序中位于退出过程的RET指令之前,用来释放由ENTER指令建立的堆栈帧存储区。
格式:LEAVE
执行操作:
①(SP)←(BP)或(ESP)←(ESP)
②(BP)←POP()或(EBP)←POP()from:
http://blog.csdn.net/boyplayee/archive/2008/11/10/3266066.aspx