《汇编语言源程序》PPT课件.ppt

上传人:xian****812 文档编号:16086636 上传时间:2020-09-18 格式:PPT 页数:84 大小:210KB
返回 下载 相关 举报
《汇编语言源程序》PPT课件.ppt_第1页
第1页 / 共84页
《汇编语言源程序》PPT课件.ppt_第2页
第2页 / 共84页
《汇编语言源程序》PPT课件.ppt_第3页
第3页 / 共84页
点击查看更多>>
资源描述
1,5.4 汇编语言源程序,掌握: 汇编语言与汇编程序的概念; 汇编语言程序设计过程; 汇编语言源程序的结构框架; 常用伪指令及基本DOS功能模块的应用。,2,一、80X86新增指令特点:,增加对32位字长操作的指令; 加强各类指令功能; 增加了高级语言、控制保护、Cache 管理等指令。,3,二、汇编语言及汇编程序,计算机语言:,机器语言 汇编语言 高级语言,面向机器 的语言,机器语言,汇编语言,高级语言,4,汇编语言及汇编程序,汇编语言源程序 用助记符编写的程序,源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,5,汇编语言程序设计与执行过程,输入汇编语言源程序 源文件 .ASM 汇编(编译) 目标文件 .OBJ 链接 可执行文件 .EXE 调试 最终程序,6,汇编语言的程序结构,一个源程序必须用其编译器能够理解的语法进行编写,这些语法是指语句和程序结构必须遵循的规则。汇编语言也是如此。 首先,通过以下可在PC DOS环境下运行的汇编语言源程序实例,初步认识标准的汇编语言源程序的框架结构,并通过它来了解汇编语言的有关规定和格式。,7,例:打印输出字符串“THIS IS A SAMPLE PROGRAM”,;SAMPLE PROGRAM DISPLAY MESSAGE;注释行 STACK SEGMENT PARA STACK STACK;定义堆栈段 DB 1024 DUP(0);在存储器建立一个堆栈区 STACK ENDS;段结束 DATA SEGMENT ;定义数据段 MESSAGE DBTHIS IS A SAMPLE PROGRAM;存放数据 DB 0DH,0AH,$ DATA ENDS;段结束 CODE SEGMENT;代码段开始 ASSUME CS:CODE,DS:DATA,SS:STACK;将段名与段寄器联系起来,8,START PROC FAR;将过程定义为远过程 PUSH DS MOV AX,0 PUSH AX MOV AX,DATA;建立数据段的可寻址性 MOV DS,AX;初始化DS LEA BX,MESSAGE LOOP1: CMP BYTE PTRBX,$ JE LOOP2 MOV AH,5,标准序,以便返回DOS操作系统,9,MOV DL,BX INT 21H INC BX JMP LOOP1 LOOP2: RET START ENDP;过程结束 CODE ENDS;代码段结束 END START;整个程序汇编结束,10,汇编源程序的特点,一、由若干逻辑段组成,各逻辑段都有一个段名,由段定义语句(伪指令)来定义和说明。通常只有代码段是必不可少的。数据段或附加段用来在内存中建立一个适当容量的工作区用以存放常量和变量。堆栈段则在内存中建立一个堆栈区,以便中断和子程序调用及各模块间传递参数时使用。 某些简单的程序并不一定需要数据段和堆栈段,但对一些复杂的程序,堆栈段、数据段和代码段都可以不止一个。 通常把数据段放在代码段前面。,11,汇编源程序的特点(续),二、在代码段的起始处,用ASSUME命令说明各个段寄存器与逻辑段的关系。并由用户自己设置各段寄存器(除代码段外)初值 ,以建立这些逻辑段的可寻址性。 三、每个逻辑段由若干行汇编语句组成,每行只有一条语句且不能超过128个字符,但一条语句允许有后续行,最后均以加车作结束。整个源程序必须以END语句来结束,它通知汇编程序停止汇编。END后面的标号START表示该程序执行时的起始地址。,12,汇编源程序的特点(续),四、每一条汇编语句最多由4个字段组成,它们均按照一定的规则分别写在一条语句的4个区域,各区域之间用空格或TAB键隔开。 五、每个源程序在代码段中都必须含有返回到DOS操作系统的指令语句,以保证程序执行完毕后能自动回到DOS状态,以便继续向计算机键入命令。,13,源程序与PC DOS的接口,为保证用户程序执行完后自动返回DOS,应采取两项措施:一是将用程序中的主程序定义为FAR过程,其最后一条指令为RET;二是在主程序的开始处将PSP所在段的段地址DS(或ES)保存进栈,然后再将一个全0的字(PSP的段内偏移地址)压入堆栈。 PUSH DS MOV AX,0 PUSH AX,14,源程序与PC DOS的接口(续),还有一种返回DOS的非标准方法:不定义主程序为FAR过程并去掉标准序部分,只在代码段结束之前(即CODE ENDS之前)增加两句: MOV AH,4CH INT 21H,15,汇编语言的语句格式,语句是汇编语言源程序的基本组成单位,源程序是一个语句序列。语句序列中的每个语句规定了一个基本操作要求,而语句序列则完成某个特定的操作任务。,16,语句的种类,在80X86/Pentium汇编语言中,有三种基本语句:指令语句、伪指令语句和宏指令语句。 指令语句: 对应于CPU指令系统中的一条指令,为可执行语句。汇编程序将为之产生一对应的机器目标代码。 如:指令语句MOV DS,AX ;机器代码为8EH和D8H,17,语句的种类(续),伪指令语句 CPU不执行的语句,只是汇编时给汇编程序提供汇编信息,如定义符号、分配存储单元、将程序分段等。它本身不产生目标代码,所以是指示性语句。 如伪指令语句SEGMENT/ENDS;,18,语句的种类(续),宏指令语句 是以某个宏名字定义的一段指令序列。汇编时,凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。,19,汇编语言的语句格式,指令性语句 由CPU执行的指令 语句格式: 标号: 前缀 助记符 操作数,操作数 ;注释,指令的符号地址,标号后要有冒号,操作码,注释前加分号,20,汇编语言的语句格式,指示性语句 : CPU不执行的指令,不生成目标代码; 由汇编程序执行,用于分配内存空间、定义变量、指示程序开始和结束等。 指令格式:,名字 伪指令助记符 操作数 ,操作数, ;注释,变量的符号地址其后不加冒号,指示性语句中至少有一个操作数,21,汇编语言的语句格式(续),其中,方括号中的内容为可选部分,操作数部分或是0、1操作数,或是由逗号隔开的多个操作数。 (1)标号和名字:标号和名字分别是给指令单元和伪指令起的符号名称,用符号汇编语言规定的标识符来表示。标号后面必须有冒号,名字后面没有。 标号和名字的选择有一些限制。首先,它们必须符号汇编语言的标识符定义,即以字母开头,由字母(AZ或az,汇编程序不区分大小写)、数字及部分特殊字符(?、$和下划线_等)组成的字符串表示,字符串长度不能超过31个。此外,标识符不能是汇编言中有特定意义的保留字。,22,汇编语言的语句格式(续),(2)助记符和定义符 助记符和定义符分别用于规定指令语句的操作性质和伪指令语句的伪操作功能,这部分是语句中唯一不可缺省的。 (3)操作数 指令语句中的操作数提供该指令的操作对象,并说明要处理的数据存放在什么位置以及如何访问它。 (4)注释 注释由分号“;”开始,用来对语句的功能加以说明,它们构成了源程序的编程文档,使程序更容易被理解和阅读。,23,操作数,常量 数值或字符、字符串 寄存器 存储器单元 变量或标号 表达式 可包括各种运算符,24,常量,在汇编时已经确定其值且程序运行期间不变化的量为常量,如语句中的立即数或端口地址等。 这些常量的形式各不相同,常用的有二、十、八或十六进制的整型数值常量、字符串常量和已赋值的常标识符。 在汇编语言源程序中,常用十六进制来表示数据和地址。,25,变量,代表内存中的数据区,程序中视为存储器操作数 变量的三种属性: 段 值 变量所在段的段地址 偏移量 变量单元地址与段首地址之 间的位移量。 类 型 字节型(BYTE)、字型(WORD)、双字型(DWORD)、四字和十字节5种,26,表达式操作数,表达式操作数由各种操作数、运算符和操作符组成。 汇编语言中的两类表达式: 数值表达式:由数值常量、字符串常量或符号常量等与算术、逻辑或关系运算符连接而成。 地址表达式:由常量、变量、标号、寄存器的内容以及一些运算符组成。其值表示存储器地址,一般都是段内的偏移地址。地址表达式主要用来表示指令语句中的操作数。,27,三、基本伪指令,数据定义伪指令 符号定义伪指令 段定义伪指令 设定段寄存器伪指令 结束伪指令 *过程定义伪指令 *宏命令伪指令,28,数据定义伪指令,数据定义语句用于定义变量。它指定变量的类型和名称,并为变量分配存储单元。 格式: 变量名 伪指令助记符 操作数, ;注释 其中,变量名是可选的;操作数是赋给变量的初值,多个相同类型的变量可在一条语句中定义。 经过定义的变量名有三个属性:数据类型、偏移量(可用OFFSET获得)和段基址(可用SEG获得)。若某个变量所表示的是一个数组,则其类型属性为变量的单个元素所占用的字节数。,29,数据定义伪指令,伪指令助记符 DB 定义的变量为字节型 DW 定义的变量为字类型(双字节) DD 定义的变量为双字型(4字节) DQ 定义的变量为4字型(8字节) DT 定义的变量为10字节型,30,数据定义伪指令,DATA1 DB 11H,22H,33H,44H DATA2 DW 11H,22H,3344H DATA3 DD 11H*2,22H,33445566H,考虑以上变量在内存中的存放形式,31,数据定义伪指令,伪指令的性质决定所定义变量的属性; 定义字符串必须用DB伪指令 例: DATA1 DB ABCD,66H,A,B,C,D,41H,42H,43H,44H,66H,32,数据定义语句的具体形式和功能,(1)为数据项分配存储单元,用变量名作为该存储单元的名称。 例:X DB 25H;定义变量X为字节 Y DW 4124H;定义变量Y为字 汇编时汇编程序会把25H、4142H这些初值分别放入名为X、Y的存储单元中,33,数据定义语句的具体形式和功能,(2)预留若干字节(字、双字)存储单元但并不赋以具体的初值,以存放程序的运行结果。这时操作数部分可使用问号“?”。 例:A DB ? ;为变量A分配一个字节单元 B DB ? ;为变量B分配一个字单元,34,数据定义语句的具体形式和功能,(3)引入若干个用逗号分隔的操作数来定义一个表(数组)。 例:W_TABLE DW 1122H,3344H;定义一个字表 B_TABLE DB 1,2,4,8,16;定义一个字节表 其中字变量W_TABLE的内容为1122H,下一个字单元的内容为3344H。,35,数据定义语句的具体形式和功能,(4)用DB伪指令在内存中定义一个字符串。字符串中的每一个字符用它的ASCII码值来表示,为一个字节,所以字符串的定义必须用DB命令。 例如:MESSAGE DB HELLO 注意:当字符串的长度不超过两个字符时,也可用DW伪指令来定义。 例:STRING1 DB AB STRING1 DW AB STRING1 DW AB,CD,36,重复操作符,为一个数据区的各单元设置相同的初值 格式: 变量名 伪指令助记符 n DUP(初值,) 例: BW 20 DUP(0) DB 3 DUP(22H,11H,?),随机数,37,分析操作符与合成操作符,作为存储器操作数的标号或变量都有段、偏移量和类型三种属性。在程序设计中,有时需要随时查询、调用或修改这些属性,以满足不同的访问要求,这些操作由分析和合成操作符来完成。,38,分析操作符,分析操作符作用于存储器操作数时返回它们的属性值。这些操作符是:SEG、OFFSET、TYPE、SIZE、LENGTH等。 分析操作符的使用格式:操作符 标号或变量 SEG和OFFSET操作符 SEG和OFFSET分别用以返回标号或变量的段地址和偏移地址。,39,分析操作符,TYPE、LENGTH、SIZE操作符 TYPE操作符返回一个数字值,表示存储器操作数的类型。 LENGTH操作符返回变量用DUP重复定义的数据项总数。 SIZE操作符则返回TYPE和LENGTH的乘积,表示为变量所分配的字节存储单元总数。 注意: 要用LENGTH操作符返回的存储区必须用DUP()来定义,否则返回1.,40,合成操作符,PTR操作符 PTR用来临时指定或修改存储器操作数的类型属性(保持原有的段属性和偏移地址属性),如果这些变量或标号已有定义,则原定义的类型 属性不变。 使用格式:类型 PTR 标号或变量 其中,类型可以是BYTE、WORD、DWORD、NEAR或FAR,它们仅在当前所在的指令中有效。,41,合成操作符(续),LABEL操作符 LABEL操作符为当前存储单元定义个指定类型的标号或变量。它常用于定义一个数据块或标号,使它们具有多重名字或属性。 使用格式:标号或变量名 LABLE 类型 例:WBYTE LABEL WORD,42,合成操作符(续),THIS操作符 THIS操作符与EQU配合使用,具有LABEL操作符的同样作用。 使用格式:标号或变量名 EQU THIS 类型 例:BWORD EQU THIS BYTE,43,符号定义伪指令,格式: 符号名 EQU表达式 操作: 用符号名取代后边的表达式,不可重新定义,即在同一源程序中,用EQU定义过的符号名不能再赋予不同的值。 例: CONSTANT EQU100;常量赋予符号名 VAR EQU 30H+99H,EQU说明的表达式不占用内存空间,44,符号定义伪指令,等号语句 格式:符号表达式 此语句的功能与EQU类似,唯一区别是能对符号进行再定义。 例:EMP=60 EMP=EMP+1 EMP=123*4,45,段定义伪指令,说明逻辑段的起始和结束; 说明不同程序模块中同类逻辑段之间的联系形态,46,段定义伪指令,段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS,说明逻辑段的起点,说明不同模块中同名段的组和连接方式,47,段定义伪指令SEGMENT/ENDS,格式: 段名 SEGMENT定义类型组合类型类别名 (段体) 段名 ENDS 功能:指出段名及段的各种属性,并表示段的开始和结束位置。 段名是用户定义的标识符,是识别段的标志,用来指示汇编程序为该段分配的存储器起始位置,包含段地址和段内偏移量两个属性。,48,定义类型,汇编程序对源程序汇编后生成的目标代码文件(.OBJ),其中的段地址和偏移量都未最后确定,还需要用链接程序(LINK)把各个模块连接起来。定位类型参数用于告诉LINK程序,链接时本段首地址的边界定位方式。定位有四种类型: PARA(节):表示段的起始地址必须为16的倍数(XXXX0H),若语句中没有给出定位类型,则默认为PARA。,49,定义类型,PAGE(页):表示段的起始地址必须为256的倍数(XXX00H),也就是页的起点上。 WORD(字):表示段的起始地址必须为偶数,它最适合于安排类型为字的数据段。 BYTE(字节):表示该段可以从任意地址开始。,50,组合类型,一个汇编语言源程序往往有许多模块组成,而每一个模块常常又有自己的数据段、代码段和堆栈段。组合类型用于告诉LINK程序,多个模块链接时本段与其他模块中同名段的组合链接关系。组合类型共有六种。 NONE:本段与其他同名段无组合关系,并有自己的段起始地址。若语句中没有指明组合类型,则默认为NONE。,51,组合类型,PUBLIC:在满足定位类型的前提下,LINK程序将其与其他模块中说明为PUBLIC的同名段邻接在一起,共用一个段地址。 STACK:与PUBLIC同样处理,只是链接后的段作为堆栈段。 COMMON:各模块中由COMMON方式说明的同名段得叠履盖,有着相同的起始地址。段的长度邓决于最长的COMMON段的长度。段的内容为所链接的最后一个模块中COMMON段的内容以及没有覆盖到的前面的COMMON段的内容。,52,段寄存器说明伪指令ASSUME,格式:ASSUME 段寄存器:段名,段寄存器:段名, ASSUME伪指令一般出现在代码段中SEGMENT伪指令的后面,它设定特定的段寄存器指向特定的段,说明源程序中定义的段应由哪个段寄存器去寻址。 但是,ASSUME并未真正将段地址装入相应的段寄存器,段寄存器(CS除外)的初值设定还要由程序中的MOV指令来完成。,53,指定地址伪指令ORG,格式1:ORG 表达式 格式2:ORG $+表达式 功能:ORG伪指令用来强行指定地址计数器的当前值,以改变段内在它以后的代码或数据块存放的偏移地址。 格式1直接将表达式的值送入地址计数器。格式2将汇编ORG语句前地址计数器的现值$加上表达式后送入地址计数器。,54,例,DATA SEGMENT ORG 10H;在数据段10H偏移地址处开始存放20H,30H X DB 20H,30H ORG $+5 Y DB 40H,50H,55,段定义伪指令例,DATA SEGMENT MEM1 DB 11H,22H MEM2 DW 1234H DATA ENDS,56,结束伪指令,表示源程序结束 格式: END 标号,57,一个完整源程序结构例,DSEG SEGMENT DATA1 DB 1,2, DATA2 DW 1234H DSEG ENDS ESEG SEGMENT DB 20 DUP(?) ESEG ENDS SSEG SEGMENT DB 200 DUP(?) SSEG ENDS,58,一个完整源程序结构例,CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG, ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX CSEG ENDS END START,源程序 代码,59,过程定义伪指令,用于定义一个过程体 格式: 过程名 PROC NEAR / FAR RET 过程名 ENDP,过程入口的符号地址,60,宏命令伪指令,宏命令源程序中由汇编程序识别的具有 独立功能的一段程序代码 格式: 宏命令名 MACRO ENDM,宏体,61,四、DOS功能模块,用 INT 21H 软中断指令,可调用包含多个子功能的功能包; 各子功能采用功能号来区分; 功能包括:设备管理、目录管理、文件管 理等。,62,DOS功能子程序的基本方法,BIOS/DOS的每个功能子程序都对应着一个子程序文件。使用这些子程序时,用户不必过问其内部结构和细节,也不必关心硬件I/O接口的特性,只要直接用一条软件中断指令INT n即可(n为中断向量号),这称为中断调用。一般,对功能子程序的调用需要经过三个步骤: 子程序入口参数关规定寄存器 子程序编号送AH寄存器 发软件中断命令:INT n,63,其中软中断命令INT n中的n值因子程序不同而可能不同,比如ROM BIOS的软中断类型号有n=51FH,DOS的软中断类型号有n20H,21H,232AH,2EH,2FH,33H和67H等几种情况。 有的软中断命令只对应一个子程序,这时的功能调用无需上列步骤2; 有的软中断则对应很多子程序,这时的功能调用就必须指明子程序号。,64,DOS功能模块调用格式,调用格式: MOV AH,功能号 INT 21H,65,常用子功能,从键盘输入单字符并显示; 从键盘输入字符串并显示; 在屏幕上显示单字符; 在屏幕上显示字符串。,66,从键盘输入单字符并显示,01号功能调用等待从键盘输入一个字符,调用返回时该字符的ASCII码值送入AL寄存器,同时将该字符显示在屏幕上。 入口参数:无 调用方法: MOV AH,01 INT 21H 输入的字符在AL中,67,单字符输入例,GET_KEY: MOVAH,1 INT21H CMPAL,Y JZ YES CMPAL,N JZ NO JNZGET_KEY YES: NO: ,交互式应 答程序,68,从键盘输入字符串,AH 功能号OAH DS:DX 字符串在内存中的存放地址 INT 21H 从键盘接收字后串后存入以DS:DX为首地址的内存缓冲区,同时显示该字符串,输入过程以回车键结束。 使用时,要求事先在数据段定义一个输入缓冲区,其中第一个字节指出缓冲区能容纳的字符个数,不能为0.第二个字节保留用以存放实际输入的字符个数。从第三个字节开始存放从键盘上接收的字符。,69,定义字符缓冲区,用户自定义缓冲区格式:,0DH,N1,N2,整个缓冲区,最大键入字符数,实际键入字符数,70,输入字符串程序段,DAT1 DB 20,?,20 DUP(?) LEA DX,DAT1 MOV AH,0AH INT 21H,71,输入缓冲区,14H,?,20个字节,定义后的输入缓冲区初始状态:,72,单字符显示输出,AH 功能号O2H或05H DL 待输出字符 INT 21H 功能:将寄存器DL中的单个字符输出到显示器或打印机。 02H为显示器、05H为打印机,73,单字符显示输出例,MOVAH,02 MOVDL,41H;A的ASCII值 INT21H 执行结果:屏幕显示字符 A,74,字符串输出显示,入口参数:DS:DX指向内存中一个以$结尾的字符串(不包括$)输出到显示器。 AH 功能号O9H DS:DX 待输出字符串的偏移地址 INT 21H,75,字符串输出显示例,DATA SEGMENT MESS1 DB Input String: 0DH,0AH,$ DATA ENDS CODE SEGMENT MOVAH,09 MOVDX,OFFSET MESS1 INT21H ,被显示的字符串必须以$结束,76,练习一,写一个把压缩存放的BCD码,转换成对应的ASCII码的程序。 8421BCD码与ASCII码的转换关系很简单,在非压缩的BCD码加上30H就得到相应的ASCII码。 DSEG SEGMENT BCD DB 86H ASCII DB 2 DUP(0) DSEG ENDS,77,CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX ;定义数据段的可寻址性 MOV AL,BCD AND AL,0FH ADD AL,30H MOV ASCII+1,AL,78,MOV AL,BCD MOV CL,4 SHR AL,CL ADD AL,30H MOV ASCII,AL MOV AH,4CH;返回DOS,非标准的方式 INT 21H CSEG ENDS END START,79,练习二,设有三个单字节无符号数存放在BUFFER开始的缓冲区中,写一段程序将它们按大到小排序。 实现在排序的方法有很多种,我采用交换法,先找出最大的那个数,然后再得剩下两个最大的那个。为了方便,先把要排序的三个数取到寄存器中。 DATA SEGMENT BUFFER DB 23,234,123 DATA ENDS,80,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFFER MOV AL,SI MOV BL,SI+1 MOV CL,SI+2,81,CMP AL,BL JAE NEXT1 XCHG AL,BL NEXT1:CMP AL,CL JAE NEXT2 XCHG AL,CL NEXT2:CMP BL,CL JAE NEXT3 XCHG BL,CL,82,NEXT3:MOV SI,AL MOV SI+1,BL MOV SI+2,CL MOV AH,4CH INT 21H CODE ENDS END START,83,结束语,了解指令性语句及指示性语句的格式; 了解操作数的类型及变量的属性; 掌握8086CPU指令系统的寻址方式; 掌握8086CPU指令系统6大类指令的功能; 掌握基本伪指令及主要DOS功能模块的应用; 掌握汇编语言源程序的结构框架; 理解汇编语言程序设计的一般过程; 具备编写简单汇编语言源程序的能力。,84,作业:,5.2 5.4 5.7 5.8 5.9 5.11 5.15 5.16 5.19,谢谢大家!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!