2:累加器专用传输指令
IN(input) 输入
OUT(output) 输出
XLAT (tanslate) 换码
这组指令只限于使用累加器EAX,AX,AL传送信息。
IN
长格式执行的操作:(AL)ß(PORT)字节
(AX)ß(PORT+1,PORT)字
(EAX)ß(PORT+3,PORT+2,PORT+1,PORT)双字
短格式执行的操作:(AL)ß((DX))字节
(AL)ß((DX)+1,(DX))字
(AL)ß((DX)+3,(DX)+2,(DX)+1,(DX))双字
OUT
长格式执行的操作:
(PORT)ß(AL)字节
(PORT+1,PORT)ß(AX)字
(PORT+3,PORT+2,PORT+1,PORT)ß(EAX)双字
短格式执行的操作:
((DX))ß(AL) 字节
((DX)+1,(DX))ß(AX) 字
((DX)+3,(DX)+2,(DX)+1,(DX))ß(EAX) 双字
IN完成从I/0到CPU的信息传送,而OUT则完成从CPU到I/O的信息传送。CPU只能用累加器(AL,AX,EAX)接受或发送信息。
当端口号>=255时,只能使用短格式,此时必须先把断口号放到DX寄存器中,然后再用IN或OUT指令来传送信息。前256个端口可以在指令中直接指定。
3,地址传送指令
LEA 有效地址送寄存器 REG,SRC
把源操作数的有效地址传送到指定的寄存器中。目的操作数不能用断寄存器。
MOV,与LEA的区别是MOV传送的是内容,LEA是传送的地址。
LDS 指针送寄存器和DS
LES 指针送寄存器和ES
LFS 指针送寄存器和FS
LGS 指针送寄存器和GS
LSS 指针送寄存器和SS
当指令指定的是(16,32)位寄存器时,把该存储单元中存放的(16,32)位偏移地址(SRC)装入该寄存器当中,然后把(SRC+2),(SRC+4)中的(16)位数装入指令寄存器指定的断寄存器中。
4,类型转换指令(本组指令均不影响标志位)
格式:CBW
即如果(AL)的最高有效位为0,则(AH)=0;如(AL)的最高有效位为1,则(AH)=0FFH。
格式:CWD
即如果(AX)的最高有效位为0,则(DX)=0;如(AX)的最高有效位为1,则(DX)=0FFFFH。
格式:CWDE
AX的内容符号扩展到EAX,形成EAX中的双字。
格式:CDQ
EAX的内容符号扩展到EDX,形成EDX中的4字。
格式:BSWAP
使指令指定的32位寄存器的字节次序变反。具体的操作为1,4字节互换,2,3字节互换。
5,加法指令:
ADD
ADC DST,SRC
执行的操作:(DST)ß(SRC)+(DST)+CF
INC 加1指令
XADD DST,SRC 交换并相加指令
执行的操作:TEMP ß(SRC)+(DST)
(SRC)ß(DST)
(DST)ßTEMP
把目的操作数装入源,并把源和目的操作数之和送入目的地址。
8位二进制数可以表示十进制数的范围是:无符号数0--255,带符号数-128—127,16位二进制数可以表示十进制数的范围是:无符号数0-65535,带符号数为-32768--+32767。
减法指令
SUB
SBB 带借位减法
执行的操作: (DST)ß(DST)—(SRC)—CF
DEC
NEG 求补指令
实质:按位取反后末位加1 (OPR)ß0FFFFH—(OPR)+1
CMP (OPR1)—(OPR2)比较指令
CMP指令后往往跟着一条条件转移指令,根据比较结果产生不同的程序分支。
CMPXCHG
执行的操作:累加起AC与DST相比较(累加器可以为AL,AX,EAX),如
(AC)=(DST)
则,(DST)ß(SRC)
否则,(SRC)ß(AC)
乘法指令:
MUL 无符号数乘法
执行的操作: (AX)ß(AL)*(SRC)
(DX,AX)ß(AX)*(SRC)
(EDX,EAX)ß(EAX)*(SRC)
IMUL 带符号数乘法 (执行的操作同上)
目的操作数必须是累加器,字运算为AX,字节运算为AL。使用的条件都是由数的格式决定的。
除法指令:
DIV 无符号数除法
执行的操作: 字节 (AL)ß(AX)/(SRC)的商
(AH)ß(AX)/(SRC)的余数
字 (AX)ß(DX,AX)/(SRC)的商
(DX)ß(DX,AX)/(SRC)的余数
双字 (EAX)ß(EDX,EAX)/(SRC)的商
(EDX)ß(EDX,EAX)/(SRC)的余数
IDIV 带符号数除法
执行的操作与DIV相同,但操作数必须是带符号数,商和余数也都是带符号数,切余数的符号与被除数符号相同。
逻辑指令
逻辑运算指令
AND
把AND指令的源操作数设置成一个立即数,并把需要屏蔽的位设为0,这样指令执行的结果就可以把操作数的相应位置0,其他各位保持不变。
OR
NOT 逻辑非
以下两个操作数的结果不保存,只根据特征设置条件码。
XOR 异或
要使操作数的某些位变反,可以使用XOR指令,只要把源操作数的立即数字段的相应位置1就可以达到目的。
TEST 测试
要测试操作数的某位是否为1,可以先把该操作数求反,然后用TEST指令测试。
移位指令:
SHL 逻辑左移
SAL 算术左移
SHR 逻辑右移
SAR 算术右移
ROL 循环左移
ROR 循环右移
RCL 带进位循环左移
RCR 带进位循环右移
SHLD 双精度左移
SHRD 双精度右移
移位指令通常用来作乘以2或除以2的操作。
串处理指令:
MOVS 当该指令与前缀REP连用时,则可将数据段中的整串数据传送到附加段中。这里,源串必须在数据段中,目的串必须在附加段中,但是源串允许使用段跨越前缀来修改。在与REP连用时必须先把数据串的长度值送到记数寄存器中,以便控制指令结束。
执行该指令的准备操作:
1把存放在数据段中的源串首地址放入SI;
2把将要存放数据串的附加段中的目的串首地址放入DI;
3把数据串长度放入记数寄存器;
4建立方向标志(DF);
STOS 该指令把累加器的内容存入由目的变址寄存器指向的附加段的某单元中,并根据DF的值及数据类型修改目的变址寄存器的内容。当它与REP连用时可把累加器的内容存入一个长度为COUNT REG的缓冲区中。
STOS指令在初始化某一缓冲区时很有用。
LODS
该指令把由源变址寄存器指向的数据段中某单元的内容送到累加器中,并根据DF和数据类型修改源变址寄存器的内容。该指令不和REP连用。
与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令
可以用来比较俩个数据串,或从一个字符串中查找一个指定的字符。
CMPS SRC,DST
指令把由SRC指向的数据段中的一个字节,字,双字与由DST所指向的附加段中的一个字节,字或双字相减。但不保存结果,只根据结果置条件码。
SCAS DST
指令把累加器的内容与由目的变址寄存器指向的在附加段中的一个字节,字或双字进行比较,并不保存结果,只根据结果设置条件码。