码制转换十二进制数ASCII码之间的互相转换BCD_第1页
码制转换十二进制数ASCII码之间的互相转换BCD_第2页
码制转换十二进制数ASCII码之间的互相转换BCD_第3页
码制转换十二进制数ASCII码之间的互相转换BCD_第4页
码制转换十二进制数ASCII码之间的互相转换BCD_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.码制转换 十、二进制数、ASCII码之间的互相转换。BCD数2进制数 算法:Dn-1*10n-1+D0*100 = (Dn-1*10+ Dn-2)*10+)*10+ D0 = (0*10+Dn-1)*10+ Dn-2)*10+)*10+ D0 即: 新的中间结果 = 中间结果*10+本位数字 (中间结果初值为0)4.5 常见程序设计举例1程序1:将65535的非压缩BCD数转换成2进制数。程序如下。 ;数据段定义 mydata SEGMENT decnum DB 5, 3, 0, 1, 9 ;BCD数 53019 binnum DW ?mydata ENDS2prog SEGMENT AS

2、SUME CS:prog,DS:mydatabegin: MOV AX, mydata MOV DS, AX MOV SI, OFFSET decnum MOV CX, 5 ;5位BCD数 MOV BX, 10 XOR AX, AX ;中间结果初始值为0Next: MUL BX ;中间结果*10+本位数字 ADD AL, SI ADC AH, 0 INC SI ;指向下位BCD数 LOOP next MOV binnum, AX ;保存结果 MOV AH, 4CH INT 21Hprog ENDS END begin3程序2:把255的非压缩BCD数转换成2进制数 decnum DB 1,5,

3、9 ;BCD数159 binnum DB ? MOV AX,decnum XCHG AH, AL ;百位在AH, 十位在AL AAD ;百位数*10 + 十位数 MOV AH, AL ;中间结果送AH MOV AL, decnum+2 AAD ;中间结果*10 + 个位数 MOV binnum, AL 4例:从键盘输入两个整数,并求其和。 因键入为整数,故要进行如下转换: ASCIIBCD二进制数 ASCIIBCD码很简单,高4位清零即可得到非压缩的BCD码。 BCD二进制数在本例中采用用以下方法: (0+千位数)*10+百位数)*10)+十位数)*10+个位数 ASCII码二进制数(用于输入

4、) 第一次中间结果第二次中间结果第三次中间结果最终结果5开始两个数分别转换成二进制数键入两个数相加结束返回DOS如有溢出则提示开始取第一个ASCII码是负号吗?数字符个数1,指针1指针定位字符个数1= 0?取数字,与中间结果相加,再乘以10指向下一个数字字符加个位数是负数则求补存结果结束NYYN转换子程序6程序如下:DATASEGMENTSTR1DB 10,?,10 DUP(?) ;第1个数的输入缓冲区STR2DB 10,?,10 DUP(?) ;第2个数的输入缓冲区NUMDW ?,? ;存转换后的二进制数SUMDW 0 ;存和OVERDB Overflow!,13,10,$DATAENDS;

5、CODESEGMENTASSUME CS:CODE,DS:DATAMAINPROCFAR7START: MOVAX,DATAMOVDS,AXMOVAH,0AHLEADX,STR1INT21H ;输入第一个数字串(设为26)MOVAH,0AHLEADX,STR2INT21H ;输入第二个数字串(设为33)LEABX,STR1 ;串1的首地址送BXLEADI,NUM ;存二进制首地址送DI CALLCHANGE ;将串1 ASCII码二进制 LEABX,STR2 ;串2的首地址送BX 8LEADI,NUM+2;指向CALLCHANGE;将串2 ASCII码二进制MOVAX,NUM ;(AX)=NU

6、M=001AH ADDAX,NUM+2;两数相加,(AX)=003BHMOVSUM,AX;存和JNONEXT;无溢出,转NEXTLEADX,OVERMOVAH,9INT21H;显示Overflow!NEXT:MOVAH,4CHINT21H;返回DOS MAINENDP9CHANGEPROCMOVCL,BX+1;实际字符数送CLMOVAL,BX+2;第一个字符送ALMOVCH,AL;暂存在CHCMPAL,-;第一个字符是负号吗?JNZNEXT1;不是,转NEXT1DECCL;字符数减1INCBXNEXT1: ADDBX,2;指向第一个数字字符MOVAX,0;清零AX,存二进制数LP1: DECC

7、LJZNEXT2;若(CL)=0,转NEXT2MOVDL,BX ;取字符ANDDL,0FH;转换成BCD码 ADD AL,DL ;加到中间结果上 ADC AH,010 MOV DX,10 MUL DX ;*10 INC BX ;指向下一个字符 JMP SHORT LP1NEXT2: MOV DL,BX ;取个位数 AND DL,0FH ;个位ASCII未组合BCD ADD AX,DX ;加个位数,(AX)=001AH CMP CH,- ;是-? JNZ NEXT3 ;该数非负,转NEXT3 NEG AX ;若为负,求补NEXT3: MOV DI,AX ;存二进制结果 RETCHANGE END

8、P;CODE ENDS END START11020A32360D020A33330D001A21003B00STR1STR2NUMSUM10个10个OOVER?040A313234STR1若键入 1234330D1234设键入第1个数为26, 第2个数为33,则在内存各变量分配如下:12本例题重点掌握:如何从键盘输入一个字符串ASCII未组合BCD二进制有符号数的运算,对负数和溢出如何处理思考题: 若键入第一个数26,第二个数为-4,填写各变量结果。13方法1 计算二进制数中所包含的1000的个数、100的个数、10的个数和1的个数。方法2 除10取余。下面举例介绍第一种方法。流程图如下:二

