上一章节介绍了几个常用的数据操作的
本章节主要介绍另外几个数据操作
这是网络摘录的
MOV MOVZX MOVSX的不同点
将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的操作数。其中MOVSX是按有符号数扩展,MOVZX是按无符号数扩展。无符号数或正数高位扩展为0,负数高位扩展为全“1”。
交换指令
格式:XCHG OPR1,OPR2
功能:交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字。允许通用寄存器之间,通用寄存器和存储器之间交换数据。
例 3.17
[Asm] 纯文本查看 复制代码 XCHG AX,BX;通用寄存器之间交换数据(16位)
XCHG ESI,EDI;通用寄存器之间交换数据(32位)
XCHG BX,/[SI/];通用寄存器和存储器之间交换数据(16位)
XCHG AL,/[BX/];通用寄存器和存储器之间交换数据(8位)
使用该指令应注意以下问题:
·操作数OPR1和OPR2不允许同为存储器操作数;
·操作数数据类型必须一致;
·交换指令不影响标志位。
如要实现存储器操作数交换,可用如下指令实现:
[Asm] 纯文本查看 复制代码 MOV AL,BLOCK1
XCHG AL,BLOCK2
MOV BLOCK1,AL
二、堆栈操作指令
1压栈指令
(1) 格式:PUSH SRC
功能:将源操作数压下堆栈,源操作数允许为16位或32位通用寄存器、存储器和立即数以及16位段寄存器。当操作数数据类型为字类型,压栈操作使SP值减2;当数据类型为双字类型,压栈操作使SP值减4。
例 3.19
[Asm] 纯文本查看 复制代码 PUSH AX ;通用寄存器操作数入栈(16位)
PUSH EBX ;通用寄存器操作数入栈(32位)
PUSH [SI] ;存储器操作数入栈(16位)
PUSH DWORD PTR [DI] ;存储器操作数入栈(32位)
PUSHW 0A123H ;立即数入栈(16位)
PUSHD 20H ;立即数入栈(32位)
(2) 格式:PUSHA
PUSHAD
功能:PUSHA将16位通用寄存器压入堆栈,压栈顺序为AX,CX,DX,BX,SP,BP,SI,DI。
PUSHAD将32位通用寄存器压入堆栈,压栈顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
2出栈指令
(1) 格式:POP DEST
功能:从栈顶弹出操作数送入目的操作数。目的操作数允许为16或32位通用寄存器、存储器和16位段寄存器。当操作数数据类型为字类型,出栈操作使SP加2;当操作数数据类型为双字类型,出栈操作使SP加4。
例 3.20
[Asm] 纯文本查看 复制代码 POP AX ;操作数出栈送寄存器(16位)
POP ECX ;操作数出栈送寄存器(32位)
POP [BX] ;操作数出栈送存储器(16位)
POP DWORD PTR [SI] ;操作数出栈送存储器(32位)
(2) 格式:POPA
POPAD
功能:POPA从堆栈移出16字节数据,并且按顺序存入寄存器DI,SI,BP,SP,BX,DX,CX,AX中。
POPAD从堆栈移出32字节数据,并且按顺序存入寄存器EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中。
使用堆栈操作指令应注意以下问题。
(1) 目的操作数不允许为CS以及立即数。
(2) 堆栈操作指令不影响标志位。
算术运算指令
80x86指令包括加、减、乘、除四种基本算术运算操作及十进制算术运算调整指令。二进制加、减法指令,带符号操作数采用补码表示时,无符号数和带符号数据运算可以使用相同的指令。二进制乘、除法指令分带符号数和无符号数运算指令。
一、加法指令
格式:ADDDEST,SRC
ADCDEST,SRC
功能:ADD是将源操作数与目的操作数相加,结果传送到目的操作数。ADC是将源操作数与目的操作数以及CF(低位进位)值相加,结果传送到目的操作数。
源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
ADD,ADC指令影响标志位为OF,SF,ZF,AF,PF,CF。
例 3.26
[Asm] 纯文本查看 复制代码 MOV AX,9876H
ADD AH,AL;AX=0E76H CF=1 SF=0O F=0 ZF=0 AF=0 PF=0
ADC AH,AL;AX=8576H CF=0 SF=1O F=1 ZF=0 AF=1 PF=0
二、减法指令
格式:SUB DEST,SRC
SBB DEST,SRC
功能:SUB将目的操作数减源操作数,结果送目的操作数。SBB将目的操作数减源操作数,还要减CF(低位借位)值,结果送目的操作数。
源操作数可以是通用寄存器、存储器或立即数。目的操作数可以是通用寄存器或存储器操作数。
SUB,SBB指令影响标志位为OF,SF,ZF,AF,PF,CF。
三、加1减1指令
格式:INC DEST
DEC DEST
功能:INC指令将目的操作数加1,结果送目的操作数。DEC指令将目的操作数减1,结果送目的操作数。目的操作数为通用寄存器或存储器操作数。
INC,DEC指令影响标志位为OF,SF,ZF,AF,PF。
四、交换相加指令
格式:XADDDEST,REG
功能:目的操作数加源操作数,结果送目的操作数。原目的操作数内容送源操作数。源操作数允许为通用寄存器。目的操作数允许为通用寄存器、存储器操作数。
XADD指令影响标志位为OF,SF,ZF,AF,PF,CF。
五、求补指令
格式:NEGDEST
功能:对目的操作数求补,用零减去目的操作数,结果送目的操作数。目的操作数为通用寄存器、存储器操作数。
NEG指令影响标志位为OF,SF,ZF,AF,PF,CF。
六、乘法指令
(1) 格式:MULSRC
IMULSRC
功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令。源操作数为通用寄存器或存储器操作数。目的操作数缺省存放在ACC(AL,AX,EAX)中,乘积存AX,DX:AX,EDX:EAX中。
字节乘:ALSRC→AX
字乘:AXSRC→DX∶AX
双字乘:EAXSRC→EDX∶EAX
MUL,IMUL指令执行后,CF=OF=0,表示乘积高位无有效数据;CF=OF=1表示乘积高位含有效数据,对其它标志位无定义。
例 3.31
[Asm] 纯文本查看 复制代码 MUL BL;字节乘
MUL WORD PTR [SI];字乘
IMUL BYTE PTR [DI];字节乘
IMUL DWORD PTR [ECX];双字乘
如果使用IMUL指令,积采用补码形式表示。
(2) 格式:IMULDEST,SRC
功能:将目的操作数乘以源操作数,结果送目的操作数。目的操作数为16位或32位通用寄存器或存储器操作数。源操作数为16位或32位通用寄存器、存储器或立即数。
源操作数和目的操作数数据类型要求一致。乘积仅取和目的操作数相同的位数,高位部分将被舍去,并且CF=OF=1。其它标志位无定义。
(3) 格式:IMUL DEST,SRC1,SRC2
功能:将源操作数SRC1与源操作数SRC2相乘,结果送目的操作数。目的操作数DEST为16位或32位,允许为通用寄存器。源操作数SRC1为16位或32位通用寄存器或存储器操作数。源操作数SRC2允许为立即数。
例 3.32 IMULEAX,[EBX],12H
要求目的操作数和源操作数SRC1类型相同,当乘积超出目的操作数部分,将被舍去,并且使CF=OF=1,在使用这类指令时,需在IMUL指令后加一条判断溢出的指令,溢出时转错误处理执行程序。
七、除法指令
格式:DIV SRC
IDIV SRC
功能:DIV为无符号数除法,IDIV为带符号数除法。源操作数作为除数,为通用寄存器或存储器操作数。被除数缺省在目的操作数AX,DX:AX,EDX:EAX中。
字节除法:AX/SRC商→AL,余数→AH
字除法:DX·AX/SRC商→AX,余数→DX
双字除法:EDX·EAX/SRC商→EAX,余数→EDX
由于被除数必须是除数的双倍字长,一般应使用扩展指令进行高位扩展。当进行无符号数除法时,被除数高位按0扩展为双倍除数字长。当进行有符号数除法时,被除数以补码表示。可使用扩展指令CBW,CWD,CWDE,CDQ进行高位扩展。例如:
[Asm] 纯文本查看 复制代码 MOV AX,BLOCK
CWD;被除数高位扩展
MOV BX,1000H
IDIV BX
对于带符号除法,其商和余数均采用补码形式表示,余数与被除数同符号。当除数为零或商超过了规定数据类型所能表示的范围时,将会出现溢出现象,产生一个中断类型码为“0”的中断。执行除法指令后标志位无定义。
八、BCD算术运算
十进制数在机器中采用BCD码表示,以压缩格式存放,即一个字节存储2位BCD码,BCD加减法是在二进制加减运算的基础上,对其二进制结果进行调整,将结果调整成BCD码表示形式。
(1) 格式:DAA
功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。
调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高4位有进位),则
AL+6→AL,1→AF,
若AL中高4位大于9,或标志CF=1,(表示高4位有进位),则
AL+60H→AL,1→CF,
DAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
例 3.33
[Asm] 纯文本查看 复制代码 ADD AL,BL
DAA
(2) 格式:DAS
功能:将存放在AL中的二进制差数,调整为压缩的BCD码表示形式。
调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高位借位),则
AL-6→AL,1→AF
若AL中高4位大于9或标志CF=1(表示高4位向高位借位),则
AL-60H→AL,1→CF
DAS指令一般紧跟在SUB或SBB指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
例 3.34
[Asm] 纯文本查看 复制代码 SUB AL,BL
DAS
九、ASCII算术运算
数字0~9的ASCII码为30H~39H,机器采用一个字节存放一位ASCII码,对于ASCII码的算术运算是在二进制运算基础上进行调整。调整指令有加、减、乘、除四种调整指令。
(1) 格式:AAA
功能:将存放在AL中的二进制和数,调整为ASCII码表示的结果。
调整方法:若AL中低4位小于或等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1(进位),则AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。
AAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为AF,CF。其它标志位无定义。
例 3.35
[Asm] 纯文本查看 复制代码 MOV AX,0036H
ADD,AL,35H
AAA;AX=0101H
(2) 格式:AAS
功能:将存放在AL中的二进制差数,调整为ASCII码表示形式
调整方法:若AL中低4位小于等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1,则AL-6→AL,AH-1→AH,1→AF,AF→CF,AL中高4位清0。
AAS指令一般紧跟在SUB,SBB指令之后使用,影响标志位为AF,CF。其它标志位无定义。
例 3.36
[Asm] 纯文本查看 复制代码 MOV AX,0132H
SUB AL,35H
AAS;AX=0007H
(3) 格式:AAM
功能:将存放在AL中的二进制积数,调整为ASCII码表示形式。
调整方法:AL/10商→AH,余数→AL
AAM指令一般紧跟在MUL指令之后使用,影响标志位为SF,ZF,PF。其它标志位无定义。
例 3.37
[Asm] 纯文本查看 复制代码 MOV AL,07H
MOV BL,09H
MUL BL;AX=003FH
AAM;AX=0603H
(4) 格式:AAD
功能:将AX中两位非压缩BCD码(一个字节存放一位BCD码),转换为二进制数的表示形式。
调整方法:AH10+AL→AL0→AH
AAD指令用于二进制除法DIV操作之前,影响的标志位为SF,ZF,PF。其它标志位无定义。
例 3.38
[Asm] 纯文本查看 复制代码 MOV AX,0605H
MOV BL,09H
AAD;AX=0041H
DIV BL;AX=0207H
使用该类指令应注意,加法、减法和乘法调整指令都是紧跟在算术运算指令之后,将二进制的运算结果调整为非压缩BCD码表示形式,而除法调整指令必须放在除法指令之前进行,以避免除法出现错误的结果。
使用算术运算类指令应注意:
·如果没有特别规定,参与运算的两个操作数数据类型必须一致,且只允许一个为存储器操作数;
·如果参与运算的操作数只有一个,且为存储器操作数,必须使用PTR伪指令说明数据类型;
·操作数不允许为段寄存器。
·目的操作数不允许为立即数;
·如果是存储器寻址,则存储器各种寻址方式均可使用。
|