微机原理 实验07:循环结构程序设计——数据块移动和BCD码转换为二进制码(汇编语言)

目录

前言:

一、实验目的

二、实验内容

第一题:数据块的移动

代码

程序编译信息截图

程序运行结果截图

第二题:BCD码转换为二进制码

流程图

代码:

程序编译信息截图

程序运行结果截图

三、实验调试过程记录、结果分析及评价

附加题:分支程序:


前言:

对于数据块的移动这个实验在我的上一篇博客已经用串指令方法实现过了,感兴趣的小伙伴可以看一看。

微机原理(emu086):分支结构程序设计――数据块移动_实验06_Leisure_水中鱼的博客_CSDN博客

上一次在编程思想上完善的不是很好:修改数据的入口应该尽可能的少并且集中,在我写的使用串指令完成数据块的移动,如果要用不同的数据进行测试需要满篇幅的找代码修改,修改的点也有好几处,非常low。

就像高级语言中封装的算法应该做到数据无关性,我这次代码将数据修改的入口设置在数据段,代码段做到数据无关系。

一、实验目的

1、学会使用循环指令,掌握循环结构程序设计方法。

2、掌握BCD码到二进制码的转换方法,巩固理解、掌握数据的不同进制的表示方法和在计算机中的存储方式。

二、实验内容

第一题:数据块的移动

将实验06“数据块的移动”中多条数据传送部分,改为使用循环指令实现。(注意:此时指针变化需要另外用指令实现;可不必设置方向标志。)

代码

DATA     SEGMENT                ;定义数据段
INFO     DW 0201H, 0403H, 0605H, 0807H, 0A09H, 0C0BH, 0E0DH, 100FH, 1211H, 1413H
NUM      DW 0AH                 ;定义数据数量
SOURCE   DW 4010H               ;源数据块偏移地址
TARGET   DW 4020H               ;目标数据块偏移地址
         DATA ENDS

CODE     SEGMENT                ;定义代码段
ASSUME   CS: CODE, DS: DATA     ;将各段内容指定寄存器
START:   MOV AX, DATA
         MOV DS, AX
         MOV ES, AX             ;将数据段DATA的首地址放入DS, ES
         MOV AX, 0H
         
         MOV SI, 0H             
         MOV DI, SOURCE
         MOV CX, NUM            ;存放字数据的数量          
         REP MOVSW              ;4010H到4024H放上数据
         
         MOV CX, NUM            ;转移数据次数
         MOV SI, SOURCE         ;源数据块偏移地址
         MOV DI, TARGET         ;目的数据块偏移地址 
         
         CMP SI, DI             ;比较SI和DI比较
         JA NEXT                ;SI>DI即正向传送
         MOV AX, NUM
         ADD AX, NUM
         SUB AX, 2H
         ADD SI, AX             ;负向传送指向数据块的最后一条数据
         ADD DI, AX             ;因为是字数据地址加上数据长度(2*数据数量)-2
         MOV AX, -4H            ;负向传送偏移地址递减
         
NEXT:    ADD AX, 2H         
MOVE:    MOV BX, [SI]           
         MOV [DI], BX           ;将源块数据送入BX,再通过BX送入目的块
         ADD DI, AX
         ADD SI, AX             ;指针移动
         LOOP MOVE          

         MOV AH, 4CH            ;结束本程序运行
         INT 21H             
         CODE ENDS              ;代码段结束
         END START

程序编译信息截图

程序运行结果截图

源数据块:4010H,目标数据块:4020H

源数据块初始化:

转移后:

源数据块:4010H,目标数据块:4020H

转移后:

第二题:BCD码转换为二进制码

内存数据区从4000H单元开始依次存入n个两位十进制数的BCD码。每个数的BCD码占相邻的2个内存单元,其中高地址存高位数。编程将这n个数的BCD码转化为对应的二进制码,存入从4100H开始的n个内存单元。请画出程序设计流程图。

