目录
前言:
对于数据块的移动这个实验在我的上一篇博客已经用串指令方法实现过了,感兴趣的小伙伴可以看一看。
微机原理(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