语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构
学习一门语言,我们首先学其基本的数据类型和逻辑表达式的一些基本语句。为了使程序具有更加良好的运行效率,我们还需要学习它的一些设计结构。这一篇我们将以此为大家讲解一些常见的程序结构,以及其在汇编语言中的设计方法。
一个好的程序应满足以下几个要求:
- 结构化、简明、易读、易调试、易维护;
- 执行速度快;
- 占用存储空间尽量少。
常见程序结构:
- 顺序结构
- 分支结构
- 循环结构
- 子程序结构
一、顺序结构
按照程序的书写顺序执行,这样的程序结构就叫做顺序结构。
例:设变量X、Y均为16位无符号数,试写一个求表达式2X + Y值的程序:
DSEG SEGMENT X DW 34H ; 表示将十六进制数 34H 存放到 X 中Y DW 56HZ DW ?,? ; ?表示为空,也可以不写
DSEG ENDS
CSEG SEGMENT ASSUME CS: CSEG , DS: DSEG
START: MOV AX, DSEG MOV DS, AX ; 让DS指向自己定义的数据段MY_D SEGMENT
XOR DX , DX MOV AX , XADD AX , AX ADC DX , 0 ; ADC能够把进位加到DADD AX , Y ADC DX,0 MOV Z , AX MOV Z+2 , DX MOV AH , 4CH ; 因为程序都执行完成要返回dos,要将中断号4ch送AH INT 21H ; 调用dos中断21h,中断调用号为AH( 即4ch),返回dos
CSEG ENDSEND START
汇编语言中的AX、BX、CX、DX作为CPU内部的通用寄存器中的数据寄存器助记专符用来存放参与运算的数据或是存储运算的结果。这四个数据寄存器都是16位的,实际由两个8位寄存器组合而成,这是为了灵活处理8位数据。
二、分支结构
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。
例:判断MEMS单元的数据,若数据>0,结果为1;若数据<0,结果为-1;若数据=0,结果为0;将结果存入MEMD单元:
MY_D SEGMENT MEMS DB 08H MEMD DB ?
MY_D ENDS
MY_C SEGMENT ASSUME DS:MY_D , CS:MY_C
START: MOV AX , MY_D ; 获取数据段的段地址 MOV DS, AX MOV AL, MEMS ; 将待比较元素放入AL中 CMP AL, 0 JGE NEXT ; 有符号数如果>=0,则转向next MOV AL, -1 ; 如果不满足 >=0, 则顺序执行,给AL赋值-1 JMP DONE ; 无条件跳转指令
NEXT: JE DONE je ; 表示等于就跳转 MOV AL, 1 ; 如果不等于的话则赋值为1
DONE: MOV MEMD, AL MOV AX , 4C00H INT 21H
MY_C ENDS
END START
三、循环结构
在程序设计中遇到需要按照一定的规律或条件,多次重复执行一组指令的情况时,可以用循环程序实现。循环结构一般根据某一条件判断为真或为假来确定是否重复执行循环体,条件永真或无条件的循环就是逻辑上的死循环。
循环程序通常由三部分组成:
- 循环初始化
- 循环体
- 循环控制部分
例:计算1~100的数字之和,并将结果存入变量SUM中:
DATA SEGMENTSUM DW ? ; 用于存储计算结果
DATA ENDS
CODE SEGMENTASSUME CS:CODE , DS:DATA
START: MOV AX , DATAMOV DS , AX XOR AX , AX ; 将AX清零,将CF标志位也清零MOV CX , 100
AGAIN: ADD AX , CXLOOP AGAIN ; 执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;MOV SUM , AX MOV AH, 4CH INT 21H
CODE ENDS
END START
四、子程序结构
为了简化编程,常把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,这就是子程序。子程序的调用过程是通过CALL指令实现的,子程序的返回则通过RET指令完成。为了使子程序结构清晰,可以使用过程定义伪指令PROC和ENDP来定义子程序。
例:编写子程序将寄存器AX内容乘10,结果仍存在AX中:
主程序:
X EQU 1000
CODE SEGMENTASSUME CS:CODE
START: MOV AX, X CALL MUL10 MOV AX, 4C00HINT 21H
MUL10 PROC PUSHF PUSH BX ADD AX, AX MOV BX, AX ADD AX, AX ADD AX, AX ADD AX, BX POP BX ; 弹出堆栈,恢复现场 POPF RET
MUL10 ENDP
CODE ENDS
END START
语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构相关推荐
- 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...
- C语言程序设计有哪几种结构,第章c语言程序设计的三种基本结构.ppt
第章c语言程序设计的三种基本结构 北京科技大学 计算机系 第2章 C语言程序设计 的三种基本结构 2.1 顺序结构程序设计 2.1.1 C语句 2.1.2 字符数据的输入与输出 2.1.3 格式输入与 ...
- 计算机帮教助教活动总结,【助教总结】_助教总结范文三篇
教师是一种很神圣的职业,不仅是正式教师,就连助教的作用也尤为重要:那么对于担任过助教的人来说,助教总结是一项非常重要的工作.让我们来看看助教总结范文吧. 第一篇:助教总结 700字 一年的数学助教工作 ...
- 伪指令endp告诉汇编程序_汇编语言程序设计第二篇——80X86汇编语言伪指令
一.伪指令详解 伪指令在百度百科中的定义为: 伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信 ...
- python语言的实验心得体会范文_实验心得体会四篇
实验心得体会四篇 导读: 本文 实验心得体会四篇,仅供参考,如果能帮助到您,欢迎点 评和分享. 下面是整理的实验心得体会范文,欢迎阅读参考. 实验心得体会 ( 一 ) 时间过得真快,不经意间,一个学期 ...
- mysql怎么分组计算逾期率_转行数据分析第三篇:mysql查询入门练习题
这篇练习题是我在学sql入门的时候做的,应该算是在网上能找到的习题里最基础的一篇,非常适合新手练习,如果你接触sql不超过半个月,建议可以看一下<sql必知必会>或<mysql必知必 ...
- MySQL代做题_转行数据分析第三篇:mysql查询入门练习题
这篇练习题是我在学sql入门的时候做的,应该算是在网上能找到的习题里最基础的一篇,非常适合新手练习,如果你接触sql不超过半个月,建议可以看一下<sql必知必会>或<mysql必知必 ...
- c语言课程设计文献检索,文献检索课学习心得三篇(2)
文献检索课学习心得 篇[3] 内容提要:通过本次文献信息检索课程的学习,有利于培养我们的信息意识.自学意识和知识创新能力,使我们养成了自主学习的习惯和独立获取信息的能力,了解了信息社会中文献信息检索的 ...
- 消防给水及消火栓系统技术规范_技术实务第三篇第二章:消防给水及消火栓系统学习笔记...
第一部分:消防给水及消火栓系统历年章节考试占分 2015年单选五题多选一题共7分:2016年单选五题多选1题共7分:2017年单选五题多选一题共7分:2018年单选七题多选一题共9分:历年真题会在本篇 ...
最新文章
- 关联规则推荐及Apriori算法
- linux修改selinux
- 【OpenCV3】cv::convertScaleAbs()使用详解
- 陶哲轩实分析命题 11.10.7
- lua和unity如何交互_Unity中C#对象与Lua之间交互的原理
- 如何判断一个字符串的编码类型?
- [嵌入式][分享][交流]发布一个消息地图的模块
- 黑龙江科技大学计算机考研复试科目,2020年黑龙江科技大学计算机应用技术考研经验分享...
- linux 动态库构造函数,Linux共享库全局构造函数的相互依赖性
- OpenJudge NOI 3.3 3340:RPN Calculator
- Github无法拉代码
- npm 更新_npm 的安全困扰:仅有 9.27% 的 npm 开发者使用 2FA
- android项目导入zoom视频会议流程
- 2022腾讯QQ春节红包活动 虎跃星辰玩法总攻略
- 爬虫之模拟强智系统登录
- Burpsuite简单代理配置
- 改oracle sockets,安装GI最后检查时出现warning - Domain Sockets,PRVG-11750
- 3D Models (3D 模型)
- 软件测试--黑盒测试用例、测试步骤设计方法(正交实验法、功能图法、其他用例设计方法)
- for(Map.EntryString, String entry:params.entrySet())