微型计算机系统5大部分,微型计算机系统 (5)

《微型计算机系统 (5)》由会员分享,可在线阅读,更多相关《微型计算机系统 (5)(36页珍藏版)》请在人人文库网上搜索。

1、第 5 章,汇编语言程序设计,第5章 汇编语言程序设计,本章重点: 结合实例理解汇编语言程序设计的基本步骤;掌握汇编语言程序设计的基本方法;熟练运用循环、分支和子程序的程序设计方法解决问题。 本章难点: 依据所要解决的问题,选择正确的程序设计方法,正确地运用指令编写实用的汇编原程序。,汇编语言是一种用助记符来表示指令的操作码和操作数,用标号和符号来代替地址、常量和变量的符号语言。 用汇编语言编写的程序不能由机器直接执行,而必须翻译成由机器代码组成的目标程序,这个翻译过程称为汇编。,5.1 概述,用来把汇编语言编写的程序自动翻译成目标程序的软件叫汇编程序。 汇编程序的建立及汇编过程如图所示。,8。

2、086的汇编语言的源程序是分段的,由若干个段形成一个源程序。源程序的一般格式为:,NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END ,5.1 概述,每一个段有一个名字,以符号SEGMENT作为段的开始,以语句ENDS作为段的结束。这两者都必须有名字,而且名字必须相同。 由若干个段组成一个源程序,整个源程序以语句END作为结束。,5.1 概述,总之,8086的源程序是由若干段组成的,而一个段又是由若干个语句行组成的。所以,语句行是汇编源程序的基础。,8086汇编的一个语句行也是由4个部分组成的,即 标号 操作码 操。

3、作数 ;注释 各部分之间至少要用一个空格作为间隔。,5.1 概述,语句行是由标记及分隔符按照一定规则组织起来的,标记是汇编语言源程序的最小的、具有意义的单位,如标识符、保留字、界符、常数和注释,所有这些都称为标记。 在8086汇编语言中,有数值表达式和地址表达式两种,由各种常量与运算符连接成的式子,称为数值表达式。将常量、变量、标号、寄存器内容和运算符、操作符组合成的有意义的式子,称为地址表达式。单个常量,变量、标号是表达式的最简形式。在汇编过程中,汇编程序按操作运算符约定的优先规则对表达式进行计算,得到一个数值或一个地址。,5.2 语句行构成,伪指令用来指示汇编程序应该如何去处理汇编语言的源。

4、程序。它们在汇编时被解释执行,除了部分语句可以申请存储空间以外,不产生任何目标代码。,5.3 伪指令,2等号语句 格式:符号名=表达式 功能:把表达式的值赋值给符号名,等号语句与等值语句具有相同的功能。,5.3.1 符号定义伪指令,1等值语句 格式:符号名 EQU 表达式 功能:用一个符号名来代替表达式,使该符号名与表达式同义。,格式:变量名 数据定义符 操作数 ,操作数, 功能:方括号中的变量名为可选项。操作数可以不止一个,多个操作数时用逗号分开。数据定义符号是DB、DW、DD、DQ、DT。 DB定义字节类型变量,DW定义字类型变量,DD定义双字类型变量,DQ定义四字类型变量,DT定义十字节。

5、类型变量。,5.3.2 数据定义伪指令,DATA DB l0H,20H STRl DBCOMPUTER DATAlDB20 DUP (?) DATA2DW? DATA3DB 20 DUP (30H),5.3.2 数据定义伪指令,格式:段名 SEGMENT 定位类型 组合类型 类别名 段名 ENDS 功能:用来把程序分成若干逻辑段,实现存储器的分段管理,在汇编和连接程序时,控制不同段的定位,组合和连接,以便形成一个可执行程序。,5.3.3 段定义伪指,段寻址伪指令用来告诉汇编程序当前使用的各个段的段地址将要存放在哪个段寄存器中。 格式:ASSUME段寄存器名:段名,段寄存器 名:段名 功能:设置。

