1 / 27

5 、汇编语言程序设计

5 、汇编语言程序设计. 基本要求: 程序要结构化, ( 简明,易读,易调试 ) 执行速度快。 占用存储空间少, ( 即存储容量小 ). 汇编程序的基本步骤:. (1) 分析问题,描绘出数学模型。 (2) 确定算法。 (3) 绘制程序框图。 (4) 分配存储器及工作单元。 (5) 编制程序。 (6) 静态检查。 (7) 上机调试、试运行。. 例: 编写一个程序查找一定内存单元中的最大自然数。. 分析问题,确定数学模型。 确定算法。 绘制程序框图。 分配存储器及工作单元。 编制程序。 静态检查。 上机调试、试运行。. 开始. 初始化,设指针、计数器.

gabe
Download Presentation

5 、汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 5、汇编语言程序设计 基本要求: • 程序要结构化,(简明,易读,易调试) • 执行速度快。 • 占用存储空间少,(即存储容量小)

  2. 汇编程序的基本步骤: (1)分析问题,描绘出数学模型。 (2)确定算法。 (3)绘制程序框图。 (4)分配存储器及工作单元。 (5)编制程序。 (6)静态检查。 (7)上机调试、试运行。

  3. 例:编写一个程序查找一定内存单元中的最大自然数。例:编写一个程序查找一定内存单元中的最大自然数。 分析问题,确定数学模型。 确定算法。 绘制程序框图。 分配存储器及工作单元。 编制程序。 静态检查。 上机调试、试运行。

  4. 开始 初始化,设指针、计数器 取第一个数到计数器 与下一个数比较 下一个数大? N 取大数到寄存器 修改地址指针、计数器 N 查找结束? 结束

  5. 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 ;设置数据指针

  6. 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 ;源程序结束

  7. 程序的基本结构 • 顺序结构 • 分支结构 • 循环结构 • 子程序结构

  8. 1、顺序结构 顺序结构程序本身很简单,按程序的编写顺序逐条执行。它依赖于计算机能够顺序执行语句的特点,只要语句安排的顺序是正确的就可以了。

  9. 例: 把非压缩的十进制数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为压缩的十进制数 . . .

  10. 满足 不满足 不满足 条件 条件 满足 程序段1 程序段2 程序段 2、分支结构

  11. 例: 设计一字符比较程序,将键入的字符与存储单元的字符相比较,相同显示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

  12. 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

  13. 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

  14. 循环初始设置 循环体 满足 循环条件 不满足 3、循环结构

  15. 例:求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

  16. 加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

  17. 改为循环设计: 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

  18. 例:统计一个数据块中正数、负数和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

  19. 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

  20. 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

  21. 子程序设计 重复出现的程序段 1、主子程序之间的信息交换(参数传递) 2、现场保护

  22. 例: 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 ; 堆栈段结束

  23. 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

  24. 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

  25. ;转换子程序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 ;源程序结束

  26. 汇编语言编程练习: 1、在给定的数据区域中,找出最大数。 2、在给定的数据区域中,找出最大数 和最小数。

  27. 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

More Related