X86汇编语言程序设计.ppt_第1页
X86汇编语言程序设计.ppt_第2页
X86汇编语言程序设计.ppt_第3页
X86汇编语言程序设计.ppt_第4页
X86汇编语言程序设计.ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

第4章 80X86汇编语言程序设计,本章的内容有: MASM宏汇编语句结构以及开发过程 MASM汇编语言表达式、运算符 程序段的定义和属性 复杂数据结构 宏汇编 基本汇编语言程序设计 子程序设计 高级汇编语言程序设计,DATA SEGMENT W1 DB 00H,11H,22H,33H,$ W2 DW 4142H,0A0BH DATA ENDS STACK1 SEGMENT DW 100H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, SS:STACK1 START: MOV AX,DATA MOV DS,AX CODE ENDS END START,4.1 MASM宏汇编语句结构以及开发过程,4.1.1 汇编语言程序的语句类型和格式 1语句的类型 硬指令语句(指令性语句) 是指能产生目标代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU指令组成。 伪指令语句(指示性语句) 是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。 定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。所以伪指令语句是汇编程序在汇编时用的,不产生机器码。 宏指令语句 它是一个指令序列,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。,指令性语句是计算机可执行的,而伪指令不能执行,用来定义变量,分配存储单元,指示程序开始和结束等。 这两种语句的差别: 在形式上:带不带冒号,是否可转向它. 在本质上:汇编时能否形成对应的机器码.,2语句的格式 汇编语言源程序由语句序列构成。 汇编语言源程序中的每条语句一般占一行,每行不超过132个字符(MASM 6.0开始可以是512个字符), (1)执行性语句 标号:硬指令助记符 操作数,操作数;注释 (2)说明性语句 名字 伪指令助记符 参数,参数 ;注释,汇编语言中,用来标识某种数据结构名称 (如变量、标号、过程名等) 的有效字符序列称为标识符。 MASM 的标识符组成规则如下: (1) 标识符有效长度131个字符; (2) 标识符由字母 (大写或小写的英文字母),数字或 某些特殊字符如 $ : ? 等组成 (3) 第一个字符必须是字母,不允许用数字开头,也 不允许用特殊符号单独作为标识符; (4) 标识符不能使用系统专用字,如 AX (寄存器名) ,MOV (助记符) 等。,4.1.2 汇编语言的程序格式,在实地址模式和虚拟8086模式下,按照逻辑段组织程序,具有代码段、数据段、附加段和堆栈段。 一个汇编语言源程序可以包含若干个代码段、数据段、堆栈段或附加段,段与段之间的顺序可随意排列。 需独立运行的程序必须包含一个代码段,并指示程序执行的起始位置,一个程序只有一个起始位置。 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。,两种格式书写 第一种格式是从MASM 5.0开始支持的简化段定义格式(但其中的两个指令 .STARTUP和 .EXIT是6.0版本才引入的)。 第二种格式是MASM 5.0以前版本就具有的完整段定义格式。,例4.1 简化段定义的源程序格式 STACK ;定义堆栈段 DATA ;定义数据段 STRING DB Hello,Everybody !,0DH,0AH,$ ;在数据段定义要显示的字符串 CODE ;定义代码段 STARTUP ;说明程序起始位置,并建立DS、SS内容(注1) MOV DX,OFFSET STRING ;指定字符串在数据段的偏移地址 MOV AH,9 INT 21H ;利用DOS功能调用显示信息 EXIT 0 ;程序结束点,返回DOS(注2) END ;汇编结束(注3),DATA SEGMENT W1 DB 00H,11H,22H,33H,$ W2 DW 4142H,0A0BH DATA ENDS STACK1 SEGMENT DW 100H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, SS:STACK1 START: MOV AX,DATA MOV DS,AX CODE ENDS END START,完整段定义格式,4.1.3 汇编语言程序的开发过程,4.2 MASM汇编语言表达式、运算符,4.2.1 常量、运算符及表达式 1.常量 (1)数字常量 二进制常量,以B结尾 八进制常量,以Q结尾 十进制常量,以D结尾或省略 十六进制常量,以H结尾,如0A8C6H,(2)字符串常量 用单引号引起来的字符或字符串也代表常数。例如: A ;汇编时被翻译成对应的ASCII码41H BCDE ;汇编时被翻译成对应的ASCII码42H,43H, ;44H,45H,(3)符号常量 利用一个标识符表达的一个数值。常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。 MASM提供等价机制,用来为常量定义符号名,符号定义伪指令有“EQU”和“”。,2运算符,3、运算符的优先级,4.表达式 表达式是常量、寄存器、标号、变量与一些运算符组合的序列,分数字表达式和地址表达式两种。汇编时按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。,(1)数字表达式(number expression) 数字表达式一般是指由运算符连接的各种常量所构成的表达式。 例如:MOV DX ,(6*A-B)/2 源操作数(6*A-B)/2是一个表达式。若设变量A的值为1,变量B的值为2,则此表达式的值为(6*1-2)/22,是一个数字结果,此表达式是数字表达式。,(2)地址表达式(address expressions) 地址表达式的结果是一个存储单元的地址。 例如,MOV AX, ES: BX+SI+1000H 其中,BX+SI+1000H为地址表达式,结果是一个存储单元的地址。,4.2.2 变量及其属性 1变量定义伪指令 变量是存储器中某个数据区的名字,在指令中可以作为存储器操作数。 变量定义伪指令可为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。该类伪指令是最经常使用的伪指令。 格式: 变量名 伪指令 初值表,说明: 变量名是用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。 初值表是用逗号分隔的参数,主要由数值常量,表达式或 ?、DUP组成。其中?表示初值不确定,即未赋初值;重复初值可以用DUP进行定义。DUP的格式为: 重复次数 DUP(重复参数),(1)定义字节单元伪指令DB 功能:定义变量的类型为BYTE,给变量分配字节或字节串。 要求:初值表中每个数据一定是字节量。例如: DATA SEGMENT ;数据段 X DB a, 5 DB 2 DUP(100),? Y DB ABC DATA ENDS,(2)定义字单元伪指令DW 功能:定义变量的类型为WORD,给变量分配一个或 多个字单元,并可以将它们初始化为指定值。 要求:初值表中每个数据一定是字 (Word)。 (3)定义双字单元伪指令DD 功能:定义变量的类型为DWORD,用于分配一个或 多个双字单元,并将它们初始化为指定值。 要求:初值表中每个数据是一个32位的双字。,2 变量和标号的属性 变量、标号、段名及过程名都表示的是地址,那么,这些标号 和名字一经定义便具有以下三种属性: 段值:标号和名字对应存储单元所在段的段地址。 偏移值:标号和名字对应存储单元所在段的段内偏移地址。 类型:标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是BYTE(字节),WORD(字)和DWORD(双字)等。,4.3 程序段的定义和属性,1. 段定义伪指令SEGMENT/ENDS 2. 指定伪指令ASSUME 3. 源程序结束伪指令,1. 段定义伪指令SEGMENT/ENDS,格式:段名 SEGMENT 定位 组合 字长 类别 (段体) ;语句序列 段名 ENDS 伪指令名 SEGMENT 和 ENDS 是本语句的关键 字,不可以默认,并且总是成对出现的。语句中段名 是必选项,定位类型、组合类型、字长选择、分类名 为可选项。 段名是程序员为该段起的名字,不能省略,用来指 出为该段分配的存储区的段地址,一个段开始与结尾 用的段名应一致。,2. 指定伪指令ASSUME,格式:ASSUME 段寄存器:段名 ,段寄存 器:段名, 功能:说明源程序中定义的段由哪个段寄存器 去寻址。段寄存器可以是 CS,SS,DS、ES 注意:格式中,ASSUME 是伪指令名,是语 言中的关键字,不可默认。段寄存器名后面必 须有冒号,如果分配的段名不止一个,则应用 逗号分开。,下面是一段源程序: DATA SEGMENT W1 DB 00H,11H,22H,33H,$ W2 DW 4142H,0A0BH DATA ENDS STACK1 SEGMENT DW 100H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX CODE ENDS END START,问题:段寄存器的装入 ASSUME 语句只建立当前段和段寄存器之间的联系,但并不能将各段的段基值装入各个段寄存器。段基值的装入是用程序的办法,六个段寄存器的装入也不相同。除代码段 CS和堆栈段 SS 外,其他定义的段寄存器(DS或ES) 由用户在代码段起始处用指令进行段基址的装入。例如: MOV AX,DATA MOV DS,AX,3. 源程序结束伪指令,格式:END 表达式 功能:该语句标志整个程序的结束,是源程序的最后一条语句。表达式为程序入口指令的标号。 例如:END START,返回本节,4.6 基本汇编语言程序设计,汇编语言源程序主体(代码段)可以有顺序、分支、循环、子程序和宏等结构。 早期版本的汇编程序不直接支持结构化程序设计,可以用微处理器指令系统中的转移指令、循环指令、子程序调用及返回指令,实现程序的各种结构形式。,一 概述,1 汇编语言程序设计的一般步骤 2 流程图,返回本章首页,汇编语言程序设计的一般步骤,汇编语言程序设计一般有以下几个步骤: 1分析问题,确定算法 2绘制流程图 3根据流程图编制程序 4调试程序,返回本节,流程图,1流程图的概念 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示 (1)起止框:表示程序的开始和结束。,起止框,(2)判断框,(3)处理框,(4)调用框,(5)指向线,返回本节,二 顺序程序设计,例4.16 求两个数的平均值。这两个数分别放在X单元 和Y单元中,而平均值放在Z单元中。 DATA SEGMENT X DB 8CH Y DB 64H Z DB ? DATA ENDS,START:MOV AL,X ;AL8CH ADD AL,Y ;AL8CH+64H MOV AH,00H ;AH00H ADC AH,00H ;进位送AH MOV BL,2 ;除数2BL DIV BL ;AX除以BL的内容, ;商AL,余数AH MOV Z,AL ;结果送入Z单元,思考从键盘读入两个一位数(假设按下的肯定是数字键),编程序显示它们的乘积。,CODE SEGMENT ASSUME CS:CODE START:MOV AH,1 INT 21H MOV BL,AL MOV AH,1 INT 21H SUB AL,30H SUB BL,30H MUL BL ;积在AX中 MOV BL,10 DIV BL ADD AX,3030H,MOV BX,AX MOV DL,BL MOV AH,2 INT 21H ;输出十位数 MOV DL,BH MOV AH,2 INT 21H ;输出个位数 MOV AH,4CH INT 21H ;返回DOS CODE ENDS END START,三 分支程序设计,单分支IFTHEN 双分支IFTHENELSE 条件转移Jcc和无条件转移JMP指令用于实现程序的分支结构。 JMP指令仅实现了转移到指定位置, Jcc指令则可根据条件转移到指定位置或不转移而顺序执行后续指令序列。,单分支与双分支,1单分支结构,例4.18 计算AX中符号数绝对值的程序段。 CMP AX,0 JGE NONNEG ;分支条件:AX0 NEG AX ;条件不满足,负数, ;执行分支体进行求补 NONNEG:MOV RESULT,AX ;条件满足, ;为正数,保存结果,另一种方法: CMP AX,0 JL YESNEG ;分支条件:AX 0 JMP NONENG ;条件不满足,正数, ;转向保存结果 YESNEG:NEG AX ;条件满足,为负数, ;需要求补 NONNEG:MOV RESULT,AX ;保存结果 总结:选择分支条件不当,不仅多了一个JMP指令, 而且也容易出错。,2双分支结构,对于双分支程序,顺序执行的分支语句体1不会自动跳过分支语句体2,所以分支语句体1最后一定要有一条JMP指令跳过分支体2,即分支汇点处;否则将进入顺序分支语句体2而出现错误 。,例4.19 显示BX最高位的程序段。 SHL BX,1 ;BX最高位移入CF标志 JC ONE ;CF1,即最高位为1,转移 MOV DL,0 ;CF0,即最高位为0 ;DL0 JMP TWO ;一定要跳过另一个分支体 ONE:MOV DL,1 ;DL1 TWO:MOV AH,2 INT 21H ;显示,3分支程序设计,例4.20 判断方程AX2+BXC0是否有实根,若有实根则将字节变量TAG置1,否则置0。假设A、B、C均为字节变量,数据范围为128+127。 分析:二元一次方程有根的条件是:B24AC0。依据题意,首先计算出B2和4AC,然后比较两者大小,根据比较结果分别给TAG赋不同的值。,1 x 0 思考:符号函数 y = 0 x = 0 其中 x 为 8 位带符号数。 -1 x 0,分析:设 x 的值 ( x ) 放在数据段 XX 单元中,Y 的值 ( y ) 放在 YY 单元中。寄存器选用 AL 存放中间结果。程序流程图见右图。,DATA SEGMENT XX DB 45H YY DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,XX CMP Al,0 ;置标志位 JGE BIGR ;XO 转移 MOV Al,-1 ;-1 送 YY JMP JUS2 ;隔离 BIGR: JG JUS1 ;X0 转移 MOV AL,0 ;0 送 YY JMP JUS2 ;隔离 JUSl: MOV AL,1 ;1 送YY JUS2: MOV YY,AL MOV AH,4CH INT 21H CODE ENDS END START,四 循环程序设计,1循环结构 循环初始部分:开始循环准备必要的条件,如循环次数、循环体需要的初始值等。 循环体部分:是循环工作的主要部分,是为完成某种特定功能而设计的重复执行的程序段。 修改部分:对循环条件、相关信息(如计数器的值、操作数地址等)进行修改的程序段。 循环控制部分:判断循环条件是否成立,决定是否继续循环。,例:现将以AREA1为首地址的100个字节数据搬移到以AREA1为首地址的内存中去。,DATA SEGMENT AREA1 DB 100DUP(?) AREA2 DB 100DUP(?) DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 AGAIN:MOV AL,SI MOV DI,AL,INC SI INC DI LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START,补充 常用的DOS功能调用,DOS系统功能调用的方法一般可分

温馨提示

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

评论

0/150

提交评论