注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

算术运算类指令  

2012-05-06 18:06:45|  分类: 8086饭客网汇编学 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

需要掌握的内容:

1. 学会加减法指令

2. 学会乘除法指令

1. 加减法指令

ADDAdd 加法指令

ADC(Add with Carry) 带进位加法指令

INC(Increment) 1指令

SUB(Subtract) 减法指令

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

DEC(Decrement) 1指令

NEG(Negate) 求补指令

CMPCompare 比较指令

1) ADDAdd

格式:add dst,src dst是目的Destinationsrc是源Source

执行操作:dst?dst+src

add ax,bx

add ah,al

2) ADC(Add with Carry) 

格式:adc dst,src

执行操作:dst?dst+src+CF (CF为进位位的值)

mov ax,1

mov bx,2

adc ax,bx 如果CF0,这条指令执行结果为ax=3,CF1ax=4

3) INC(Increment)

格式:inc opr

执行操作:opr?opr+1

inc ax

4) SUB(Subtract)

格式:sub dst,src

执行操作:dst?dst-src

sub ax,bx

sub ah,bl

5) SBB(Subtract with Borrow)

格式:sbb dst,src

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

mov ax,2

mov bx,1

sbb ax,bx 如果CF0,这条指令执行结果为ax=1CF1ax=0

6) DEC(Decrement)

格式:dec opr

执行操作:opr?opr-1

dec ax

7) NEG(Negate)

格式:neg opr

执行操作:opr?-opr

mov ax,2

neg ax

8) CMPCompare

格式:cmp opr1,opr2

执行操作:opr1-opr2

mov ax,1

mov bx,1

cmp ax,bx

cmp指令与sub指令一样都减法操作,但它并不保存差,只是根据结果设置标志位。cmp指令后面常跟着条件转移指令,根据结果转向不同的程序段。

以上这些指令除incdec不影响标志位外,上述指令都影响标志位。

条件标志位中最主要的就是CF,ZF,SF,OF

OF标志位是反应带符号数的溢出情况的。 

当两个符号相同的数相加,结果的符号与之相反,则OF=1,否则OF=0. 

当两个符号不同的数相减,结果的符号与减数相同,则OF=1,否则OF=0.

例:若内存中有两个32位操作数xy,存入地址分别为XY,求x+yàxx-yàx的程序段。

解:

X dd 87654321H

Y dd 12345678H

lea bx,X ;bx指向x低字

mov ax,[bx] ;x低字送入ax

add ax,4[bx] ;y低字相加

mov [bx],ax ;送和低字

inc bx

inc bx ;bx指向x高字

mov ax,[bx] ;x高字送入ax

adc ax,4[bx] ;y高字及低字进位相加

mov [bx],ax ;送和高字

2. 乘除法指令

MUL(Unsigned Multiple) 无符号数乘法指令

IMUL(Signed Multiple) 带符号数乘法指令

DIV(Unsigned Divide) 无符号数除法指令

IDIV(Signed Divide) 带符号数除法指令

与除法指令相关的两条符号扩展指令:

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

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

1) MUL(Unsigned Multiple)

格式:mul src (srcSource)

执行操作:

字节操作数:ax?al*src

字操作数:dx,ax?ax*src

例:字节

mov al,5H

mov bl,10H

mul bl ;AX=0050H AH=00HàCF=0

value1 dw 2000h

value2 dw 0100H

mov ax,value1

mul value2 ;DX:AX=00200000H   DX=0020HàCF=1

2) IMUL(Signed Multiple)

格式:imul src

执行操作:与mul相同,但操作数是带符号数

例:字节

mov al,48

mov bl,4

imul bl ;AX=00C0H, AH=00Hà OF=1

mov al,-4

mov bl,4

imul bl ;AX=FFF0H,AH=FFHà OF=0

mov ax,48

mov bx,4

imul bx ;DX:AX=000000C0H,DX=0000Hà OF=0

在乘法指令里,被乘数由累加器隐含指定,字运算为AX,字节运算为AL,乘数由SRC指定。两个8位数相乘得到16位乘积隐含存放在AX中,两个16位数相乘得到的32位乘积,隐含存放在DXAX中,其中DX存放高位字,AX存放低位字。指令中的源操作数SRC可以使用除立即数方式以外的任一种寻址方式。

乘法指令影响CFOF位,对于MUL指令,如果乘积的高一半为0,对于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CFOF0,否则为CFOF1。这样的标志位设置可以用来检查字节相乘的结果是字节还是字,检查字相乘的结果是字还是双字。

例:字节

3) DIV(Unsigned Divide)

格式:div src

执行操作:

字节操作数:执行前,16位被除数隐含在AX中,由SRC指定8位除数,执行后结果的8位商在AL中,8位余数在AH中。

al?ax/src的商

ah?ax/src的余数

字操作数:执行前,32位被除数隐含在DXAX中,其中DX为高位字,16位除数由SRC指定,执行后16位商在AX中,16位余数在DX中。

ax?(dx,ax)/src的商

dx?(dx,ax)/src的余数

例:字节

mov ax,83H

mov bl,2

div bl ;

4) IDIV(Signed Divide)

格式:idiv src

执行操作:与div相同,但操作数是带符号数,商和余数也均为带符号数,且余数的符号和被除数的符号相同。

与乘法指令类似,也采用隐含方式。被除数必须存放在AX16位)或DXAX32位)中。而除数可以用除立即数以外的任何一种寻址方式。

由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,因此,当使用带符号除IDIV指令时,往往需要用符号扩展的方法取得除法指令所需要的被除数格式。

5) CBW(Convert Byte to Word)

格式:cbw

执行操作:将AL的的符号扩展到AH。即若AL的最高位为0,则AH=00,若AL的最高位为1,则AH=0FFH

例如:

mov al,9BH ;9BH=-101D

cbw ;执行完后AX=FF9BH

6) CWD(Convert Word to Double Word)

格式:cwd

执行操作:将AX的的符号扩展到DX。即若AX的最高位为0,则DX=0000,若AX的最高位为1,则DX=0FFFFH

mov AX,9BH ;AX=FF9BH

cbw ;执行完后DX:AX=FFFFFF9BH

例子:

算术运算的综合举例,若xyzv均为16位带符号数,并已分别装入以XYZV为符号地址的单元中,要求计算(v-(x*y+z-540))/x,并将结果——商存入符号地址为W的字单元中。

X dw ****H

Y dw ****H

Z dw ****H

V dw ****H

W dw ?

mov ax,X

imul Y ;x乘以y

mov cx,ax ;把乘积的低字放入cx

mov bx,dx ;把乘积的高字放入bx

mov ax,Z

cwd ;Z扩展为双字

add cx,ax

adc bx,dx

sub cx,540D ;减去540

sbb bx,0 ;调整高字内容,防止有借位

mov ax,V

cwd ;V扩展为双字

sub ax,cx

sbb dx,bx

idiv X

mov W,ax ;将商送入W

  评论这张
 
阅读(351)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017