700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构

语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构

时间:2022-05-11 07:38:55

相关推荐

语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构

学习一门语言,我们首先学其基本的数据类型和逻辑表达式的一些基本语句。为了使程序具有更加良好的运行效率,我们还需要学习它的一些设计结构。这一篇我们将以此为大家讲解一些常见的程序结构,以及其在汇编语言中的设计方法。

一个好的程序应满足以下几个要求:

结构化、简明、易读、易调试、易维护; 执行速度快; 占用存储空间尽量少。

常见程序结构:

顺序结构分支结构循环结构子程序结构

一、顺序结构

按照程序的书写顺序执行,这样的程序结构就叫做顺序结构。

例:设变量X、Y均为16位无符号数,试写一个求表达式2X + Y值的程序:

DSEG SEGMENT X DW 34H ; 表示将十六进制数 34H 存放到 X 中Y DW 56HZ DW ?,? ; ?表示为空,也可以不写DSEG ENDSCSEG SEGMENT ASSUME CS: CSEG , DS: DSEGSTART: MOV AX, DSEG MOV DS, AX; 让DS指向自己定义的数据段MY_D SEGMENT XOR DX , DXMOV 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_CSTART: MOV AX , MY_D ; 获取数据段的段地址 MOV DS, AX MOV AL, MEMS ; 将待比较元素放入AL中CMP AL, 0JGENEXT; 有符号数如果>=0,则转向next MOV AL, -1 ; 如果不满足 >=0, 则顺序执行,给AL赋值-1 JMP DONE; 无条件跳转指令NEXT: JE DONEje; 表示等于就跳转 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 ENDSCODE SEGMENTASSUME CS:CODE , DS:DATA START: MOVAX , DATAMOVDS , AX XORAX , AX ; 将AX清零,将CF标志位也清零MOVCX , 100AGAIN: ADDAX , CXLOOP AGAIN; 执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;MOV SUM , AX MOV AH, 4CHINT 21HCODE ENDSEND START

四、子程序结构

为了简化编程,常把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,这就是子程序。子程序的调用过程是通过CALL指令实现的,子程序的返回则通过RET指令完成。为了使子程序结构清晰,可以使用过程定义伪指令PROC和ENDP来定义子程序。

例:编写子程序将寄存器AX内容乘10,结果仍存在AX中:

主程序:X EQU 1000CODE SEGMENTASSUME CS:CODESTART: MOV AX, X CALL MUL10 MOV AX, 4C00HINT 21H MUL10 PROC PUSHF PUSH BXADD AX, AXMOV BX, AXADD AX, AXADD AX, AXADD AX, BXPOP BX ; 弹出堆栈,恢复现场 POPF RETMUL10 ENDPCODE ENDSEND START

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。