270 likes | 467 Views
5 、汇编语言程序设计. 基本要求: 程序要结构化, ( 简明,易读,易调试 ) 执行速度快。 占用存储空间少, ( 即存储容量小 ). 汇编程序的基本步骤:. (1) 分析问题,描绘出数学模型。 (2) 确定算法。 (3) 绘制程序框图。 (4) 分配存储器及工作单元。 (5) 编制程序。 (6) 静态检查。 (7) 上机调试、试运行。. 例: 编写一个程序查找一定内存单元中的最大自然数。. 分析问题,确定数学模型。 确定算法。 绘制程序框图。 分配存储器及工作单元。 编制程序。 静态检查。 上机调试、试运行。. 开始. 初始化,设指针、计数器.
E N D
5、汇编语言程序设计 基本要求: • 程序要结构化,(简明,易读,易调试) • 执行速度快。 • 占用存储空间少,(即存储容量小)
汇编程序的基本步骤: (1)分析问题,描绘出数学模型。 (2)确定算法。 (3)绘制程序框图。 (4)分配存储器及工作单元。 (5)编制程序。 (6)静态检查。 (7)上机调试、试运行。
例:编写一个程序查找一定内存单元中的最大自然数。例:编写一个程序查找一定内存单元中的最大自然数。 分析问题,确定数学模型。 确定算法。 绘制程序框图。 分配存储器及工作单元。 编制程序。 静态检查。 上机调试、试运行。
开始 初始化,设指针、计数器 取第一个数到计数器 与下一个数比较 下一个数大? N 取大数到寄存器 修改地址指针、计数器 N 查找结束? 结束
DATA SEGMENT PARA ;定义数据段 D1 DB 85,77,90,87,69,92,78; DATA ENDS ;数据段结束 STACK SEGMENT PARA STACK;定义堆栈段 DW 20 DUP (0) ;堆栈段位20个字节 STACK ENDS ;堆栈段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX ;初始化DS MOV BX,OFFSET D1 ;设置数据指针
MOV CX,7 ;设置计数器 DEC CX MOV AL,[BX] ;取第一个数 LOP: INC BX CMP AL,[BX] ;与下一个数比较 JAE NEXT ;下一个数不大转移 MOV AL,[BX] ;大数存入AL NEXT: DEC CX JNZ LOP ;CX≠0继续 MOV DL,AL ;显示最大数(?) MOV AH,2 INT 21H CODE ENDS ;代码段结束 END START ;源程序结束
程序的基本结构 • 顺序结构 • 分支结构 • 循环结构 • 子程序结构
1、顺序结构 顺序结构程序本身很简单,按程序的编写顺序逐条执行。它依赖于计算机能够顺序执行语句的特点,只要语句安排的顺序是正确的就可以了。
例: 把非压缩的十进制数DATl转化为压缩的十 进制数。 完成上述功能的程序段为: MOV AX,DATl ;例如AX=0204H MOV CL,4 SAL AH, CL ;AH=20,AX=2004H ROL AX, CL ;AX=0042H ROL AL, CL MOV BYTE PIR DATl,AL;DAT1中为24H为压缩的十进制数 . . .
满足 不满足 不满足 条件 条件 满足 程序段1 程序段2 程序段 2、分支结构
例: 设计一字符比较程序,将键入的字符与存储单元的字符相比较,相同显示YES,不同显示NO • DATA1 SEGMENT • D1 DB 'PLEASE INPUT A CHARACTER: $' • D2 DB 'A' • DYES DB 'YES','$' • DNO DB 'NO','$' • DATA1 ENDS • STACK1 SEGMENT PARA STACK • DW 20 DUP(0) • STACK1 ENDS • CODE SEGMENT • ASSUME CS:CODE,DS:DATA1,SS:STACK1
START: MOV AX,DATA1 ; 数据段寄存器DS初始化 • MOV DS,AX • LEA DX,D1 ; 取被加数D1数据区的首地址 • MOV AH,09H ; 功能号为09H,调显示功能 • INT 21H • MOV AH,7 ;从键盘得到一个字符,不回显 • INT 21H • MOV BL,D2 • CMP AL,BL • JZ YES
LEA DX,DNO • JMP NO • YES: LEA DX,DYES • NO: MOV AH,09H ;显示 • INT 21H • MOV AH,4CH ; 功能号为4CH,返回DOS INT 21H • CODE ENDS • END START
循环初始设置 循环体 满足 循环条件 不满足 3、循环结构
例:求100个数的和。 • DATA1 SEGMENT • SE DW 100 DUP(?) • Y DW ? • DATA1 ENDS • STACK1 SEGMENT PARA STACK • DW 20 DUP(0) • STACK1 ENDS • CODE SEGMENT • ASSUME CS:CODE,DS:DATA1,SS:STACK1 • START: MOV AX,DATA1 ; 数据段寄存器DS初始化 • MOV DS,AX
加100次 MOV AX,0 ADD AX,SE ADD AX,SE+2 ADD AX,SE+4 … ADD AX,SE+198 MOV Y,AX CODE ENDS END START
改为循环设计: XOR AX,AX MOV BX,OFFSET SE MOV CX,100 LOP: ADD AX,[BX];循环体 INC BX INC BX DEC CX JNZ LOP ;CX 0,循环 MOV Y,AX CODE ENDS END START
例:统计一个数据块中正数、负数和0的个数。例:统计一个数据块中正数、负数和0的个数。 DATA SEGMENT MN DB 76H,0A8H,34H,0BBH,90H,00H NN DB 3 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DI,MN MOV BX,0 MOV AH,0 MOV CL,NN-MN ;数据块长度送CL
MOV CH,0 LINE1: MOV AL,[DI] AND AL,AL ;送标志判断 JZ LINE3 ;0,转到LINE3 JNS LINE2 ;正,转到LINE3 INC AH ;负 JMP LINE4 LINE2: INC BH JMP LINE4 LINE3: INC BL LINE4: INC DI
LOOP LINE1 MOV DI,OFFSET NN MOV [DI],AH ;存负数的个数 INC DI MOV [DI],BH ;存正数的个数 INC DI MOV [DI],BL ;存0的个数 MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START
子程序设计 重复出现的程序段 1、主子程序之间的信息交换(参数传递) 2、现场保护
例: 16进制变换为ASCII DATA SEGMENT ;定义数据段 D1 DB 37H,48H,0A7H,97H D2 DB 8 DUP(38H),'$' DATA ENDS ; 数据段结束 STACK SEGMENT PARA STACK ;定义堆栈段 DW 20 DUP (0) ; 堆栈段位20个字节 STACK ENDS ; 堆栈段结束
CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX ;初始化DS LEA BX,D1 ;设置数据指针 LEA SI,D2 MOV CX,D2-D1 ;设置计数器 AGAIN: MOV AL,[BX] ;取第一字节数 MOV DL,AL PUSH CX MOV CL,4
SHR AL,CL ;高位移到低位 POP CX CALL CHANGE MOV AL,DL AND AL,0FH ;屏蔽高位 CALL CHANGE INC BX LOOP AGAIN ;CX不等于0循环 LEA DX,D2 MOV AH,09H INT 21H MOV AH,4CH ; 功能号为4CH,返回DOS INT 21H
;转换子程序CHANGE 入口:AL低半子节为要转换的16进制数, ;SI为要存放转换后ASCII的间址寄存器。 CHANGE PROC CMP AL,10 JL JIA0 ADD AL,'A'-'0'-10 ;A-F值 JIA0: ADD AL,'0' ;0-9值 MOV [SI],AL ;存ASCII INC SI RET CHANGE ENDP CODE ENDS ;代码段结束 END START ;源程序结束
汇编语言编程练习: 1、在给定的数据区域中,找出最大数。 2、在给定的数据区域中,找出最大数 和最小数。
VAR DW ? ;变量VAR的类型为字 ARRAY DD 10DUP(?) ;变量ARRAY 的类型为字 STR DB ‘This is a test’ ;变量STR 的类型为字节 。。。 MOV AX,TYPE AVR MOV BX,TYPE ARRAY MOV AX,TYPE STR MOV CX,LENGTH ARRAY MOV DX,SIZE ARRAY