9、进制数BCD14 YN二进制数AX令(DL)0(AX)-10000?(DL)+1(AX)+1000(AX)DL存至缓冲区令(DL)0YN(AX)-100?(DL)+1(AX)+10(AX)存DL存AL返回DOS求100的个数,结构同上A15汇编程序如下:DATASEGMENTBNUMDB270FHDNUMDB4 DUP(?) ;存放BCD码的缓冲区DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATABINBCDPROCFARBEGIN: MOVAX,DATAMOVDS,AXMOVAX,BNUM ;取二进制数LEABX,DNUM ;BCD码缓冲区首地址送BX16 ;

10、计算百位的个数 MOV DL,0 ;千位的个数计数器AGAIN1: SUB AX,1000 ;(AX)-1000 JC NEXT1 ;若0,则退出循环 INC DL ;(DL)+1 JMP AGAIN1NEXT1: ADD AX,1000 ;(AX)(AX)+1000 MOV BX,DL ;存千位的个数 ;计算百位的个数 MOV DL,0 ;百位的个数计数器AGAIN2: SUB AX,100 ;(AX)-100 JC NEXT2 INC DL JMP AGAIN2NEXT2: ADD AX,100 MOV BX+1,DL ;存百位的个数17 MOV DL,0 ;十位的个数计数器AGAIN3:

11、 SUB AX,10 ;(AX)-10 JC NEXT3 INC DL JMP AGAIN3NEXT3: ADD AX,10 MOV BX+2,DL ;存十位的个数 MOV BX+3,AL ;存个位的个数 MOV AH,4CH INT 21HBINBCD ENDP;CODE ENDS END BEGIN18BCDASCII 前面举例介绍过,略。二进制串转换为ASCII码 一个二进制位串若要送显示或打印, 需把串中每一位(0或1)化为ASCII码。 思路:先将目标串全部预置为30H,再把每个二进制位逐位左移至CF,然后判CF=0?若是,取下一位;若不是,将31H送此单元。 流程图如下:19初始化

12、用0填满串取要转换的数左移1位存入1结束CF=1?转换完?调整指针NN20汇编程序如下:DATASEGMENTNUMDW6F78HSTRINGDB16 DUP(?)DATAENDS;CODESEGMENTASSUME CS:CODE,DS:DATABINCAPROCFARBEGIN:MOVAX,DATAMOVDS,AXMOVES,AXCLDLEADI,STRINGMOVCX,16 ;串的长度21MOVAL,30HREPSTOSB ;串中全部填充为0MOVCX,16LEADI,STRINGMOVAL,1MOVBX,NUM ;(BX)=6F78HAGAIN:RCLBX,1 ;含进位位循环左移JNC

13、NEXT ;若为0,转 MOV DI,AL ;若为1,对应位送入1NEXT:INCDILOOPAGAIN22MOVAH,4CHINT21HBINCAENDPCODEENDSENDBEGIN 232.子程序的参数传递 编写子程序时,很重要的一个工作是如何把参数传给子程序,这个过程叫参数传送。 传送方法有:把参数放在CPU内部寄存器中把参数放在变量中把参数放在地址表中利用堆栈传送参数24 下面举例介绍第4种方法,它通常在主程序中把参数或参数地址保存在堆栈中,而在子程序中将参数从堆栈取出来。例:把一个用十六进制表示的字ASCII码,然 后送到屏幕上显示。 汇编程序如下:DATASEGMENTNUMD

14、W25AFH ;要显示的数STRINGDB4 DUP(?),13,10,$DATAENDS25STACKSEGMENTDB 100 DUP(?)TOP EQU $ STACKENDS ; CODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AX MOV SP,TOP LEABX,STRING;取变量偏址PUSHBX;将偏址压栈PUSHNUM;将变量压栈00020064H0062H(SP)25AF0060H堆栈26 CALLBINHEX;(SP)=00

15、5EH CS:0113 LEADX,STRING;(DX)=0002HMOVAH,9INT21HMOVAH,4CHINT21H;*BINHEXPROCPUSHBP;(SP)=005CHMOVBP,SP;(BP)=005CHPUSHAX ;(SP)=005AHPUSHDI ;(SP)=0058HPUSHCX ;(SP)=0056HPUSHDX ;(SP)=0054H00020064H0062H25AF0060H005EH0113005CH(SP)返回地址(IP)原(BP)2700020064H0062H25AF0060H005EH0113xxxx005CH(BP) PUSHF ;(SP)=005

16、2H MOV AX,BP+4 ;(AX)=25AFH MOV DI,BP+6 ;(DI)=0002H ADD DI,LENGTH STRING-4;(DI)=0005H MOV DX,AX ;(DX)=25AFH MOV CX,4 STD ;从后往前存AGAIN:AND AX,0FH ;第一次(AX)=000FH CALL HEXD ;转换为ASCII码 STOSB PUSH CX MOV CL,4 SHR DX,CL ;逻辑右移4位 MOV AX,DX ;第1次(AX)=025AH POP CX LOOP AGAIN ;(CX)-1=0?不等,转+428POPFPOPDX POPCXPOPDIPOPAXPOPBPRET4 BINHEX ENDP ;*HEXD PROC CMP AL,0AH JL LP ADD AL,7LP: ADD AL,30H RETHEXD ENDPCODE ENDS END BEGIN0064H00

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论