汇编语言指令基础——算数运算指令

Eddy 发布于2009-12-12 11:45:37 分类: 加密解密 已浏览loading 网友评论0条 我要评论

加法运算指令

ADD(ADD)加法指令

ADD     DST , SRC      //Byte/Word

执行操作: dst=dst+src

1.两个存储器操作数不能通过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 根据结果来设置:不等于0ZF=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 ( INCreament) 1指令

INC    OPR    //Byte/Word

执行操作: OPR=OPR+1

1.OPR可以是寄存器和存储器操作数, 但不能是立即数和段寄存器

2.影响标志位OF,SF,ZF,PF AF,不影响CF.

 

减法运算指令

SUB ( SUBtract ) 不带借位的减法指令

SUB    DST , SRC    //Byte/Word

执行操作:dst=dst - src

1.DSTSRC寻址方式及规定与ADD相同.

2.影响全部标志位.(判断标志位参见ADD)

 

 

SBB ( SuBtract with Borrow) 带借位减法指令

SBB    DST , SRC        //Byte/Word

执行操作:dst= dst - src - CF

 

DEC ( DECrement ) 1指令

DEC    OPR    //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
A>B CF=0 && ZF=0 SF^OF=0 && ZF=0
A<B CF=1 && ZF=0 SF^OF=1 && ZF=0
A>=B CF=0 || ZF=1 SF^OF=0 || ZF=1
A<=B CF=1 || ZF=1 SF^OF=1 || ZF=1

 

 

乘法运算指令

MUL ( unsigned MULtiple ) 无符号数乘法指令

MUL    SRC //Byte/Word    .

执行操作:Byte =>   AX= AL *src    //字节运算时目的操作数用AL, 乘积放在AX

         Word =>   DX=AX *src    //字运算时目的操作数用AX, DX存放乘积的高位字, AX放乘积的低位字

1.目的数必须是累加器 AX AL,指令中不需写出

2. 源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数, 而绝对不允许是立即数或段寄存器.

 

IMUL (sIgned MULtiple) 有符号数乘法指令

IMUL    SRC    //MUL指令相同,但必须是带符号数

 

 

除法运算指令

DIV ( unsigned DIVide) 无符号数除法指令

DIV     SRC        //Byte/Word    其中: SRC的规定同乘法指令MUL

执行操作:Byte => AX / src     //字节运算时目的操作数在AX,结果的商在AL,余数中AH

         Word=> DX,AX /src //字运算时目的操作数在DX高位字AX低位字,结果的商在AX,余数在DX

存储器操作数必须指明数据类型:BYTE PTR src 或 WORD PTR src

 

IDIV (sIgned DIVied) 有符号数除法指令

IDIV     SRC        //Byte/Word        DIV指令相同,但必须是带符号数

 

 

转换指令

CBW (Convert Byte to Word) 字节转换为字指令

CBW

执行操作: AL中的符号位(D7)扩展到8位AH中,若AL中的D7=0,则AH=00H,若AL中的D7=1,则AH=FFH.

 

CWD (Convert Word to Double word) 字转换为双字指令

CWD

执行操作: AX中的符号位(D15)扩展到16位DX中,若AX中的D15=0,则DX=0000H,若AX中的D15=1,则DX=FFFFH.

 

 

十进制调整指令

当计算机进行计算时,必须先把十进制数转换为二进制数,再进行二进制数运算,最后将结果又转换为十进制数输出.

在计算机中,可用4位二进制数表示一位十进制数,这种代码称为BCD ( Binary Coded Decimal ).

BCD码又称8421码,在PC机中,BCD码可用压缩的BCD码和非压缩的BCD码两种格式表示.

压缩的BCD4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串.

非压缩的BCD以8位为一组表示一个十进制数,8位中的低4位表示8421BCD码,而高4位则没有意义.

 

压缩的BCD码调整指令

DAA (Decimal Adjust for Addition) 加法的十进制调整指令

DAA

执行操作:执行之前必须先执行ADDADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中.

 

DAS (Decimal Adjust for Subtraction) 减法的十进制调整指令

DAS

执行操作:执行之前必须先执行SUBSBB指令,减法指令必须把两个压缩的BCD码相减,并氢结果存放在AL寄存器中.

 

 

非压缩的BCD码调整指令

AAA (ASCII Adjust for Addition) 加法的ASCII调整指令

AAA

执行操作:执行之前必须先执行ADDADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存话在AL寄存器中.

 

AAS (ASCII Adjust for Subtraction) 减法的ASCII调整指令

AAS

执行操作:执行之前必须先执行SUBSBB指令,减法指令必须把两个非压缩的BCD码相减,并氢结果存放在AL寄存器中

已经有(0)位网友发表了评论,你也评一评吧!
原创文章如转载,请注明:转载自Eddy Blog
原文地址:http://www.rrgod.com/decryption/220.html     欢迎订阅Eddy Blog

记住我的信息,下次不用再输入 欢迎给Eddy Blog留言