37汇编语言.ppt

上传人:李医生 文档编号:8570897 上传时间:2020-11-26 格式:PPT 页数:26 大小:134KB
返回 下载 相关 举报
37汇编语言.ppt_第1页
第1页 / 共26页
37汇编语言.ppt_第2页
第2页 / 共26页
37汇编语言.ppt_第3页
第3页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《37汇编语言.ppt》由会员分享,可在线阅读,更多相关《37汇编语言.ppt(26页珍藏版)》请在三一文库上搜索。

1、第三章 指令系统 程序设计,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),3.5 常见程序设计举例,第三章 指令系统 程序设计,2,程序1:将65535的非压缩BCD数转换成2进制数。程序如下。 mydata SEGMENT ;数据段定义 decnum DB 5, 3, 0, 1, 9 ;BCD数 53019 binn

2、um DW ? mydata ENDS,第三章 指令系统 程序设计,3,程序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,例:从键盘输入两个整数,并求其和。 因键入为整数,故要进行如下转换: ASCIIBCD二进制数 ASCIIBCD码

3、很简单,高4位清零即可得到非压缩的BCD码。 BCD二进制数在本例中采用用以下方法: (0+千位数)*10+百位数)*10)+十位数)*10+个位数,ASCII码二进制数(用于输入),第一次中间结果,第二次中间结果,第三次中间结果,最终结果,第三章 指令系统 程序设计,5,第三章 指令系统 程序设计,6,LEADI,NUM+2;指向 CALLCHANGE;将串2 ASCII码二进制 MOVAX,NUM ;(AX)=NUM=001AH ADDAX,NUM+2;两数相加,(AX)=003BH MOVSUM,AX;存和 JNONEXT;无溢出,转NEXT LEADX,OVER MOVAH,9 INT

4、21H;显示Overflow! NEXT:MOVAH,4CH INT21H;返回DOS MAINENDP,第三章 指令系统 程序设计,7,CHANGEPROC MOVCL,BX+1;实际字符数送CL MOVAL,BX+2;第一个字符送AL MOVCH,AL;暂存在CH CMPAL,-;第一个字符是负号吗? JNZNEXT1;不是,转NEXT1 DECCL;字符数减1 INCBX NEXT1: ADDBX,2;指向第一个数字字符 MOVAX,0;清零AX,存二进制数 LP1: DECCL JZNEXT2;若(CL)=0,转NEXT2 MOVDL,BX ;取字符 ANDDL,0FH;转换成BCD码

5、 ADD AL,DL ;加到中间结果上 ADC AH,0,第三章 指令系统 程序设计,8,MOV DX,10 MUL DX ;*10 INC BX ;指向下一个字符 JMP SHORT LP1 NEXT2: MOV DL,BX ;取个位数 AND DL,0FH ;个位ASCII未组合BCD ADD AX,DX ;加个位数,(AX)=001AH CMP CH,- ;是-? JNZ NEXT3 ;该数非负,转NEXT3 NEG AX ;若为负,求补 NEXT3: MOV DI,AX ;存二进制结果 RET CHANGE ENDP ; CODE ENDS END START,第三章 指令系统 程序设

6、计,9,设键入第1个数为26, 第2个数为33,则在内存各变量分配如下:,第三章 指令系统 程序设计,10,方法1 计算二进制数中所包含的1000的个数、100的个数、10的个数和1的个数。 方法2 除10取余。 下面举例介绍第一种方法。流程图如下:,二进制数BCD,第三章 指令系统 程序设计,11,第三章 指令系统 程序设计,12,汇编程序如下: DATASEGMENT BNUMDB270FH DNUMDB4 DUP(?) ;存放BCD码的缓冲区 DATAENDS CODESEGMENT ASSUME CS:CODE,DS:DATA BINBCDPROCFAR BEGIN: MOVAX,DA

7、TA MOVDS,AX MOVAX,BNUM ;取二进制数 LEABX,DNUM ;BCD码缓冲区首地址送BX,第三章 指令系统 程序设计,13,;计算百位的个数 MOV DL,0 ;千位的个数计数器 AGAIN1: SUB AX,1000 ;(AX)-1000 JC NEXT1 ;若0,则退出循环 INC DL ;(DL)+1 JMP AGAIN1 NEXT1: ADD AX,1000 ;(AX)(AX)+1000 MOV BX,DL ;存千位的个数 ;计算百位的个数 MOV DL,0 ;百位的个数计数器 AGAIN2: SUB AX,100 ;(AX)-100 JC NEXT2 INC D

