微机实验报告
第三次实验
实验名称:简单编程练习 院系:信息科学和工程学院 学号: 姓名:
实验时间:2016.4
一、实验目的
1. 利用已掌握的宏汇编语言,进行简单的程序设计练习 2. 学习和掌握建立与运行汇编语言程序各个步骤和命令 3. 熟悉汇编程序的调试过程 二、实验任务
1. 在一个数据块中找出最大数
假设有数据22、46、32、72、84、16,且为不带符号的正整数,数据块的长度存放在CX寄存器中,找出的最大数存放在以MAXN为符号的单元中。
2. 求无符号字节数据之和,和数为8位二进制数
假设有数据38,55,26,12,23,数据块的长度存放在CX寄存器中,和数存放在以SUM为符号的单元中。
3. 求无符号字节数据之和,和数为16位二进制数
假设有数据58,25,45,73,64,43,数据块长度存放在CX寄存器中,和数存放在以SUM为符号的字单元中。
4. 求两个十进制数相乘的积(56093*5=?),被乘数和乘数均以非组合BCD
码表示,并存放在内存中,乘积存放在以SUM为符号的单元中。 5. 试分别用数据传送指令和串传送指令编写程序,将以STR1为首地址的字节存储单元中的数据30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,40H,41H,42H,43H,44H,45H,传送到以STR2为首地址的字节存储单元中。
三、实验代码
1.
DATAS SEGMENT
NUM DB 22,46,32,72,84,16 MAXN DB ?
DATAS ENDS ;定义数据段
STACKS SEGMENT
STACKS ENDS ;定义栈段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX LEA BX,NUM
MOV CX,05 ;CX计入比较的计数值 MOV AL,[BX] AGAIN: INC BX
CMP AL,[BX] ;将AL与[BX]的当前值进行比较
JA NEXT ;如果前AL大于[BX],则跳转到NEXT MOV AL,[BX] ;将[BX]赋值给AL
NEXT:LOOP AGAIN ;继续下一次循环 MOV MAXN,AL ;将AL赋值给MAXN MOV AH,4CH
INT 21H ;结束本程序的运行,并返回DOS状态 CODES ENDS
END START ;整个程序汇编结束
实验结果:[DS:0006]=54H
2.
DATAS SEGMENT
NUM DB 38,55,26,12,23 ;定义5个字节数据
SUM DB ? ;定义变量SUM存放和 DATAS ENDS ;定义数据段
STACKS SEGMENT STACKS ENDS ;定义栈段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
MOV CX,05 ;将数据的个数赋给CX
LEA BX,NUM ;将变量NUM的偏移地址赋给BX SUB AL,AL ;AL清零 NEXT:
ADD AL,[BX] INC BX ;取下一个数 LOOP NEXT ;跳转至NEXT,继续循环 MOV SUM,AL ;将AL赋值给SUM MOV AH,4CH INT 21H ;返回DOS CODES ENDS
END START ;整个程序汇编结束 实验结果:[DS:0005]=9AH
3.
DATAS SEGMENT
NUM DB 58,25,45,73,64,43 ;定义6个字节数据
SUM DW ? ;定义字单元数据存放和 DATAS ENDS ;定义数据段
STACKS SEGMENT
STACKS ENDS ;定义栈段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX LEA BX,SUM MOV CX,6 ;把数据个数赋给CX SUB AX,AX ;AX清零 NEXT:
ADD AL,[BX] ;当前值和下一个值相加 ADC AH,0 ;加上进位 INC BX ;BX加1 LOOP NEXT ;跳转至NEXT,继续循环 MOV SUM,AX ;把AX的值传送到AUM
MOV AH,4CH INT 21H ;返回DOS CODES ENDS
END START ;整个程序汇编结束 实验结果:[DS:0006]=0134H
4.DATAS SEGMENT
DATA1 DB 03,09,00,06,05 ;定义5个字节数据,分别作为每一位的被乘数 DATA2 DB 05 ;说明乘数
SUM DB 6 DUP(00) ;定义5个字节数据存放数据相乘结果 DATAS ENDS
STACKS SEGMENT STACKS ENDS ;定义栈段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
MOV SI,OFFSET DATA2 ;取DATA2的偏移地址 MOV BL,[SI] ;将乘数保存到BL中 MOV SI,OFFSET DATA1 ;取DATA1的偏移地址 MOV DI,OFFSET SUM ;取SUM的偏移地址
MOV CX,05 ;将被乘数的位数赋值给CX NEXT:
MOV AL,[SI]
INC SI
MUL BL ;将当前位数与乘数相乘 AAM ;将AL中的乘法运算结果调整为两位非压缩十进制数 ADD AL,[DI] ;将乘法结果与上次进位相加 AAA ;将加法运算结果调整为一位非压缩十进制数 MOV [DI],AL ;传送结果至[DI]中 INC DI
MOV [DI],AH ;把进位传送到[DI]中 LOOP NEXT ;跳转至LOOP,继续循环 MOV AH,4CH INT 21H ;返回DOS CODES ENDS
END START ;整个程序汇编结束
实验结果:[DS:0006-DS:000B]中的内容为05,06,04,00,08,02 5.
法一:数据传送指令
DATAS SEGMENT STR1 DB
30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,40H,41H,42H,43H,44H,45H COUNT EQU $-STR1 ;把STR1数据的长度赋给COUNT
STR2 DB COUNT DUP(0);为STR2开辟与STR1相同长度的字节单元,初值为0 DATAS ENDS
STACKS SEGMENT STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
LEA SI,STR1 ;取STR1的偏移地址 LEA DI,STR2 ;取STR2的偏移地址
MOV CX,COUNT ;将STR1的长度赋给CX,设定循环次数 NEXT:
MOV AL,[SI] MOV [DI],AL
INC SI ;SI自增 INC DI ;DI自增
LOOP NEXT ;跳转至NEXT继续循环 MOV AH,4CH
INT 21H ;返回DOS CODES ENDS
END START ;整个程序汇编结束
法二:串传送指令 DATAS SEGMENT STR1 DB
30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,40H,41H,42H,43H,44H,45H COUNT EQU $-STR1 ;把STR1数据的长度赋给COUNT
STR2 DB COUNT DUP(0) ;为STR2开辟与STR1相同长度的字节单元,初值为0 DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX MOV ES,AX
LEA SI,STR1 ;将STR1的偏移地址赋给SI LEA DI,STR2 ;将STR2的偏移地址赋给DI MOV CX,COUNT
CLD ;设置方向 REP MOVSB ;传送字符串 MOV AH,4CH
INT 21H ;返回DOS CODES ENDS
END START ;整个程序汇编结束
思考:数据传送指令和串传送指令两种传送方式有什么区别?
1.mov的源位置和目标位置都是自己指定的;movs的源串固定用si指出,目的串固定用di指出;
2.mov指令的源位置和目标位置可以在四个段的任意一个段;movs的源串必须定义在数据段,目标串必须定义在附加段;
3.mov指令执行完后,源和目的指针不变;movs执行一次后,si和di自动变化;
4.mov不能直接由存储器到存储器传送,必须经寄存器中转;movs是存储器到存储器的直接传送。
四、思考题
1. 在例题中,“CMP BL,00”指令有什么作用?
比较BL和0的关系,判断BL的正负
2. “CMP BL,00”指令是否可以用其他指令替代?
可以用其他指令替换,如TEST BL,80H等
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库东南大学信息学院微机实验简单编程练习在线全文阅读。
相关推荐: