




已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第4章 汇编语言程序设计,本 章 重 点 汇编语言源程序的基本语法 常用的指示性语句 基本的DOS功能调用 基本的程序设计,2,本 章 内 容,4.1 汇编语言的格式 4.2 语句行的构成 4.3 指示性语句 4.4 指令语句 4.5 汇编语言程序设计及举例,3,4.1.1 8086汇编语言程序的一个例子(P90),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 ;整个程序结束,4,8086的汇编语言的源程序是分段的,由若干个段形成一个 源程序。源程序的一般格式为: NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END标号 (第一条可执行指令),5,4.1.汇编语言的格式,汇编语言源程序的结构,数据段,6,二.段与过程的定义,1 .段的定义,2 .过程(子程序)的定义,过程定义设计具有一定功能的程序段,或称为子程序。,段内过程的定义:过程名 PROC NEAR,段交叉过程的定义:过程名 PROC FAR,7,标号: 前缀 操作码 操作数,操作数 ;注释 名字 伪操作 操作数 ,操作数 ;注释 空格作为间隔,由以上实例可知,每一语句行由4部分组成:,4.2 语句行的构成,指令性语句是计算机可执行的,指示性语句(伪指令)不能执行,用来定义变量,分配存储单元,指示程序开始和结束等,这两种语句的差别: 在形式上:带不带冒号,是否可转向它. 在本质上:汇编时能否形成对应的机器码.,8,标号: 前缀 操作码 ;注释 名字 伪操作 操作数 ,操作数 ;注释 操作数,操作数 标号和名字(标识符)的规定: 英文字母、数字及专用字符 最大长度不能超过 31 个 且不能由数字打头 不能用保留字(如寄存器名,指令助记符,伪指令) (P93),由以上实例可知,每一语句行由4部分组成:,4.2 语句行的构成,操作数,操作数,9,(2)字符串常量 用单引号括起来的字符或字符串 汇编时被翻译成对应的ASCII码,数据项操作数包括常量、变量、标号及表达式,1.常量 (1)数字常量 二进制常量 以B结尾 十进制常量 以D结尾或省略 八进制常量 以字母Q(或字母O)结尾 十六进制常量 以H结尾,10,变量是内存中的数据区 在程序中作为存储器操作数来使用 变量有三种属性 段 值变量所在段的首地址 偏移量变量单元地址与段首地址之间的位移量 类 型字节、字和双字,2.变量,11,标号是指令所存放单元的符号地址,可作为转移指令或CALL指令的转移地址。 标号也有三种属性:段值总是在CS段寄存器中,偏移量概念与变量同,类型分NEAR和FAR两种。 若没有对类型进行说明,默认为NEAR。,3.标号,12,4.表达式,(1)算术运算符 +、-、*、/,以及MOD 例 MOV AL,2*7 LEA SI,SUM+3 (2)逻辑运算符 AND、OR、XOR和NOT 例 MOV CL,36H AND 0FH 注意:逻辑运算符也是8086/8088的指令助记符 运算符在汇编时进行 指令在执行时进行,13,(3)关系运算符 EQ(相等),NE(不等),LT(小于),GT(大于), LE(小于或等于),GE(大于或等于) 关系为真,结果为0FFFFH 关系为假,结果为0 例:MOV BX, PORT_VAL GE 5,14,(4)取值运算符和属性运算符 (P103) 取值运算符获得存储器操作数的属性 OFFSET获得标号或变量的偏移地址 SEG获得标号或变量的段地址 例:MOV SI,OFFSET STRI1 与 LEA SI, STRI1 类似 属性运算符 PTR指定操作数的类型 例: MOV AL, BYTE PTR VAR,15,(5) 其它运算符 1)方括号 “ ”表示存储器操作数,方括号里的内容表示操作数的偏移地址。,(2)段超越运算符“:” “:”跟在某个段寄存器名之后表示段超越用来指定一个存储器操作数的段属性,而不管其原来隐含的段是什么。,16,4.3 指示性语句(伪指令),常用的伪指令有: 符号定义伪指令 数据定义伪指令 段定义伪指令 过程定义伪指令 宏定义伪指令 结束语句,17,4.3.1 符号定义语句(P99),1.等值伪指令EQU 格式:符号名 EQU 表达式 或:新符号名 EQU 老符号名 例: CONSTANT EQU 100 NEW_PORT EQU PORT_VAL+1 注意:EQU伪指令在未解除前,不能重新定义。 2.解除伪指令PURGE 例:PURGE NEW_PORT NEW_PORT EQU POTR_VAL+8,18,3.等号(=)伪指令 与EQU类似,但允许重新定义 例: EMP=7 ;值为7 EMP=EMP+1 ;值为8,19,4.3.2 数据定义伪指令,格式: 变量名 伪指令 操作数 ;注释 其中变量名用符号地址表示,后面不能跟冒号 伪指令助记符 DB 用来定义字节 DW 用来定义字 DD 用来定义双字 例1: DATA_BYTE DB 10,5,10H DATA_WORD DW 100H,100,-4 DATA_DW DD 2*30, 0FFFBH,20,汇编后:,DATA_BYTE,DATA_DW,DATA_WORD,10,5,10H,100H,100,-4,60,0FFFBH,DATA_BYTE DB 10,5,10H DATA_WORD DW 100H,100,-4 DATA_DW DD 2*30, 0FFFBH,21,例2:操作数可以是字符串 STR DB HELLO,STR,H,E,L,L,O,22,? 操作数用来保留存储空间,但不存入数据. 例3:ABC DB 0,1,?,?,? LPI DW ?,54,? 汇编后:,数据定义中的三个特殊符号:?,DUP,$,23,复制操作符DUP (P101) 例4: ABC DB 0,1,3 DUP(?) 例5: DO-2 DB 2 DUP(0,1,2,?) 与 DO-2 DB 0,1,2,?,0,1,2,? 等价 $:表示的是地址计数器的当前值 例:BUFFER DW 3,4,$+3 设BUFFER的偏移地址为0088H,则汇编后$+3的值为多少,24,例:BUFFER DW 3,4,$+3 设BUFFER的偏移地址为0088H,则汇编后如下图所示:,25,例:分析下面申请数据区的存储内容,NUM DB 75H ;申请一字节,数为“75H”,ARRY DW 20H DUP(0) ;申请20H个字,数均为“0”,ADR1 DW NUM ;申请一字,预置NUM的偏移地址,ADR2 DD NUM ;申请双字,预置NUM的逻辑地址,ADR3 DW ARRY+2 ;申请一字,预置ARRY的偏移地址加2,设:NUM的段地址为0915H,NUM的偏移地址为0004H。,75,DS:NUM,DS:ARRY,DS:ADR1,DS:ADR2,DS:ADR3,40H 个单元,0400,04001509,0700,0915:0004,0915:0005,0915:0045,0915:0047,0915:004B,0915:0000,26,分析运算符(P.103 ,也称为数值返回运算符) 在源程序中,只对存储器进行操作,读取存储器的属性。,(1)SEG 运算符求取某存储器单元的段地址。 例:MOV AX,SEG NUM,(2)OFFSET 运算符 求取某存储器单元的偏移地址。 例:MOV AX,OFFSET NUM,(3)TYPE 运算符求取某存储器单元的类型属性。 例:MOV BL,TYPE NUM,属性类型,属性值,变 量,字节 01H,字 02H,双字 04H,四字 08H,十字 0AH,27,举例:,28,(4)LENGTH 运算符求某存储器/存储器数组的长度(P104) LENGTH运算符返回一个与存储器地址操作数相联系的单元数(所定义的基本单元的个数)。 注意: 要用LENGTH返回的存储区必须用DUP()来定义,否则返回值为1。 分析运算符SIZE返回一个为存储器地址操作数所分配的字节数。 一般来说,若一个存储单元操作数X,则 size X = (length X)(type X),(5)SIZE 运算符求某存储器/存储器数组的长度。,29,30,合成运算符,(1)PTR运算符(P.104) 格式: 类型 PTR 变量/标号/存储器,变量/存储器,类型,标号,BYTE (字节) WORD (字) DWORD(双字),NEAR(短调用) FAR (长调用),PTR举例,NUM1 DB 20H DUP(?) NUM2 DW 10H DUP(0),MOV AX,WORD PTR NUM1 MOV BYTE PTR NUM2,BL,临时修改操作数的属性,并不分配存储器,31,(2)THIS属性运算符伪指令 (P106),为当前存储单元定义一指定变量的类型,并不分配存储空间 段地址和段内偏移是汇编时的当前值,格式:变量/标号 EQU THIS 类型,例: WBUFFER1 EQU THIS WORD BUFFER1 DB 100 DUP(0),字节操作采用BUFFER1 ,字操作采用WBBUFFER1,合成运算符,32,4.3.3 段定义语句 (P106),因8086/8088 CPU的存储器是分段的,这就需要有段定义语句。 与段有关的伪指令有: SEGMENT、ENDS、ASSUME 段定义伪指令的格式如下: 段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS 例:MY_SEG SEGMENT PARA AT 1A2BH,33,段定位 (P109),表示对逻辑段起始边界的选择,可为: PAGE 段从一个页边界开始 (XXX00H, 256Bytes/Page) PARA 段节边界16倍数地址开始(XXXX0H) DWORD 段从一个4倍数地址开始 WORD 段从一个偶地址开始 BYTE 段可以从任意单元开始 完整段定义伪指令的默认定位属性是PARA MY_SEG SEGMENT PARA AT 1A2BH 段的起始边界为16倍数地址开始,段地址为1A2BH,34,成对出现 前面的段名一致 二者之间的部分 对数据段、附加段及堆栈段,一般是符号、变量定义等伪指令。 对于代码段则是指令及伪指令。 段和段寄存器的关系,可由ASSUME语句来实现,SEGMENT 和 ENDS,35,设定段寄存器伪指令ASSUME,ASSUME 段寄存器名: 段名 ,段寄存器名:段名,.,ASSUME 伪指令应放在可执行程序开始位置的前面,36,ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。 将段基址装入段寄存器 MOV AX,DATA MOV DS,AX MOV ES,AX 注意:代码段不需要用户装,由初始化程序装入,由程序员把段地址装入段寄存器(称为段初始化),37,例:,CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA /段初始化 MOV DS,AX MOV ES,AX LEA SI,SUM CODE ENDS END START,38,ORG(origin),规定了段内的起始地址。一般格式: ORG 表达式 此语句指定了段内在它以后的程序或数据块存放的起始地址,即以语句中的表达式的值作为起始地址,连续存放,除非遇到一个新的ORG语句 MY_SEG SEGMENT AT 1A2BH ORG 0003H; /段内从偏移量0003H开始 MY_SEG ENDS,伪指令ORG(origin),39,4.3.4 过程定义伪指令 (P112),格式: 过程名 PROC NEAR 或 过程名 PROC FAR RET ;过程返回 过程名 ENDP ;过程结束 调用一个过程的格式为: CALL 过程名,过程是程序的一部分,它们可被程序调用。每次可以调用一个过程。当过程中的指令执行完后,控制返回调用它的地方。,40,4.5.7 宏命令伪指令 (P136),用宏指令名来代替一个程序段,格式: 宏命令名 MACRO 形式参数,. (宏定义体) ENDM,41,例4-6 两个数之和的宏定义和宏调用。 宏定义为: DADD MACRO X,Y,Z MOV AX,X ADD AX,Y MOV Z,AX ENDM,X、Y、Z是形式参数。调用宏DADD:,DADD DATA1,DATA2,SUM,DATA1,DATA2,SUM是实际参数,42,上述宏命令经汇编后展开的指令相当于源程序: MOV AX,DATA1 ADD AX,DATA2 MOV SUM,AX,宏调用与过程调用类似, 其差别是:, 宏命令伪指令由宏汇编程序在汇编过理中进行替换处理; 而过程调用指令CALL和返回指令RET则是CPU指令, 需进行入栈和出栈处理,宏指令与过程都可以简化编程,43,4.3.5 结束语句 (P113),格式为: END 表达式通常是程序第一条指令的标号,每一个结束语句都与某个开始语句成对出现: SEGMENT和ENDS,PROC和ENDP,MACRO和ENDM 唯一的例外就是END语句,它标志着整个源程序的结束,它告诉汇编程序,没有更多的指令要汇编了。,44, 一个完整的用汇编语言编写的源程序组成是: 指令性语句: 可执行指令 指示性语句: 对符号定义、分配存储单元、分段等。 一个完整的程序至少应该包含三种段: 源程序行组成的代码段, 堆栈操作所需要的堆栈段 存放数据的数据段。,45,DATA SEGMENT . DATA ENDS STACK SEGMENT STACK STACK . STACK ENDS CODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODE START: CODE ENDS END START,汇编源程序结构完整的段定义,表示是堆栈段,且给了一个名字 “STACK”,自动进行堆栈段的初始 化,即段基值SS,且自动为SP初始化,46,分段结构,stack SEGMENT stack stack DB 100 DUP(?) stack ENDS data SEGMENT szhello DB Hello world, 0dh,0ah,$ data ENDS,code SEGMENT ASSUME CS:code,DS:data,SS:stack start:MOV AX,data MOV DS,AX MOV AH,9 MOV DX,OFFSET szhello INT 21h MOV AH,4ch INT 21h code ENDS END start,47,4.5.6 DOS系统功能调用,系统软件中提供的功能调用 D0S 功能调用(也称高级调用) BI0S 功能调用(也叫低级调用) 调用系统服务程序 软中断指令INT n D0S系统功能调用都是用软中断指令INT 21H来实现的,48,DOS中断调用简介, 中断调用DOS功能格式, 入口寄存器与参数赋值, AH功能号, INT 21H (中断类型号 21H的中断功能为请求DOS功能调用), DOS中断功能举例,01H,02H,09H,0AH,键盘输入字符,显示字符,显示字符串,键盘输入字符串,AL=输入字符,DL=输出字符,DX=缓冲区首地址,DX=缓冲区首地址,25H,置中断向量,AL=中断类型号 DS:DX=入口地址,35H,取中断向量,AL=中断类型号,ES:DX=入口地址,4CH,返回DOS,49,BIOS中断调用简介, 中断调用BIOS功能格式, 入口寄存器与参数赋值, INT 中断类型号, BIOS中断功能举例,02H,01H,02H,设置光标位置,发送一字符,接收一字符,AL=字符的ASCII DX=串口代码(0,1),DX=串口代码(0,1),08H,取当前驱动器 参数,DL=驱动器号 (80H和81H)硬盘, AH功能号,BH=0(图形方式) DH:DL=行:列,10H,00H,读当前时钟,CX=时钟高字DX=时钟低字,1AH,AL=接收的ASCII,14H,13H,DL=驱动器数 DH=最大磁头号 CX=扇区数目10位,0AH,显示字符,AL=显示字符 BX=0001(色彩等),50,1. DOS键盘功能调用,(1) 单字符输入并回显在屏幕上 入口参数:AH=01 ;功能调用号 返回参数:AL=输入字符的ASCII码 中断号: 21H 格式:MOV AH , 1 INT 21H,51,(2) 输入字符串 将键盘输入的字符串存入用户定义的缓冲区。 入口参数:AH=0AH DS:DX=输入字符串在内存中的首地址 中断号:21H,52,2.DOS显示功能调用,(1) 显示单个字符 入口参数:AH=02(或06) DL=字符(用ASCII码表示) 中断号: 21H 例:有如下程序段 MOV AH,02 MOV DL,41H INT 21H ;显示A,53,入口参数:AH=09 DS:DX=字符串地址 中断号: 21H 被显示的字符串必须以$结束,且所显示的内容不应出现非可见的ASCII码,否则产生不可预料的结果。,(2)显示字符串,54,DOS中断调用举例,例1:键盘输入字符,并显示。,键入字符时,结尾应为“$”,送缓冲区首地址,键入字符串,显示字符串,55,4.5 汇编语言程序设计基础,4.5.1 程序设计概述 1.编写汇编语言的步骤 (1)根据实际问题抽象出数学模型 (2)确定解决此数学模型的算法 (3)画出程序框图(流程图) (4)分配内存工作单元和寄存器 (5)根据框图编制程序 (6)上机调试,进行修改(汇编、链接),56,2.源程序的基本结构 顺序程序 分支程序 循环程序 子程序,57,3.汇编语言上机过程,汇编语言源程序(属性为.ASM) 从键盘输入(如在EDIT下) 汇编-经MASM的语法检查和翻译 若无语法错,形成目的文件(.OBJ) 链接-经LINK连接,形成可执行文件(.EXE) 运行-直接键入.EXE的名字部分 若运行结果不对,可用DEBUG调试,再编辑、汇编、连接、运行直至得到正确结果。,58,4.5.5 码转换程序设计,输入输出设备以ASCII码表示字符,所以,在CPU与I/O设备之间必须要进行码的转换。 实现码转换的方法有: 对于有些转换,利用CPU的算术和逻辑运算指令很容易实现,故可用软件实现转换; 某些更为复杂的转换,可以用查表来实现,但要求占用较大的内存空间; 对于某些转换,用硬件也是容易实现的,如BCD到七段显示之间转换的译码器等。,59,利用软件实现不同码之间的转换:十六进制到ASCII 例4-5 (P127页) 若有一个二进制数码串,要把每一个字节中的二进制转换为两位十六进制数的ASCII码,高4位的ASCII码放在地址高的单元。串中的第一个字节为串的长度(小于128)。 能实现这样转换的流程如图4-8所示。,60,61,name hex_change_to_ascii data segment l1 dw 2 string db 34h,98h l2 dw ? buffer db 2*2 dup(?) ; 转换好的ASCII data ends stack segment para stack stack db 100 dup(?) stack ends code segment assume cs:code, ds:data, es:data, ss:stack,62,start proc far begin: pus
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养老院跌倒老人应急预案(17篇)
- 云南省德宏傣族景颇族自治州2025-2026学年高三上学期开学定位监测历史试题(含答案)
- 山东省烟台市青华中学2024-2025学年八年级上学期第二次阶段测试语文试题
- 湖北省黄冈市2025年高三年级9月调研考试思想政治试题(含解析)
- 2025-2026学年第一学期9月(总第三次)模块诊断数学试题解析版
- 2025年可转债市场展望分析报告:供需矛盾估值支撑
- 巡检工安全培训课件
- 岩石的变化课件
- 输电电缆运检课件
- 小麻雀课件教学课件
- 学校反恐防恐工作领导小组及职责
- 《氢科学技术应用》课件-3-1 氢气的储存
- 新质生产力助推乡村振兴 (修正版)
- 外研版一年级上册新交际英语(2024)全册教案(单元整体教学设计)
- 2024新人教版英语七年级上单词默写表(小学部分)
- 建设工程监理安全资料(完整版)
- 高二上学期第一次月考物理试卷(附答题卷和答案)
- 全新中介和银行合作协议
- 一例感染性休克患者护理查房汇报
- 圆度、圆柱度测量仪校准规范
- 第五章牛顿运动定律之板块模型问题专题课件高一上学期物理
评论
0/150
提交评论