6、或撤消在SEGMENTENDS伪指令中 定义过的段名所使用的段寄存器。,5.3.4 段寻址伪指令,格式:过程名 PROC NEARFAR RET 过程名 ENDP 功能:定义一个过程,并指明过程名和过程的属性。 过程名实际上是过程入口的符号地址,PROC和 ENDP前的过程名必须相同,它们之间的部分是过程体。 过程的类型可以是NEAR,表示所定义的过程是一个近过程。过程类型为FAR表示是一个远过程,,5.3.5 过程定义伪指令,一般说来,编制一个汇编程序的步骤如下: (1) 分析题意,确定算法。 (2) 根据算法画出程序框图。 (3) 根据框图编写程序。 (4) 上机调试程序。 程序有顺序、循。

7、环、分支和子程序四种结构形式。 顺序程序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,但作为完整的程序则很少见。,5.4 程序设计举例,1分支程序的结构形式 分支程序结构可以有两种形式,如图所示。,(a)IF_THEN_ELSE,(b)CASE,分支程序的结构形式图,5.4 程序设计举例,2分支程序设计方法 程序的分支一般用条件转移指令来产生,下面一些例子来分析分支程序的设计方法。,例5.6 编程求符号函数,设x在AL中,5.4.1 分支程序设计,程序: DATASEGMENT ;定义数据段 XXDB10 YYDB? DATAENDS CODE SEGMENT ;定义代码段 。

8、ASSUME CS: CODE, DS: DATA START PROCFAR BEGIN:PUSHDS ;DS:00 压栈 MOVAX, 0 PUSHAX,MOVAX, DATA MOVDS, AX;置数据段 MOVAL, XX;AL=XX CMPAL, 0;AL与0比较 JGEBIGR;大于,等于转BIGR MOVAL, 0FFH;AL=-1 JMPEQUT;转EQUT BIGR:JEEQUT ;等于0,转EQUT MOVAL, 01;AL=1 EQUT:MOVYY, AL ;符号函数的结果存入YY单元 RET START ENDP CODE ENDS ENDBEGIN,1循环程序的结构形。

9、式 循环程序可以有两种结构形式,如图所示。,(1)Do While结构,(2)Do UNTIL结构,5.4.2 循环程序设计,2循环程序设计方法,例5.10 求S=1+2+3+100,程序: DATA SEGMENT ; 定义数据段 MAX DW 100 SUM DW ? DATA ENDS STACK SEGMENT PARA STACK ;定义堆栈段 DW 20H DUP(?) STACK ENDS,5.4.2 循环程序设计,CODE SEGMENT ; 定义代码段 START PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: PUSH DS 。

10、; DS压栈 MOVAX, 0 PUSH AX ; 00压栈 MOV AX,DATA MOV DS,AX ; 置数据段 MOV AX,0 ; 累加器清0,MOVCX,MAX ; 循环控制CX=MAX MOVBX,1 ; 初始加数用1 AGAIN: ADDAX,BX ; 累加求和 INCBX; 下一个数 LOOP AGAIN; 循环转AGAIN MOVSUM, AX; 求和结果存SUM中 RET START ENDP CODE ENDS END BEGIN,例5.10 求 N! 程序: DATASEGMENT; 定义数据段 NDW 5 YYDW ? DATAENDS STACKSEGMENT P。

11、ARA STACK ; 定义堆栈段 DW50H DUP (?) STACKENDS,CODE SEGMENT; 定义代码段 START PROC FAR ASSUME CS:CODE, DS:DATA, SS:STACK BEGIN: PUSH DS; DS压栈 MOV AX, 0 PUSH AX; 00压栈 MOV AX, DATA MOV DS, AX ; 置数据段 MOV AX, N; AX=N CMP AX, 0 ; 比较是否为0 JNE NOZ ; 非0转NOZ,INCAX ; 0则AX=1 JMPEXIT ; 转EXIT NOZ: MOVBX, AX ; BX=AX=N MOVAX。

