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

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

十进制调整指令  

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

  下载LOFTER 我的照片书  |

需要掌握的内容:

学会十进制调整类指令

压缩的8421码调整指令:

DAADecimal Adjust for Addition 加法的十进制调整指令

DASDecimal Adjust for Subtraction 减法的十进制调整指令

非压缩的8421码调整指令:

AAAASCII Adjust for Addition 加法的ASCII调整指令

AASASCII Adjust for Subtraction 减法的ASCII调整指令

AAMASCII Adjust for Multiplication 乘法的ASCII调整指令

AADASCII Adjust for Division 除法的ASCII调整指令

1. 十进制调整类指令

之前我们讲的整数算术指令都是处理二进制数值的,尽管CPU是以二进制数方式进行运算的,但是也能处理ASCII十进制数串的算术运算。后者可以方便地由用户输入并在控制台窗口中显示,无须转换成二进制数值。

假设程序需要用户输入两个数字并把它们相加,下面是一个输出样例,其中用户输入了34021256

Enter first number: 3402

Enter second number: 1256

The sum is: 4658

在计算和显示数字的时候有两种选择:

1. 把两个操作数转换成二进制数值并相加,然后把和从二进制数转换成ASCII码数字串的格式后再显示。

2. 连续地把每对ASCII码数字直接相加(2+60+54+23+1)这样和就是ASCII数字串,可以直接在屏幕上显示。

计算机中常用8421码表示十进制数。十进制数码所对应的8421码如下:

8421码对应十进制表

8421

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

对应十进制

0

1

2

3

4

5

6

7

8

9

PC机里,表示十进制数的8421码可以用压缩的8421非压缩的8421码两种格式来表示。压缩的8421码用4位二进制数表示一个十进制数位。非压缩的8421码用8位表示一个十进制数位,8位中的低4位表示8421码,而高4位则没有意义。数字的ASCII码是一种非压缩8421,因为数字的ASCII码的高4位值为0011B,而低4位是以8421码表示的十进制数位,这符合非压缩8421码高4位无意义的规定。

压缩的8421码调整指令:

DAADecimal Adjust for Addition 加法的十进制调整指令

DASDecimal Adjust for Subtraction 减法的十进制调整指令

ADDADC以及SUBSSB指令只用于二进制数加、减法,是逢二进一,借一当二,对连续的4位二进制数是逢十六进一,借一当十六。但压缩的8421码却是逢十进一,借一当十。因此使用加、减法指令对8421码运算后,必须经调整才能得到正确的结果。

非压缩的8421码调整指令:

AAAASCII Adjust for Addition 加法的ASCII调整指令

AASASCII Adjust for Subtraction 减法的ASCII调整指令

AAMASCII Adjust for Multiplication 乘法的ASCII调整指令

AADASCII Adjust for Division 除法的ASCII调整指令

这一组指令适用于数字ASCII的调整,也适用于一般的非压缩8421码的十进制调整。

十进制调整指令不能单独使用,必须与加、减、乘、除二进制指令配合使用才能进行十进制调整。十进制调整指令形式上均为零地址指令,其操作对象由AX寄存器隐含。

1) DAADecimal Adjust for Addition

格式:daa

执行操作:把AL中的和调整到8421格式,这条指令执行之前必须先执行ADDADC指令,并且把两个8421码相加,并把结果存入在AL寄存器中。本指令的调整方式是:

如果AF标志(辅助进位位)为1,或者AL寄存器的低4位是十六进制的AH~FH(非法码),则将AL寄存器内容加06H,且将AF位置1

如果CF标志为1,或者AL寄存器的高4位是十六进制AH~FH(非法码),则将AL寄存器内容加60H,并将CF位置1

mov ah,0

mov al,9 ;al=0000 1001B 8421码的9

mov bl,9 ;bl=0000 1001B 8421码的9

add al,bl ;al=0001 0010B AF=1

daa ;al=0001 1000B=8421码的18 

mov ah,0

mov al,99 ;al=1001 1001

mov bl,99 ;bl=1001 1001

add al,bl ;al= (10011 0010B CF=1 AF=1

daa ;al=1001 1000=8421码的98

2) DASDecimal Adjust for Subtraction

格式:das

