如何用汇编语言编写三重循环的延时程序_汇编语言程序设计第三篇——汇编程序结构...

本文介绍了如何使用汇编语言设计程序结构,包括顺序结构、分支结构、循环结构和子程序结构。通过实例解析了如何编写求表达式、判断条件、循环计算以及子程序设计的方法,旨在提升程序的运行效率和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cdaaef63782edc4ae99e4fb0c3dd47aa.png

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

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

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

常见程序结构:

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

一、顺序结构

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

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

DSEG 	SEGMENT 
    X       	DW  34H   ; 表示将十六进制数 34H 存放到 X 中
    Y       	DW  56H
    Z         	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 , X
      	ADD   AX , AX       		
       	ADC   DX , 0      ; ADC能够把进位加到D
        ADD   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  ENDS
 END    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   	SEGMENT
   SUM  DW ?     ; 用于存储计算结果
DATA   	ENDS
CODE  	SEGMENT
      ASSUME  CS:CODE , DS:DATA 
START: 	MOV     AX , DATA
                MOV     DS , AX   
        	XOR     AX , AX	 ; 将AX清零,将CF标志位也清零
       		MOV     CX , 100      
AGAIN: 	ADD      AX , CX
        		LOOP       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  	SEGMENT
        ASSUME  CS:CODE
START: 	MOV  AX, X  	
        CALL  MUL10  
        MOV  AX, 4C00H
        INT  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值