[理学]ch04汇编语言程序设计.ppt_第1页
[理学]ch04汇编语言程序设计.ppt_第2页
[理学]ch04汇编语言程序设计.ppt_第3页
[理学]ch04汇编语言程序设计.ppt_第4页
[理学]ch04汇编语言程序设计.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章 汇编语言程序设计,2019/4/19,微机原理,2,本章要点,汇编语言的基本语法规则,汇编语言常用的伪指令和DOS功能调用,顺序、分支、循环和子程序设计基本方法,2019/4/19,微机原理,3,4.1 汇编语言的基本语法,汇编语言程序,数据段,代码段,堆栈段,存放常数、变量以及作为 算术运算区和用来作为I/O 接口传送数据的工作区,堆栈段用来在内存中建立 一个堆栈区,以便在中断 和过程调用时使用,堆栈 还起承上启下的作用,用 于模块间参数的传送。,2019/4/19,微机原理,4,4.1.1 语句格式,1、语句格式: 名称 (空格或冒号) 操作助记符 (空格) 操作数 ;注释,2019/4/19,微机原理,5,2、8086汇编语言源程序格式 段定义伪操作 段名 SEGMENT 段名 ENDS 过程定义伪操作 过程名 PROC NEAR/FAR 过程名 ENDP 程序开始伪操作 START 程序名 程序结束伪操作 END START 段分配伪操作 ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA,2019/4/19,微机原理,6,例.一个简单程序实例,MY_DATA SEGMENT ;定义数据段 SUM DB ? ;为符号SUM保留一个字节 MY_DATA ENDS ;定义数据段结束 MY_CODE SEGMENT ;定义码段 ASSUME CS: MY_CODE, ;规定CS和DS的内容 DS: MY_DATA PORT_VAL EQU 3 ;端口的符号名 GO: MOV AX,MY_DATA ;DS初始化为MY_DATA MOV DS,AX MOV SUM,0 ;清SUM单元 CYCLE: CMP SUM,100 ;SUM单元与100相比较 JNA NOT_DONE ;若未超过,转至NOT_DONE MOV AL,SUM ;若超过,把SUM单元的内容 OUT PORT_VAL,AL ;通过AL输出 HLT ;然后停机 NOT DONE:IN AL,PORT_VAL ;未超过时,输入下一个字节 ADD SUM,AL ;与以前的结果累加 JMP CYCLE ;转至CYCLE MY CODE ENDS ;码段结束 END GO ;整个程序结束,2019/4/19,微机原理,7,4.1.2 语句行的构成,1、常数 数值常数-可为各种数制,必须以数字打头,除十进制外, 必须用后缀注明,如BOH等。 字符串常数-由单引号括起的字符串,用来表示相应的ASCII码, 如17是31H37H。 2、标识符(P92)的要求 (1)标识符是一个字符串,第一个字符必须是字母、“?”、“”、 或下划线“_”这四种字符中的一个。 (2)从第二个开始,可以是字母、数字、“?”、“”、“_”; (3)一个标识符的长度可以由131个字符组成。 3、保留字 保留字看上去像标识符,但它们有特殊的意义,不能作为 标识符。(P93),2019/4/19,微机原理,8,4.1.3 汇编语言的运算符,算术运算符,逻辑运算符,关系运算符,分析运算符,合成运算符,2019/4/19,微机原理,9,1.算术运算符,2.逻辑运算符,3.关系运算符,+-*/(整除) MOD(求二整数相除的 余数),ANDORNOT XOR按位进行,EQ(相等)NE(不等) LT(小于)GT(大于) LE(小于等于)GE(大于 等于),关系成立返回全0FFFFH, 关系不成立返回全0(16位),2019/4/19,微机原理,10,4.(P103) 分析 运算符,(1)SEG运算符 取段地址运算符,该运算返回变量或标号 所在段的段地址(字常量)。,(2)OFFSET运算符 取段内偏移地址符,该运算返回变量或标号 所在段的段内偏移地址。,(3)TYPE运算符 取类型属性运算符,该运算返回变量或标号 的类型值(P104)。若运算对象是变量,则 返回变量类型所占字节数。,(4)LENGTH运算符 取数组变量元素个数运算符,如果变量是 用重复数据操作符DUP说明的,则返回DUP 前面的数值(即重复次数);如果没有DUP 说明,则返回值总是“1”。,2019/4/19,微机原理,11,若在一个程序中,对它的数据段有如下定义: DATA_TABLES SEGMENT BUFFER1 DB 100 DUP(0) BUFFER2 DW 200 DUP(20H) BUFFER3 DD 100 DUP(13) DATA_TABLES ENDS 则:SEG BUFFER1 SEG BUFFER2 SEG BUFFER3 返回的都是DATA_TABLES 的地址。 而:OFFSET BUFFER1 返回存储单元BUFFER1的偏移量 LENGTH BUFFER1= SIZE X=,100,( LENGTH X) X(TYPE X),2019/4/19,微机原理,12,5.合成 运算符,(1)“:”运算符 用来临时给变量、标号或地址表达式指定一个 段属性。,(2) PTR运算符(P104) 赋予“表达式”指定的“类型”,新的类型只在所处 的指令内有效。格式为:类型 PTR 表达式,(3) THIS运算符(P106) 该运算符和“=”(或EQU)伪指令连用,把它后 面指定的类型属性或距离属性赋给当前的变量或 标号。常用的格式为: 变量或标号=THIS 属性,(4)圆括号“( )”运算符 用来改变被括运算符的优先级别。,2019/4/19,微机原理,13,TWO_BYTE DW ? ONE_BYTE EQU BYTE PTR TWO_BYTE,MOV TWO_BYTE ,AX MOV AL, ONE_BYTE,2019/4/19,微机原理,14,2. 指示性语句的结构(不参与汇编),名字 伪指令助记符 操作数;注释,4.1.4 语句类型与结构,DATA1 DB 36H ;变量-数据的符号地址,1.指令性语句的结构,标号: 指令助记符 操作数;注释,START: MOV AX, DTSEG ;标号- 指令的符号地址,2019/4/19,微机原理,15,4.2 指示性语句(伪指令) (P99),1.EQU伪指令 格式:名字 EQU 表达式 功能:是将数值或字符序列与一个指定的名字等价。 (1)为常量定义一个符号,以便在程序中使用符号来表示常量。 (2)为变量或标号定义新的类型属性并起一个新的名字。 (3)为汇编语言中的任何符号定义一个新的名字。 注意: EQU语句未解除前,不能重新定义。,COUNT EQU 25 COUNT1 EQU CX,4.2.1 符号定义伪指令,2019/4/19,微机原理,16,2.“=”伪指令 “=”伪指令同EQU,但 a,对同一个名称可定义多次 b,表达式的值不得超过16位2进制数。,3. PURGE伪指令 格式: PURGE 符号1,符号2 功能:已经由EQU命令的符号,若以后不再用了,就由 PURGE 语句解除。 PURGE COUNT1 COUNT1 EQU DX,TEMP=25 TEMP=TEMP+1,2019/4/19,微机原理,17,4.2.2 数据定义伪指令(P100),常用的数据定义伪指令有DB、DW、DD 格式:变量名 DBDWDD 表达式,DB 定义字节, 是唯一能定义字符串的伪操作.,DW 定义字,DD 定义双字,DF 分配一个或多个6字节单元 DQ 分配一个或多个8字节单元 DT 分配一个或多个10字节单元,2019/4/19,微机原理,18,DB 定义字节, 是唯一能定义字符串的伪操作.,DATA1 DB 25 ; decimal number DATA2 DB 10001001B ; binary number DATA3 DB 12H ; hexadecimal number DATA4 DB 1,2,4,8,16 ; BIGGER DW 4142H ;42H放低字节,41H放高字节 BIGGEST DD 12345678H,2019/4/19,微机原理,19,DUP (P101) 按照给定的次数来复制某个(某些)操作数,DB 100 DUP(0) ;100个字节全初始化为0 DW 100 DUP(0) ;100个字全初始化为0 DW 10 DUP(?) ;保留10个字 DATA22 DB 32 DUP(?) ; set aside 32 bytes DATA23 DB 5 DUP(2 DUP(99) ; fill 10 bytes with 99 DATA24 DW 8 DUP(?) ; set aside 8 words EXAM1 DB THIS IS AN EXAMPLE,2019/4/19,微机原理,20,4.2.3 段定义伪指令,段定义的主要命令有: (1) SEGMENT,(2) ENDS, (3) ASSUME,(4) ORG。 段名 SEGMENT ;语句 段名 ENDS 段名:是所定义段的名称,二个段名必须一致。,伪指令 ORG ORG 指定数据的存储地址或代码段的起始地址 例: ORG 100H 例: ORG 100H DATA1 DB 10 START: MOV AX,BX,2019/4/19,微机原理,21,STACK-SEG SEGMENT ; 定义堆栈段 STACK-SEG ENDS ; DATA-SEG SEGMENT ; 定义数据段 DATA-SEG ENDS ; EXTRA-SEG SEGMENT ; 定义附加数据段 EXTRA-SEG ENDS ; CODE-SEG SEGMENT ; START: 定义代码(即指令)段 CODE-SEG ENDS ; END START ;源程序模块结束,源程序模块的典型结构,2019/4/19,微机原理,22,4.2.4 过程定义伪指令(P112),子程序通常以过程的形式编写。格式如下: 过程名 PROC 类型 NEAR OR FAR RET 过程名 ENDP NEAR:表示段内 FAR:表示段间 RET为过程返回指令,不能省,否则过程将无法返回。 返回指令属于段内返回还是段间返回与过程类型有关。,2019/4/19,微机原理,23,4.2.5 结束语句,结束语句编写。格式如下: START: END START END表明整个源程序结束。,2019/4/19,微机原理,24,4.3 汇编语言程序设计方法,4.3.1 设计步骤,建立数学模型,确立数据结构与算法,绘制流程图及编制程序,调制,2019/4/19,微机原理,25,基本程序结构: 顺序结构 循环结构 分支结构 子程序结构 复合结构:多种程序结构的组合,2019/4/19,微机原理,26,4.3.2 顺序程序设计,例1:内存中自TABLESQ开始的16个存储单元连续存放着 自然数0到15的平方值,任一数 x(0x15)存放在其后 的 XX 单元,查表求出 x 这个数的平方值,并放到 YY 单元中。 DATA SEGMENT TABLESQ DB 0,1,4,9,16,25,36,49 DB 64,81,100,121,144,169,196,225 XX DB ? YY DB ? DATA ENDS STACK SEGMENT PARA STACK STACK DB 50 DUP(?) STACK ENDS,2019/4/19,微机原理,27,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV BX,OFFSET TABLESQ MOV AH,0 MOV AL,XX ADD BX,AX MOV AL,BX MOV YY,AL MOV AH,4CH INT 21H CODE ENDS END BEGIN,2019/4/19,微机原理,28,(1)两路分支结构 (2)多路分支结构,4.3.3 分支程序设计,2019/4/19,微机原理,29,分支结构的程序需要由控制转移类指令来实现。 转移指令:能够改变程序指令指针IP的内容(增加、减少), 也可能同时改变CS和IP的内容,从而改变程序的走向。,无条 件转 移指 令,条件 转移 指令,2019/4/19,微机原理,30,例1:变量x的符号函数可用下式表示: y= 1,x0 0,x=0 -1,x0 DATA SEGMENT BUFFER EQU X DATA ENDS STACK SEGMENT PARA STACK STACK DB 50 DUP(?) STACK ENDS,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,2019/4/19,微机原理,31,SIGEF:MOV AX,BUFFER OR AX,AX JE ZERO JNS PLUS MOV BX,0FFH JMP CONTI ZERO: MOV BX, 0 JMP CONTI PLUS: MOV BX, 1 CONTI:,2019/4/19,微机原理,32,结,束,初始化,循环的初始状态,循 环 体,修改部分,循环控制 条件,Y,N,4.3. 4 循环程序设计,就是要求重复执行的程序段部分。,循环控制部分每循环一次检查循环结束的条件,当满足条件时就停止循环,往下执行其他程序。,2019/4/19,微机原理,33,例4-2:在一串给定个数的数中寻找最大值(或最小值),放到指定的存储 单元每个数用16位表示。 DATA SEGMENT BUFFER DW X1,X2,Xn COUNT EQU $- BUFFER MAX DW ? DATA ENDS STACK SEGMENT PARA STACK STACK DB 64 DUP(?) TOP EQU $- STACK STACK ENDS,CODE SEGMENT START PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK,2019/4/19,微机原理,34,BEGIN:PUSH DX MOV AX, 0 PUSH AX MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV CX,COUNT LEA BX,BUFFER MOV AX,BX INC BX DEC CX,AGAIN:CMP AX,BX JGE NEXT MOV AX,BX NEXT: INC BX LOOP AGAIN START ENDP CODE ENDS END BEGIN,2019/4/19,微机原理,35,4.3.5 字符串处理程序设计,计算机处理字符,常用的字符编码是ASCII码。 广泛使用的控制字符: 0AH换行(LF) 0DH回车(CR) 08H退格 7BH删除字符(DEL),1. 确定字符串的长度 系统中字符串的长度是不固定的。通常以某个特殊字符作为结束标志,例如有的用回车符(CR),有的用字符。在对字符串操作时往往要确定它的长度,2019/4/19,微机原理,36,例4-3:从头搜索字符串的结束标志,统计搜索的字符个数。,2019/4/19,微机原理,37,DATA SEGMENT STRING DB ABCDUVWXYZ,0DH LL DB ? CR EQU 0DH DATA ENDS STACK SEGMENT PARA STACK STACK DB 100DUP(?) STACK ENDS,CODE SEGMENT START PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA ,SS:STACK,2019/4/19,微机原理,38,BEGIN:PUSH DX MOV AX, 0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI, STRING MOV DL,0 MOV AL,CR AGAIN: SCASB JE DONE INC DL JMP AGAIN,DONE: LEA BX, LL DEC CX MOV BX , DL RET START ENDP CODE ENDS END BEGIN,段内返回: RET;(SP+1,SP)IP ; SP+2 SP,2019/4/19,微机原理,39,4.3.6 码制转换程序设计,码制转换方法: 1、软件实现 2、查表实现 3、硬件实现,十六进制到ASCII码的转换。,十六进制,ASCII码,2019/4/19,微机原理,40,例4-5:若有一个二进制数码串,要把每一个字节中的二进制转换为 两位十六进制数的ASCII码放在地址高的单元。,2019/4/19,微机原理,41,DATA SEGMENT L1 DW 2 STRING DB 34H,98H L2 DW ? BUFFER DB 2*2DUP(?) DATA ENDS STACK SEGMENT PARA STACK STACK DB 100DUP(?) STACK ENDS,CODE SEGMENT START PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA ,SS:STACK,2019/4/19,微机原理,42,BEGIN:PUSH DX MOV AX, 0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX, L1 LEA BX, STRING LEA SI, BUFFER MOV AX,CX SAL CX,1 MOV L2,CX MOV CX,AX AGAIN: MOV AL,BX MOV DL,AL AND AL,0FH,2019/4/19,微机原理,43,CALL CHANGE MOV AL,DL PUSH CX MOV CL,4 SHR AL,CL POP CX CALL CHANGE INC BX LOOP AGAIN RET START ENDP CHANGE PROC CMP AL, 10 JL ADD-0 ADD AL,A-0-10,ADD-0:ADD AL,0 MOV SI ,AL INC SI RET CHANGE ENDP CODE ENDS END BEGIN,2019/4/19,微机原理,44,4.3.7 有关I/O的DOS功能调用,为了在程序运行过程中了解运行的情况,应该设法把结果在显示器CRT上显示出来。要在程序中显示结果,方便的方法是调用操作系统中的I/O子程序。在调用时,把子程序的号(或称系统功能调用号)送至AH,把子程序规定的入口参数,送至指定的寄存器,然后由中断指令INT 21H来实现调用。,2019/4/19,微机原理,45,1. 在CRT上连续输出字符09 DOS的功能调用2就是向CRT输出一个字符的子程序,它要求把要输出的字符的ASCII码送至寄存器DL。即: MOV DL,OUTPUT_CHAR MOV AH,2 INT 21H,为了使输出的字符之间有间隔,在每一循环中,输出一个09的字符和一个空格。要输出09,只要使一个寄存器(程序中为BL)的初值为0,每循环一次使其增量,为了保证是十进制数,增量后要用DAA指令调整,为了保证始终是一位十进制数,用AND 0FH指令屏蔽掉高4位。其流程如图4-10所示。 相应的程序为:,2019/4/19,微机原理,46,图4-10,2019/4/19,微机原理,47,name output_char_0_9 stack segment para stackstack db 100 dup(?) stack ends code segment assume cs: code,ss: stack start proc far begin: push ds mov ax,0 push ax mov bl,0 push bx goon: mov d1,20h;把空格字符DL mov ah,2,2019/4/19,微机原理,48,int 21h ;输出空格字符 pop bx mov al,bl inc al daa ;增量后进行十进制调整 and al,0fh mov bl,al push bx or al,30h ;转换为ASCII码 mov dL,al mov ah,2 int 21h ;输出一个09之间的字 符 mov cx,0ffffh;为便于观察,插入一 定的延时,2019/4/19,微机原理,49,again: dec cx jne again jmp goon start endp code ends end begin,2019/4/19,微机原理,50,2. 在CRT上连续显示0059 在微型计算机系统上常常可以显示实时时钟,这就要求能输出数码0059。要输出多于一个字符时,要利用功能调用9,它是向CRT输出字符串的子程序,要求在调用前使DX指向字符串的首地址,字符串必须以字符“”结束,则功能调用9能把字符“”之前的全部字符向CRT输出。 为了使每次输出的数码能够换行,在每一循环中,利用系统调用2,分别输出一个回车和换行字符,其流程如图4-11所示。 相应的程序为:,2019/4/19,微机原理,51,2019/4/19,微机原理,52,name output_char_00_59 stack segment para stackstack db 100 dup(?) st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论