• 汇编语言实验5:循环结构程序设计


    实验五 循环结构程序设计

    1. 实验目的

    1. 掌握汇编语言程序设计的基本方法和技能
    2. 掌握汇编语言源程序的编辑汇编连接和执行的完整过程
    3. 掌握汇编过程中各种命令的作用及使用方法
    4. 掌握汇编语言中的循环结构程序设计

    2. 实验任务

    1. 熟悉汇编语言环境,熟练汇编语言的编写
    2. 学习循环结构的汇编语言程序的设计和调试
    3. 加深对汇编语言循环结构的理解
    4. 加深对汇编语言整体的认识和把握
    5. 掌握在汇编语言中循环结构的实现方法和流程

    3. 实验步骤

    3.1 循环结构题目设计

    1. 编写计算1+2+3+…+99+100的程序,要求把结果存放于WORD类型变量X中 。
    1. 从STR1为起始地址的30个字符,依次传送到以STR2为起始地址的连续字节存储单元中。
    1. 在BLOCK单元开始的存储区中,连续存放着30个学生的课程成绩,统计其中各个分数段的学生人数:90~100 80~89 70~79 60~69 60分以下的学生数分别存放到S9 S8 S7 S6 S5中。

    3.2 编写代码

    代码一

    DATAS SEGMENT
        ;此处输入数据段代码  
        SUM DW ?
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
        XOR AX,AX   ;AX清0
        MOV CX,100
    again:
        ADD AX,CX   ;从100倒序累加到AX
        LOOP again
        MOV SUM,AX
        
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    代码二

    DATAS SEGMENT
        ;此处输入数据段代码  
        STR1 DB 'ABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789'
        STR2 DB 30 DUP(?)
    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 STR1  ;源地址指针
        MOV DI,OFFSET STR2  ;目的地址指针
        MOV CX,30   ;设置循环次数
    again:
        MOV AL,[SI]
        MOV [DI],AL
        INC SI  ;指针+1
        INC DI  ;指针+1
        LOOP again
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    代码三

    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,76
        COUNT EQU 30
        S9 DB 0
        S8 DB 0
        S7 DB 0
        S6 DB 0
        S5 DB 0
    DATAS ENDS
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
        MOV BX,OFFSET BLOCK ;源地址指针
        MOV CX,COUNT    ;循环次数30
    again:
        MOV AL,[BX] ;取出数据送至AL
        CMP AL,100  ;与100比较 
        JA exit     ;大于100 直接结束
        CMP AL,90   ;与90比较
        JAE L9      ;大于等于90 到L9
        CMP AL,80   ;与80比较
        JAE L8      ;大于等于80 到L8
        CMP AL,70   ;与70比较
        JAE L7      ;大于等于70 到L7
        CMP AL,60   ;与60比较
        JAE L6      ;大于等于60 到L6
    L5:
        INC S5  ;S5+1
        JMP L10 ;转L10循环
    L6:
        INC S6  ;S6+1
        JMP L10 ;转L10循环
    L7:
        INC S7  ;S7+1
        JMP L10 ;转L10循环
    L8:
        INC S8  ;S8+1
        JMP L10 ;转L10循环
    L9:
        INC S9  ;S9+1
    L10:
        INC BX  ;BX+1到下一数据
        LOOP again  ;执行循环
    exit:
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    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 代码三测试


    4. 实验总结

    1. 成功运行了汇编语言代码测试,熟悉了汇编语言运行环境。
    2. 掌握了汇编语言程序设计循环结构设计的基本方法和技能。
    3. 通过本次实验,对循环结构的设计有了新的认识和更深的了解,了解到语句之间如何进行嵌套及在汇编语言中面对特殊情况时如何跳出循环或忽略本次循环,了解到循环结构程序的执行过程。
    4. 在题目设计和实现的过程中,也遇到了很多的问题,认识到了自己的很多不足,对于新的问题,没有自己的解题思路,出现了的问题自己不知道出现在哪里,最终认识到自己还是练习的太少,导致汇编语言不太熟练,所以在以后更要对自己的缺陷进一步学习和强化。
  • 相关阅读:
    数据同步工具—sqoop 2.x
    管理经济学试题及答案
    1355:字符串匹配问题(strs)
    MarkDown基础及表格、KaTeX公式、矩阵、流程图、UML图、甘特图语法
    SOLIDWORKS Composer反转关键帧实现产品安装过程
    Leetcode 16.07 最大数值
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.16 发送简单邮件
    Linux内核链表
    Agri-Net最短网络
    uniapp搜索框防抖、自动获取焦点
  • 原文地址:https://blog.csdn.net/weixin_52117223/article/details/127775312