中国高校课件下载中心 》 教学资源 》 大学文库

《微机原理与接口技术》课程教学资源(PPT课件)第4章 汇编语言程序设计(3/3)

文档信息
资源类别:文库
文档格式:PPT
文档页数:31
文件大小:189KB
团购合买:点击进入团购
内容简介
汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计
刷新页面文档预览

4.5常见程序设计举例 1.码制转换 十、二进制数、ASCⅠI码之间的互相转换 ①BcD数→2进制数 算法:Dn101+…+D0+10 (.(Dn110+Dn2)*10+.)10+Do =(..(010+Dn1)*10+Dn2)*10+.)*10+D 即:新的中间结果=中间结果*10+本位数字 (中间结果初值为0)

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:将≤65535的并压缩BCD数转换成2进 制数。程序如下 ;数据殿定义 mydata SEGMENT decnum DB 5, 3, 0, 1, 9 BCD #3 53019 binnum DW mydata ENDS

2 程序1:将≤65535的非压缩BCD数转换成2进 制数。程序如下。 ;数据段定义 mydata SEGMENT decnum DB 5, 3, 0, 1, 9 ;BCD数 53019 binnum DW ? mydata ENDS

prog SEGMENT ASSUME CS. prog, DS. mydata begin: MOv Ax, mydata MOV DS.AX MOV S OFFSET decnum MOV CX. 5 5位BCD数 MOV BX 10 XOR AXAX ;中间结果初始值为0 Next MUL BX ;中间同结果*10+本位数字 ADD AL, [SI ADC AH0 INC S 指向下位BCD数 LOoP next Mov binnum. X ;(存结果 MOV AH 4CH INT 21H prog ENDS ENd begin

3 prog SEGMENT ASSUME CS:prog,DS:mydata begin: MOV AX, mydata MOV DS, AX MOV SI, OFFSET decnum MOV CX, 5 ;5位BCD数 MOV BX, 10 XOR AX, AX ;中间结果初始值为0 Next: MUL BX ;中间结果*10+本位数字 ADD AL, [SI] ADC AH, 0 INC SI ;指向下位BCD数 LOOP next MOV binnum, AX ;保存结果 MOV AH, 4CH INT 21H prog ENDS END begin

程序2:把255的非压缩BCD数转换成2进制数 decnum Db 1, 5, 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 程序2:把≤255的非压缩BCD数转换成2进制数 decnum DB 1,5,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 ……

② ASCII码→二进制数(用于输入) 例:从键盘输入两个整数,并求其和。 因键入为整数,故要进行如下转换: ASCII→BCD→二进制数 ASCII→BCD码很简单,高4位清零即可得到非压 缩的BCD码。 BCD→二进制数在本例中采用用以下方法: (((0+千位数)*10+百位数)*10)+十位数)*10+个位数 第一次中间结果 第二次中间结果 第三次中间结果 最终结果

5 例:从键盘输入两个整数,并求其和。 因键入为整数,故要进行如下转换: ASCII→BCD→二进制数 ASCII→BCD码很简单,高4位清零即可得到非压 缩的BCD码。 BCD→二进制数在本例中采用用以下方法: ((((0+千位数)*10+百位数)*10)+十位数)*10+个位数 ②ASCII码→二进制数(用于输入) 第一次中间结果 第二次中间结果 第三次中间结果 最终结果

开始 转换子程序 开始 取第一个ASC码」 是负号吗 键入两个数 Y 匚数字符个数=1,指针+1 两个数分别转换 成二进制数 指针定位 字符个数-1 相加 0? 加个位数 如有溢出则提示 取数字,与中间结果 是负数 返回DOS 相加,再乘以10 则求补 指向下一个数字字符 存结果 结束 结束)

6 开始 两个数分别转换 成二进制数 键入两个数 相加 结束 返回DOS 如有溢出则提示 开始 取第一个ASCII码 是负号吗? 数字符个数-1,指针+1 指针定位 字符个数-1 = 0? 取数字,与中间结果 相加,再乘以10 指向下一个数字字符 加个位数 是负数 则求补 存结果 结束 N Y Y N 转换子程序