执行操作:把AL中的差调整到8421格式。在这条指令之前必须执行SUBSBB指令,把两个8421码相减并把差存放在AL寄存器中。调整方式是:

如果AF标志为1(低4位向高4位有借位),或者AL寄存器的低4位是十六进制的AH~FH(非法码),则将AL寄存器的内容减去06H,并将AF位置1;

如果CF标志为1(有借位),或者AL寄存器的高4位是十六进制的AH~FH(非法码),则将寄存器的内容减去60H,并将CF位置1

例如:

8421码数据xy均为16位(四位压缩8421码的十进制数据),它们在内存中的存放地址分别为XY,试完成X+YàZ,X-YàW,要求结果也是8421码数据,其中ZW均为字单元符号地址。

X dw 0010 0010  0001 0001B ;2211D

Y dw 0010 0010  0001 0001B ;2211D

Z dw ?

W dw ?

mov al,X ;al=0001 0001B

add al,Y ;x,y的十位、个位相加

daa ;十位、个位十进制加法调整

mov Z,al ;把十位、个位的8421码和送入Z8

mov al,X+1

adc al,Y+1 ;x,y的千位、百位相加,并加十位向百位的进位

daa ;千位、百位十进制加法调整

mov Z+1,al ;把千位、百位十的8421码和送入Z的高8

mov al,X

sub al,Y

das

mov W,al

mov al,X+1

sbb al,Y+1

das

mov W+1,al

3) AAAASCII Adjust for Addition

格式:aaa

执行操作:把AL中的和调整到非压缩的8421格式,AH的内容加上调整产生的进位值。这条指令之前必须执行ADDADC指令,并且把两个非压缩的8421码相加,然后把结果存放在AL寄存器中。本指令的调整步骤是:

1) 如果AL寄存器的低4位在0~9之间,且AF位为0,则跳过第2步,执行第3步。

2) 如果AL寄存器低4位在十六进制数A~F之间或AF位为1,则将AL寄存器的内容加6AH寄存器的内容加1,并将AF1

3) 清除AL寄存器的高4位。

4) AF位的值送CF位。

mov ah,0

mov al,00001001B ;al=8421码的9

mov bl,00001001B ;bl=8421码的9

add al,bl ;al=0001 0010B AF=1

aaa ;调整后al=00001000B=8D,ah=00000001B,CF=AF=1

4) AASASCII Adjust for Subtraction

格式:aas

执行操作:把AL中的差调整到非压缩的8421格式,AH的内容减去调整产生的借位值。这条指令之前必须执行SUBSBB指令,并且把两个非压缩的8421码相减,然后把结果存放在AL寄存器中。本指令的调整步骤是:

1) 如果AL寄存器的低4位在0~9之间,且AF位为0,则跳过第2步,执行第3步。

2) 如果AL寄存器的低4位在十六进制数A~F之间或AF位为1,则将AL寄存器的内容减去6AH寄存器的内容减1,并将AF位置1

3) 清除AL寄存器的高4位。

4) AF位的值送CF位。

例如:

设非压缩的8421码数据xyz均为16位(两位非压缩8421码的十进制数据),它们在内存中的存放地址分别为XYZ,试完成X+YZàW,要求结果也是非压缩的8421码数据,其中W为字单元符号地址。

X dw 0000 0010  0000 0010B ;22D

Y dw 0000 0001  0000 0001B ;11D

Z dw ?

W dw ?

mov ah,0

mov al,X ;al=0000 0010B

add al,Y ;x,y个位相加

aaa ;个位十进制数加法调整

mov W,al ;把个位的非压缩8421码和送入W的低字节

mov al,X+1

adc al,Y+1 ;x,y的十位相加,并加上个位向十位进位

aaa ;十位十进制数加法调整

mov W+1,al ;把十位的非压缩8421码和送入W的高字节

mov al,W

sub al,Z ;减去Z的个位

aas ;个位十进制数减法调整

mov W,al

mov al,W+1

sbb al,Z+1 ;减去Z的十位,并减去个位向十位借位

aas ;十位十进制数减法调整

mov W+1,al

5) AAMASCII Adjust for Multiplication

格式:aam

执行操作:把AL中的积调整到非压缩的8421格式,并送入AX寄存器。这条指令之前必须执行MUL指令,并且把两个非压缩的8421码相乘(此时要求其高4位为0),结果(积)必然放在AL寄存器中。本指令的调整方法是:

