《汇编语言程序设计》实验报告
实验五 循环结构程序设计1. 实验目的2. 实验任务3. 实验步骤3.1 循环结构题目设计3.2 编写代码3.3 代码分析3.4 运行测试 4. 实验总结实验五 循环结构程序设计
1. 实验目的
掌握汇编语言程序设计的基本方法和技能掌握汇编语言源程序的编辑汇编连接和执行的完整过程掌握汇编过程中各种命令的作用及使用方法掌握汇编语言中的循环结构程序设计2. 实验任务
熟悉汇编语言环境,熟练汇编语言的编写学习循环结构的汇编语言程序的设计和调试加深对汇编语言循环结构的理解加深对汇编语言整体的认识和把握掌握在汇编语言中循环结构的实现方法和流程3. 实验步骤
3.1 循环结构题目设计
编写计算1+2+3+…+99+100的程序,要求把结果存放于WORD类型变量X中 。
从STR1为起始地址的30个字符,依次传送到以STR2为起始地址的连续字节存储单元中。
在BLOCK单元开始的存储区中,连续存放着30个学生的课程成绩,统计其中各个分数段的学生人数:90~100 80~89 70~79 60~69 60分以下的学生数分别存放到S9 S8 S7 S6 S5中。
3.2 编写代码
代码一
DATAS SEGMENT;此处输入数据段代码 SUM DW ?DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码XOR AX,AX ;AX清0MOV CX,100again:ADD AX,CX ;从100倒序累加到AXLOOP againMOV SUM,AXMOV AH,4CHINT 21HCODES ENDSEND START
代码二
DATAS SEGMENT;此处输入数据段代码 STR1 DB 'ABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789'STR2 DB 30 DUP(?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV SI,OFFSET STR1 ;源地址指针MOV DI,OFFSET STR2 ;目的地址指针MOV CX,30 ;设置循环次数again:MOV AL,[SI]MOV [DI],ALINC SI ;指针+1INC DI ;指针+1LOOP againMOV AH,4CHINT 21HCODES ENDSEND START
代码三
DATAS SEGMENT;此处输入数据段代码 BLOCK DB 20,30,100,50,65,49,25,22,39,98,56,77,63,30,66,75,41,88,12,77,78,69,55,66,68,88,6,82,92,63,76COUNT EQU 30S9 DB 0S8 DB 0S7 DB 0S6 DB 0S5 DB 0DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV BX,OFFSET BLOCK ;源地址指针MOV CX,COUNT ;循环次数30again:MOV AL,[BX] ;取出数据送至ALCMP AL,100 ;与100比较 JA exit;大于100 直接结束CMP AL,90 ;与90比较JAE L9;大于等于90 到L9CMP AL,80 ;与80比较JAE L8;大于等于80 到L8CMP AL,70 ;与70比较JAE L7;大于等于70 到L7CMP AL,60 ;与60比较JAE L6;大于等于60 到L6L5:INC S5 ;S5+1JMP L10 ;转L10循环L6:INC S6 ;S6+1JMP L10 ;转L10循环L7:INC S7 ;S7+1JMP L10 ;转L10循环L8:INC S8 ;S8+1JMP L10 ;转L10循环L9:INC S9 ;S9+1L10:INC BX ;BX+1到下一数据LOOP again ;执行循环exit:MOV AH,4CHINT 21HCODES ENDSEND START
3.3 代码分析
代码一
利用循环实现从1到100相加,首先将AX寄存器清零,设置CX值为100,循环again,将CX值加到AX上,每次CX-1,最后将AX值赋值到SUM内存单元中存储结果。
代码二
首先将源地址存放到SI,将目的地址存放到DI,设置CX值即循环次数为字符串长度,然后将[SI]即源地址指针指向的内容通过AL转存到[DI]指针的地址处。
代码三
Block源地址指针存放到BX寄存器中,设置CX寄存器值为COUNT,即数据的个数,通过循环again,依次确定每个数据的范围,将对应存储地址单元的内容加1,最终得到执行结果。
3.4 运行测试
图表 1 代码一测试
图表 2 代码二测试
图表 3 代码三测试