程序如下: DATA SEGMENT STRI DB10,?,10DUP(?);第1个数的输入缓冲区 STR2 DB10,?,10DUP(?);第2个数的输入缓冲区 NUM DW?,? 存转换后的二进制数 SUM DW O ;存和 OVER DB Overflow!,13, 10, 'S DATA ENDS CODE SEGMENT ASSUME CS: CODE. DS: DATA PROC FAR

7 程序如下: DATA SEGMENT STR1 DB 10,?,10 DUP(?) ;第1个数的输入缓冲区 STR2 DB 10,?,10 DUP(?) ;第2个数的输入缓冲区 NUM DW ?,? ;存转换后的二进制数 SUM DW 0 ;存和 OVER DB ‘Overflow!’ ,13,10, ’$’ DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR

START: MOV AX DATA Mov DS. AX MOV AH. OAH LEA DX STRI INT 21H 输入第一个数字串(设为26) MOV AH. OAH LEA DX STR2 INT 21H 输入第二个数字串(设为33) LEA BX STR1 串1的首地址送BX LEA DI NUM 存二进制首地址送DI CALL CHANGE;将串1ASCI码→二进制 LEA BX STR2 串2的首地址送BX

8 START: MOV AX,DATA MOV DS,AX MOV AH,0AH LEA DX,STR1 INT 21H ;输入第一个数字串(设为26) MOV AH,0AH LEA DX,STR2 INT 21H ;输入第二个数字串(设为33) LEA BX,STR1 ;串1的首地址送BX LEA DI,NUM ;存二进制首地址送DI CALL CHANGE ;将串1 ASCII码→二进制 LEA BX,STR2 ;串2的首地址送BX

LEA DI,NUM+2;指向 CALL CHANGE ;将串2ASCI码→二进制 MOV AX. NUM (AX=LNUM=001AH ADD AX. NUM+2 两数相加,(AX)=003BH MOV SUM. AX ;存和 JNO NEXT 无溢出,转NEXT LEA DX. OVER Mov aH. 9 INT 21H ;显示’0 verflow! NEXT: MOV AH. 4CH INT 21H 返回DOS MAIN ENDP

9 LEA DI,NUM+2 ;指向 CALL CHANGE ;将串2 ASCII码→二进制 MOV AX,NUM ;(AX)=[NUM]=001AH ADD AX,NUM+2 ;两数相加,(AX)=003BH MOV SUM,AX ;存和 JNO NEXT ;无溢出,转NEXT LEA DX,OVER MOV AH,9 INT 21H ;显示’Overflow!’ NEXT: MOV AH,4CH INT 21H ;返回DOS MAIN ENDP

CHANGE PROC MOV CL,[BX+1];实际字符数送CL MOV AL,[BX+2];第一个字符送AL MOV CH AL ;暂存在CH CMP AL 第一个字符是负号吗? JNZ NEXTI 不是,转NEXT1 DEC CL ;字符数减1 INC BX NEXTI: ADD BX. 2 指向第一个数字字符 MOV AX. O 清零AX,存二进制数 LPI DEC CL JZ NEXT2 若(CL)=0,转NEXT2 MOV DL, BX 取字符 AND DL, OFH 转换成BCD码 ADD AL DL ;加到中间结果上 ADC AH.O

10 CHANGE PROC MOV CL,[BX+1] ;实际字符数送CL MOV AL,[BX+2] ;第一个字符送AL MOV CH,AL ;暂存在CH CMP AL,’-’ ;第一个字符是负号吗? JNZ NEXT1 ;不是,转NEXT1 DEC CL ;字符数减1 INC BX NEXT1: ADD BX,2 ;指向第一个数字字符 MOV AX,0 ;清零AX,存二进制数 LP1: DEC CL JZ NEXT2 ;若(CL)=0,转NEXT2 MOV DL,[BX] ;取字符 AND DL,0FH ;转换成BCD码 ADD AL,DL ;加到中间结果上 ADC AH,0

刷新页面下载完整文档
VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
相关文档