8、L JMP AGAIN2 NEXT2: ADD AX,100 MOV BX+1,DL ;存百位的个数,第三章 指令系统 程序设计,14,MOV DL,0 ;十位的个数计数器 AGAIN3: SUB AX,10 ;(AX)-10 JC NEXT3 INC DL JMP AGAIN3 NEXT3: ADD AX,10 MOV BX+2,DL ;存十位的个数 MOV BX+3,AL ;存个位的个数 MOV AH,4CH INT 21H BINBCD ENDP ; CODE ENDS END BEGIN,第三章 指令系统 程序设计,15,BCDASCII 前面举例介绍过,略。 二进制串转换为ASCII

9、码 一个二进制位串若要送显示或打印, 需把串中每一位(0或1)化为ASCII码。 思路:先将目标串全部预置为30H,再把每个二进制位逐位左移至CF,然后判CF=0? 若是,取下一位;若不是,将31H送此单元。 流程图如下:,第三章 指令系统 程序设计,16,第三章 指令系统 程序设计,17,汇编程序如下: DATASEGMENT NUMDW6F78H STRINGDB16 DUP(?) DATAENDS ; CODESEGMENT ASSUME CS:CODE,DS:DATA BINCAPROCFAR BEGIN:MOVAX,DATA MOVDS,AX MOVES,AX CLD LEADI,S

10、TRING MOVCX,16 ;串的长度,第三章 指令系统 程序设计,18,MOVAL,30H REPSTOSB ;串中全部填充为0 MOVCX,16 LEADI,STRING MOVAL,1 MOVBX,NUM ;(BX)=6F78H AGAIN:RCLBX,1 ;含进位位循环左移 JNCNEXT ;若为0,转 MOV DI,AL ;若为1,对应位送入1 NEXT:INCDI LOOPAGAIN MOVAH,4CH INT21H BINCAENDP CODEENDS ENDBEGIN,第三章 指令系统 程序设计,19,2.子程序的参数传递 编写子程序时,很重要的一个工作是如何把参数传给子程序

11、,这个过程叫参数传送。 传送方法有: 把参数放在CPU内部寄存器中 把参数放在变量中 把参数放在地址表中 利用堆栈传送参数,第三章 指令系统 程序设计,20,下面举例介绍第4种方法,它通常在主程序中把参数或参数地址保存在堆栈中,而在子程序中将参数从堆栈取出来。 例:把一个用十六进制表示的字ASCII码,然 后送到屏幕上显示。 汇编程序如下: DATASEGMENT NUMDW25AFH ;要显示的数 STRINGDB4 DUP(?),13,10,$ DATAENDS,第三章 指令系统 程序设计,21,STACKSEGMENT DB 100 DUP(?) TOP EQU $ STACKENDS

12、CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOVAX,DATA MOVDS,AX MOVES,AX MOVAX,STACK MOVSS,AX MOV SP,TOP LEABX,STRING;取变量偏址 PUSHBX;将偏址压栈 PUSHNUM;将变量压栈,第三章 指令系统 程序设计,22,CALLBINHEX;(SP)=005EH CS:0113 LEADX,STRING;(DX)=0002H MOVAH,9 INT21H MOVAH,4CH INT21H ;* BINHEXPROC PUSHBP;(SP)=005CH

13、 MOVBP,SP;(BP)=005CH PUSHAX ;(SP)=005AH PUSHDI ;(SP)=0058H PUSHCX ;(SP)=0056H PUSHDX ;(SP)=0054H,0062H,0060H,第三章 指令系统 程序设计,23,PUSHF ;(SP)=0052H 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

14、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?不等,转,第三章 指令系统 程序设计,24,POPF POPDX POPCX POPDI POPAX POPBP RET4 BINHEX ENDP ;* HEXD PROC CMP AL,0AH JL LP ADD AL,7 LP: ADD AL,30H RET HEXD ENDP CODE ENDS END BEGIN,第三章 指令系统 程序设计,25,从本例可知,通过堆栈传递的两个参数分别为:变量NUM的内容25AFH和变量STRING的偏移地址。这两个参数在调用子程序之前压入堆栈,当CALL指令返回时,其(SP)=0060H,不是初值0064H。故采用带参数返回指令RET 4。 本例重点掌握: 进一步了解堆栈的使用 学会RET n的应用 子程序嵌套,第三章 指令系统 程序设计,26,END,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1