AL寄存器的内容除以0AH,并把商放在AH寄存器中,余数保存在AL寄存器中。

mov ah,0

mov al,00000101B ;al=8421码的5

mov bl,00000110B ;bl=8421码的6

mul bl ;ax=001EH=30D=0000 0000  0001 1110B

aam ;ah=3,al=0

6) AADASCII Adjust for Division

格式:aad

执行操作:

加法、减法和乘法的ASCII调整指令都是先用加法、减法和乘法指令对两个非压缩的8421码运算以后,再分别使用AAAAASAAM指令来对运算结果进行十进制调整的。除法的情况却不同,它是针对以下情况而设立:

如果被除数是存放在AX寄存器中的二位非压缩8421数,其中AH中存放十位数,AL中存放个位数,而且要求AHAL中的高4位均为0,在把这两个数用DIV指令相除以前,必须先用AAD指令把AX中的被除数调整成二进制数,并存放在AL寄存器中。因此AAD指令执行的操作是:

AL?10*AH+AL

AH?0

mov ax,00000011 00000111B ;ax=8421码的37

aad ;ah=0000 0000  al=0010 0101B

mov bl,00000101B ;bl=5

div bl ;ah=2,al=7

ASCII字符编码表

ASCII值 

字符 

控制字符 

ASCII值

字符 

ASCII值

字符 

ASCII值 

字符 

  000   

 空 

  NUL  

  032  

空格

  064  

  @ 

  096   

 `  

  001  

    

  SOH   

  033   

  !

  065   

  A

  097   

 a  

  002   

    

  STX   

  034   

  "

  066   

  B

  098   

 b  

  003   

    

  ETX   

  035   

  #

  067   

  C

  099   

 c  

  004   

    

  EOT   

  036   

  $

  068   

  D

  100   

 d  

  005   

    

  END   

  037   

  %

  069   

  E

  101   

 e  

  006   

    

  ACK   

  038   

  &

  070   

  F

  102   

 f  

  007   

嘟声 

  BEL   

  039    

   '

  071   

  G

  103   

 g  

  008   

    

   BS   

  040   

  (

  072   

  H

  104   

 h  

  009   

    

   HT   

  041   

  )

  073   

  I

  105   

 i  

  010   

换行 

   LF   

  042   

  * 

  074   

  J 

  106   

 j  

  011   

起始

   VT   

  043   

  + 

  075   

  K 

  107   

 k  

  012   

换页 

   FF    

  044    

  , 

  076    

  L 

  108    

 l   

  013    

回车 

   CR    

  045    

  - 

  077    

  M 

  109    

 m   

  014    

    

   SO    

  046    

  . 

  078    

  N 

  110    

 n   

  015    

    

   SI    

  047    

  / 

  079    

  O 

  111    

 o   

  016    

    

  DLE    

  048    

  0 

  080    

  P 

  112    

 p   

  017    

    

  DC1    

  049    

  1 

  081    

  Q 

  113    

 q   

  018    

    

  DC2    

  050    

  2 

  082    

  R 

  114    

 r   

  019    

    

  DC3    

  051    

  3 

  083    

  S 

  115    

 s   

  020    

    

  DC4    

  052    

  4 

  084    

  T 

  116    

 t   

  021    

    

  NAK    

  053    

  5 

  085    

  U 

  117    

 u   

  022    

    

  SYN    

  054    

  6 

  086    

  V 

  118    

 v   

  023    

    

  ETB    

  055    

  7 

  087    

  W 

  119    

 w   

  024    

    

  CAN    

  056    

  8 

  088    

  X 

  120    

 x   

  025    

    

   EM    

  057    

  9 

  089    

  Y 

  121    

 y   

  026    

    

  SUB    

  058    

  : 

  090    

  Z 

  122    

 z   

  027    

    

  ESC    

  059    

  ; 

  091    

  [ 

  123    

   

  028    

    

   FS    

  060    

  < 

  092    

  

  124    

 |   

  029    

    

   GS    

  061    

  = 

  093    

  ] 

  125    

   

  030   

   

   RS   

  062    

  > 

  094   

  ^ 

  126   

 ~  

  031   

   

   US   

  063   

  ? 

  095   

  _ 

  127   

   

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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