编辑: 鱼饵虫 | 2013-06-08 |
2、多字节BCD码加法运算.两个4字节长的BCD码加数分别存放在外部RAM 0100H和0110H开始的单元中(从低字节到高字节),计算两数之和,结果保存在0120H开始的9个单元中. 例如:输入(0100H)=0x10, (0101H)=0x32, (0102H)=0x54, (0103H)=0x76 (0110H)=0x78, (0111H)=0x56, (0112H)=0x34, (0113H)=0x92 则输出 (0120)=0x88, (0121)=0x88, (0122)=0x88, (0123)=0x68, (0124)=0x01 源代码: 运行结果: 由图可知运行结果正确.
3、分别用近程查表指令和远程查表指令,查找R3内容的平方值.R3内容小于等于0FH. 近程查表指令法,存放到内部RAM20H单元中: 远程查表指令法,存放到内部单元20H单元中: 软件实验
3
一、实验目的
1、熟悉软件实验的基本步骤和汇编程序的调试方法;
2、掌握数值的加减运算;
3、掌握用查表的方法将BCD值转换成ASCII值.
二、实验说明 此实验主要让学生了解数值的BCD码和ASCII码的区别,利用查表方法可以快速地进行数值转换.进一步掌握数值的各种表达方式.现在我们给出一个BCD数,将其转换成ASCII值.如下:将累加器A的值转换为二个ASCII码,并存入Result开始的二个单元,例程A赋值#1AH.
三、实验及步骤
1、启动PC机,打开KEIL软件,软件设置为模拟调试状态.在所建的Project文件中添加例程的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序.
2、打开CPU窗口,观察CPU窗口各寄存器的变化,打开View菜单中的Memory Window,在Address窗口输入D:30H后回车,点击运行按钮,观察地址30H、31H的数据变化,30H更新为31,31H更新为41.
3、在单步或跟踪执行方式运行程序时,可以观察CPU窗口各寄存器的变化,看到程序执行的过程,加深对实验的了解.用户也可改变A的值,重复实验,观察实验效果.
四、例程流程图和源程序 1.例程说明:将A的值转换为对应的ASCII值,存放在30H、31H单元中. 2.流程图: 3.源程序: RESULT EQU 30H ORG 0000H SJMP START ASCIITAB: DB '
0123456789ABCDEF'
;
定义数字对应的ASCII表BCDTOHEX: MOV DPTR,#ASCIITAB MOV B,A ;
暂存A SWAP A ANL A,#0FH ;
取高四位 MOVC A,@A+DPTR ;
查ASCII表MOV RESULT, A MOV A,B ;
恢复A ANL A,#0FH ;
取低四位 MOVC A,@A+DPTR ;
查ASCII表MOV RESULT+1,A RET START: MOV SP,#40H MOV A,#1AH CALL BCDTOHEX SJMP $ END 例程源代码: 运行结果:30H、31H单元的结果分别为31,41.
五、思考题 BCD码和ASCII码有哪些区别? 答:BCD码是用4位二进制数表示,ASCII码是用8位二进制数表示.并且BCD码分为压缩BCD码与非压缩BCD码,BCD码一共有10种状态,而ASCII一共有128种状态.
六、实验内容
1、查找关键字节(1字节),要查找的字节在R3中,一串字节存放在30H开始的20个单元中,查找结果放入A,若查找不到,则将FFH放入A.. 源代码:
2、在内部RAM的30H单元开始,有一串带符号数据块,其长度在10H单元中.编程求其中正数与负数的和,并分别存入2FH与2EH开始的2个单元中.(负数存放形式为补码).请分别在30H单元开始写入5个正数、11个负数和9个正数、7个负数的情况,记录程序运行结果. 例如:输入-69H,65H,-7H, -25H ,-47H,56H, -3H,17H,6H,-5H,-45H, -1H, -57H, 23H ,-5H,-13H. 结果应为:正数的和89,负数的和-199H 源程序代码: 负数以对应补码输入,一共输入16个数,存放在内部RAM 30H开始处.分别为: 97H,65H,0F9H,0DBH,0B9H,56H,0FDH,17H,06H,0FBH,0BBH,0FFH,0A9H,23H,0FBH,0EDH如果程序运行正确,正数和为0FBH,负数和为0967H 运行结果: 高位在前,低位在后.(2CH)是正数高位,(2DH)是正数低位,(2EH)是负数高位,( 2FH)是负数低位.由图可知,正数和为00FBH,负数和为0967H,所以程序运行正确.