12、, 1 ; 累积AX=1 AGAIN: MULBX ; 相乘AX*BX-AX DECBX; BX减1 JNEAGAIN ; 非0继续 EXIT: MOVYY, AX ; 保存N!结果到YY中 RET START ENDP CODE ENDS ENDBEGIN,子程序又称为过程,它相当于高级语言中的过程和函数。在一个程序的不同部分,往往用功能和结构形式都相同的程序段,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序形式,在需要时可以调用它。在汇编语言程序中,子程序定义的伪指令是PROC和ENDP,子程序有NEAR和FAR属性调用子程序和从子程序返回的指令是CALL和RET,5.4.3 子。

13、程序结构,子程序设计中,应注意几点: 现场保护和恢复 子程序的嵌套和递归调用 参数传递 编写子程序调用方法说明,5.4.3 子程序结构,程序要求从键盘取得一个十进制数,然后把该数以十六进制形式在屏幕上显示出来。采用一个子程序DECIBIN实现从键盘取得十进制数并把它转换为二进制数;另一个子程序BINIHEX把此二进制数以十六进制数的形式在屏幕上显示出来。为避免屏幕上的重叠,另外用CRLF子程序取得回车和换行效果。整个程序结构如图所示。各个子程序之间用BX寄存器来传送信息。在过程DECIBIN中取得的输入数据转换为二进制数后保存在BX寄存器中,而过程BINIHEX需要把BX寄存器中的数用十六进制。

14、形式显示出来。,例5.17 编写十进制到十六进制数转换程序。,十进制到十六进制数转换的程序结构图,程序: DECIHEX SEGMENT; 定义代码段 ASSUME CS:DECIHEX MAIN PROC FAR; 主程序 REPEAT: CALL DECIBIN; 调用子程序输入十进制数 CALL CRLF; 显示回车、换行 CALL BINIHEX; 以十六进制数输出 CALL CRLF ; 显示回车、换行 JMP REPEAT; 转REPEAT,继续 MAIN ENDP,DECIBIN PROC NEAR; 十进制数输入子程序 MOV BX, 0; BX保存输入数 NEWCHAR: M。

15、OV AH, 1 INT 21H; 调用DOS功能输入字符 SUB AL, 30H; 转为数0-9 JL EXIT; 小于0,不是数字 CMP AL, 9D; 与9比较 JG EXIT; 大于,不是数字 CBW; AL=AX XCHG AX, BX; AX、BX互换,MOV CX, 10D ; CX=10 MUL CX ; AX=AX*CX XCHG AX, BX ; AX、BX互换 ADD BX, AX ; BX为前面输入的结果 JMP NEWCHAR EXIT: RET DECIBIN ENDP BINIHEX PROC NEAR MOV CH, 4 ; CH循环次数 ROTATE: MO。

16、V CL, 4 ;每次循环输出一位十六 进制数,ROL BX, CL ; 即移位4个二进制位 MOV AL, BL ; AL=BL AND AL, 0FH ; 取低4位 ADD AL, 30H ; 转变为ASCII码 CMP AL, 3AH ; 是否为0-9 JL PRINTIT ; 是转PRINTIT ADD AL, 7H ; 否转为A-F PRINTIT: MOV DL, AL ; DL=输出字符 MOV AH, 2 INT 21H ;调用DOS中断,显示字符 DEC CH,JNZ ROTATE ; 没循环结束,继续 RET ; 返回 BINIHEX ENDP CRLF PROC NEAR ; 输出回车、换行 MOV DL, 0DH MOV AH, 2 INT 21H ; 输出回车 MOV DL, 0AH MOV AH, 2 INT 21H ; 输出换行 RET CRLF ENDP DECIHEX ENDS END MAIN,本章完 谢谢大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值