验证:在4000H单元开始分别存入3条数据34、56、78的bcd码进行验证。查看4100H单元开始是否还原出其对应的二进制编码。

提示:一个两位十进制数bcd码转化为二进制码的基本思想是:将十位数数字的bcd码乘以10,再与个位数的bcd码累加,得到和即为该数;该数在计算机中自动按照二进制码存放。

流程图

代码:

DATA     SEGMENT                ;定义数据段
INFO     DW 0304H, 0506H, 0708H
NUM      DW 03H                 ;定义数据数量
SOURCE   DW 4000H               ;源数据块偏移地址
TARGET   DW 4100H               ;目标数据块偏移地址
         DATA ENDS

CODE     SEGMENT                ;定义代码段
ASSUME   CS: CODE, DS: DATA     ;将各段内容指定寄存器
START:   MOV AX, DATA
         MOV DS, AX
         MOV ES, AX             ;将数据段DATA的首地址放入DS, ES
         MOV AX, 0H
         
         MOV SI, 0H             
         MOV DI, SOURCE
         MOV CX, NUM            ;存放字数据的数量          
         REP MOVSW              ;将num个2位十进制数bcd码存入4000H
         
         MOV CX, NUM            ;转移数据次数
         MOV SI, SOURCE         ;源数据块偏移地址
         MOV DI, TARGET         ;目的数据块偏移地址 
         
MOVE:    MOV AL, 10
         MOV BX, [SI]           ;将2位十进制数bcd码送入BH,BL
         MUL BH
         ADD BL, AL             ;将bcd码转换成二进制码放入BL
         MOV [DI], BL           ;通过BL传入目的数据块
         INC DI
         ADD SI, 02H            ;指针移动
         LOOP MOVE          

         MOV AH, 4CH            ;结束本程序运行
         INT 21H             
         CODE ENDS              ;代码段结束
         END START

程序编译信息截图

程序运行结果截图

4000H存放bcd码:

4100H存放二进制码:

22H=34D, 38H=56D, 4EH=78D

三、实验调试过程记录、结果分析及评价

1.我将数据的入口放在数据段,无需对代码段进行任何修改。

2.第一题负向传送时要指向数据块最后一个数据,不能直接加上数据总长度,应该是加上数据总数-1的长度。

3.循环指令无需设置方向标志,指针移动靠加减实现即可

4.第二题注意字数据(bcd码)指针位移2,字节数据(二进制码)指针位移1

5.注意第二题乘10不是10H,是将34D变成二进制编码存入计算机,如果是10H,就不是原本的数了

附加题:分支程序:

编写程序,计算Y的值,X和Y之间的函数关系式如下,其中X、Y均为字节型变量。

附加题没啥说的,很简单讲讲思路:

        AL存X,BL存Y默认为0。有两重判断:1.X>=0跳转L1,2.X<=0跳转L2。

        当X=0跳转到L1,马上判断是否<=0,满足跳转到结束;当X>0,满足第一次跳转,不满足第二次,Y=Y+1=1结束;当X<0满足第二次跳转,不满足第一次,令Y=-1,同时跳过加1结束

DATA     SEGMENT                ;定义数据段
X        DB 0H  
DATA     ENDS

CODE     SEGMENT                ;定义代码段
ASSUME   CS: CODE, DS: DATA     ;将各段内容指定寄存器
START:   MOV AX, DATA
         MOV DS, AX             ;将数据段DATA的首地址放入DS
         MOV AX, 0H
         
         MOV BL, 0              ;BL存放Y值
         MOV AL, X              ;AL存放X值
         CMP AL, 0
         JGE L1                 ;X>=0,跳转L1
         SUB BL, 02H            ;X<0,Y值为-2
L1:      CMP AL, 0
         JLE L2                 ;X=0,跳转L2
         ADD BL, 01H            ;X<0或X>0,Y值加1
L2:                                  
         MOV AH, 4CH            ;结束本程序运行
         INT 21H             
CODE     ENDS                   ;代码段结束
         END START

 

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leisure_水中鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值