汇编语言的基本概念.ppt
第五章 汇编语言的基本概念,概 述汇编语言程序格式伪指令PC机常用系统功能介绍,汇编语言程序设计特点,汇编语言是一种用符号表示的、面向CPU指令系统的程序设计语言。汇编语言具有以下两个基本特点:可以更充分利用机器硬件的全部功能,发挥机器的长处;程序目标代码占用内存少,执行速度快,效率高,具有实时性;,汇编语言与高级语言,由于汇编的这种特点,汇编语言常用于编写计算机系统程序、实时通信程序和实时控制程序。但汇编语言程序依赖于机器硬件,其通用性和移植性都较差。相对于汇编语言,高级语言的编程方便快捷,通用性和移植性都较好,在一些涉及大量数据处理、人机界面等设计任务的应用程序中,采用高级语言编程更为合适。,从汇编源程序获得可执行程序的过程,为了能顺利完成汇编,用户必须为汇编程序提供一些额外的、与硬件有关的信息,如:程序使用的变量应分别存放在内存的哪个单元、堆栈应从内存的什么地址开始等等。,汇编语言源程序的一般结构分段式结构:数据段堆栈段代码段附加段,段,;段名1SEGMENT;一个段的开始语句1语句2 段名1ENDS;一个段的结束;段名2SEGMENT;另一个段的开始段名2ENDS;另一个段的结束;其它段;END;源代码结束,源程序的基本框架,汇编语言的上机过程,1.源程序的建立可用多种编辑程序建立源程序,但要求源程序用ASCII码存储,程序扩展名为.ASM。如源程序文件EXAMP.ASM2.汇编生成目标文件(.OBJ)C:MASM EXAMP3.连接生成DOS格式的可执行文件(.EXE 或.COM文件)C:LINK EXAMP,汇编语言程序格式,汇编语言中的语句语句是由各种符号(标记)及分隔符按照一定的规则组织起来的一个有序序列。标识符 操作符 操作数 注释有三种基本语句:,宏指令语句 汇编时进行宏代替,指令性语句 可译为指令机器码,指示性语句(伪指令)仅作源程序管理用,指令性语句:即执行性语句(指令),与机器码一一对应,表示某种确定操作,包括四部分:标号:指令操作码 操作数;注释 例:AGAN:ADD AX,CX;加法指示性语句:即说明性语句(伪指令),不对应机器码,只为汇编提供所需信息,由四部分组成:名字 伪指令 操作数;注释 例:SUMDB 64H;变量SUM的值是64H 宏指令:由伪指令定义的指令序列,包括宏定义、宏调用和宏扩展三部分,MASM汇编语句中的操作数,汇编语言中使用的操作数,可以是常数、寄存器、存储器、变量、标号或表达式。(1)常数固定值,无属性;,数字常量二进制数:以“B”结尾,如00001101B;八进制数:以“O”结尾,如725O;十六进制数:以“H”结尾,如0A12H;十进制数:以“D”结尾或无任何字母作结尾,如10D、10。,字符串常量字符串常量表示为包含在两个单引号之间的一连串ASCII字符。当单引号本身作为一个串元素时,需连写两个单引号。每个串元素的值定义为该元素所对应的1字节ASCII码值。Hello,this is a sample program!还可用符号定义伪指令定义成标识符,即符号常量H EQU Hello,this is a sample program!,(2)变量通常指存放在存储单元中的值。变量的三个属性:段属性:指变量所在段的段基值,此值必须在一个段寄存器中。偏移属性:指变量所在地址与所在段的段首地址之间的地址偏移字节数(段内偏移量)。类型属性:指变量中每个元素所包含的字节数,类型包括字节变量(BYTE)、字变量(WORD)及双字变量(DWORD)等,(3)标号指令性语句(可执行语句)所在地址的符号表示。标号的三个属性:段属性:指标号所在段的段基值,偏移属性:标号所在地址与所在段的段首址之间的偏移地址。类型属性:指在转移指令中标号可转移的距离,也称距离属性。有NEAR和FAR两种。,注意:标号通常作为转移指令或CALL指令的目标地址。,(4)表达式由常数、寄存器、变量、标号与运算符组合而成的运算式。运算式在汇编时由汇编程序计算出结果,再作为指令中的一个操作数参与指令的执行。MOV AL,2+3 汇编后变为 MOV AL,5,保留字,汇编源程序中标识符不能使用的字符串所有指令助记符:如MOV、ADD等。寄存器名:包括16位和8位寄存器。如AL、DH、AX、CS、TF等。宏汇编程序规定的所有伪指令助记符:如ASSUME、DB、DW、DD等。宏汇编程序规定的其他助记符:BYTE、DUP、EQ、SEG等。,MASM中运算符,6类运算符算术运算符、逻辑运算符、关系运算符分析运算符、属性修改运算符、其他运算符,算术运算符,算术运算符的功能+加法运算符-减法运算符*乘法运算符/除法运算符MOD 求余运算符SHL 左移运算符SHR 右移运算符,算术运算符,算术运算符的使用特点数值表达式中可使用所有算术运算符地址表达式仅使用+、-算术运算符算术运算符不影响标志位,例:完成80H+90H解:MOV AL,80H+90H;使用数值表达式;(AL)=10H、CF=不变 MOV AL,80H ADD AL,90H;使用加法指令;(AL)=10H、CF=1,关系运算符,关系运算符的功能,EQ 相等关系 NE 不相等关系 LT 小于关系 GT 大于关系 LE 小于或等于关系 GE 大于或等于关系,关系运算符,关系运算符的使用特点在两个性质相同的操作数之间进行大小关系比较若关系正确为真(T),全 1 操作数 若关系错误为假(F),全 0 操作数例:MOV AX,0A2H NE 02H;汇编后得到“MOV AX,0FFFFH”,分析运算符,分析运算符(数值返回运算符)的功能,SEG 符号地址段值属性返回符 OFFSET 符号地址偏移量值属性返回符 TYPE 符号地址中数据类型属性返回符 LENGTH DUP重复次数返回符 SIZE 变量总字节数返回符,分析运算符,对存储器地址进行运算将存储器地址的三个属性,即段、偏移量、类型分离出来。SEG取变量或标号所在段的段寄存器值 作为段基址,结果为16位值 格式:SEG 变量名或标号名OFFSET取变量或标号的段内偏移量,结果 为16位值 格式:OFFSET 变量名或标号名,TYPE取变量或标号的类型所占字节数 格式:TYPE 变量名或标号名 LENGTH取变量所含的数据元素个数,由DUP(重复操作符)定义数据个数时才有效。格式:LENGTH 变量 SIZE取分配给变量的字节个数,由DUP定义数据个数时才有效。格式:SIZE 变量,符号地址与逻辑址址,定义数据段 DATA 如下:从实际地址 02000H 开始存数据 即段地址为 0200H 段内偏移地址从 0000H 开始 DATA SEGMENT VAR1 DB 20,30 VAR2 DW 2000H,3000H VAR3 DD 22003300H DATA ENDS,段地址=0200H,0000H,0002H,0006H,VAR1,VAR2,VAR3,例,SEG 和 OFFSET 应用,MOV BX,SEG VAR1;(BX)=0200H MOV BX,SEG VAR2;(BX)=0200H MOV BX,SEG VAR3;(BX)=0200H MOV BX,OFFSET VAR1;(BX)=0000H MOV BX,OFFSET VAR2;(BX)=0002H MOV BX,OFFSET VAR3;(BX)=0006H,SEG 功能:返回符号地址的段逻辑值 OFFSET 功能:返回符号地址的偏移逻辑值,TYPE 的应用特点,返回变量数据类型所含的字节数量 MOV BL,TYPE VAR1;(BL)=1 MOV BL,TYPE VAR2;(BL)=2 MOV BL,TYPE VAR3;(BL)=4,LENGTH 和 SIZE 的应用特点,定义数据段 DATA SEGMENT VAR1 DB 100 DUP(?)VAR2 DW 100 DUP(?)DATA ENDS 指令功能 MOV BX,LENGTH VAR1;(BX)=100 MOV BX,LENGTH VAR2;(BX)=100 MOV BX,SIZE VAR1;(BX)=100 MOV BX,SIZE VAR2;(BX)=200,变量定义数据个数,变量定义数据字节数,属性修改运算符的功能,PTR 操作数重新定义类型运算符,属性修改运算符,属性修改运算符,PTR临时修改类型属性或强制说明操作数的类型。可用类型:BYTE、WORD、DWORD、NEAR、FAR等,例:数据段中定义了字变量VAR,则 MOV AL,VAR;错误,类型不匹配改为:MOV AX,VAR 或:MOV AL,BYTE PTR VAR,PTR 的应用特点(在 JMP 指令中的应用),段内间接近转移 CS不变、IP变 段间间接远转移 CS变、IP变,存储器中的 16 位值为段内 IP 目的地址 JMP WORD PTR BX JMP WORD PTR 2000H,存储器中的 32 位值为 CS:IP 目的地址 JMP DWORD PTR BX JMP DWORD PTR 2000H,PTR 的应用特点(在变量定义中的应用),定义数据段 代码段中使用,DATA SEGMENT VAR1 DB 20H,30HDATA ENDS,MOV AX,VAR1;错误,操作数类型不合MOV AX,WORD PTR VAR1;正确,返回字数据,伪指令和宏指令,段定义伪指令过程定义伪指令数据类型定义及存储器地址分配伪指令符号定义伪指令,1、段定义伪指令,1)、段定义语句 SEGMENT/ENDS用于对 DS、ES、SS、CS 段的定义,格式:段名 SEGMENT 定位选择 组合类型 类别 段名 ENDS,注意:ENDS必须与SEGMENT成对出现,且段名必须一致。,定位类型 段起始边界的确定PAGE、PARA、WORD、BYTEPAGE段起始地址最低8位为0PARA段起始地址最低4位为0WORD段起始地址最低位为0BYTE段起始地址为任意值,组合类型 各段间的关系为连接程序提供本段与其它段的关系信息AT表达式:把本段装在表达式的值所指定的段地址上,例:用组合类型中的AT表达式指定段基值,DATA SEGMENT AT 1234HARRAY DB 1,2,3 DB 4,5,6 RESULT DW?DATA ENDS,则 MOV AX,SEG ARRAY;AX=1234H MOV DS,AX;DS=1234H MOV SI,OFFSET ARRAY;SI=0000H,1、段定义伪指令,2)、段指示伪指令 ASSUME用来指示程序中定义的段与CPU中的各段寄存器之间的关系ASSUME 伪指令仅用在代码段首行,段名 SEGMENT 相关约定 ASSUME CS:段名,DS:段名,代码段内定义,指令集合段名 ENDS,例:程序分别定义了DA、CD、ST段,则如下语句ASSUME CS:CD,DS:DA,SS:STCD段为代码段;DA段为数据段;ST段为堆栈段。,注意:使用ASSUME伪指令,仅仅告诉汇编程序哪个段寄存器被设定指向哪一个段,并没有给各段寄存器装入实际的段基值。要使段寄存器真正指向指定的段,还必须通过指令性语句将段基值装入相应的段寄存器;但CS寄存器除外,CS值是由操作系统将程序装入内存时自动设定的。,例:CD SEGMENT ASSUME CS:CD,DS:DA,ES:DM,SS:ST;MOV AX,DA MOV DS,AX;为DS装入段基值,1、段定义伪指令,3)、程序结束伪指令 END格式:END 标号名指令中的标号名是该程序中第一条要执行的语句的标号名。标记汇编源程序结束。注意:END是伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只有一个END。,2、过程定义伪指令,1)、过程定义伪指令 PROC/ENDPPROC FAR、ENDP 远过程定义伪指令PROC NEAR、ENDP 近过程定义伪指令,过程名 PROC FAR(NEAR)过程指令集合 RET过程名 ENDP,注:过程定义必须在代码段内,过程名是由用户设定的标识符,可在程序中作标号使用,至少有一个RET 语句,程序其他地方可以用CALL指令调用这个过程。,例,COD1 SEGMENT ASSUME CS:COD1,;代码段中的其它语句(主程序)SUB1PROC FAR;名为SUB1的FAR过程开始 RET;返回SUB1ENDP;SUB1结束SUB2PROC;名为SUB2的NEAR过程开始 RET;返回SUB2ENDP;SUB2结束;可能定义的其它过程COD1 ENDS;代码段结束,3、数据定义及存储器分配伪指令,数据定义及存储器分配伪指令用于为数据项分配存储单元并预置初值。,DB 变量为字节数据类型(8位)DW 变量为字数据类型(16位)DD 变量为双字数据类型(32位)DQ 变量为 4 字数据类型(64位),格式:变量名 DB/DW/DD/DQ/DT,;注释,注意:变量名代表所定义变量的第一个单元的地址。,ONEDB 8;给变量ONE分配一个字节,并 预置初值为8TWODB?;字节变量TWO初值不定ST DB 96,20,?,57;以ST为首址连续分配 4个字节的存储单元STR DB How are you?;定义字符串TWIN DB 5 DUP(0FFH);连续分配5个字节,初值均为0FFH DB 100 DUP(?);连续分配100个字节单元,初值不定,例,3、数据定义及存储器分配伪指令,表达式的类型常数、数值表达式?表达式DUP表达式,1)常数、数值表达式,DBYTE DB 10,10HDWORD DW 1234H,5EABHDQWORD DQ 1234567890ABCDEFHATE DB 5*6,5-6,DBYTE,DWORD,DQWORD,ATE,2)?表达式表示只分配存储单元,但无确切的初值。,RESULT DB?,?ADDR1 DW 1234H,?,RESULT,ADDR1,3)带DUP的表达式格式:n DUP(初值)用于定义重复的数据项。,例:ARR DB 2 DUP(25H)VAR DB 2 DUP(0,3 DUP(A)ARR2 DW 100 DUP(?),ARR,VAR,变量的使用 如:ORG 1000H;程序偏移地址定位 VAR DB 2DH,3AH,45H,7CH,注意:变量名代表所定义的第一个单元的偏移地址。,则:MOV AL,VAR 汇编后为 MOV AL,1000H 执行后:AL=2DH。,则:MOV AL,VAR+2 汇编后为 MOV AL,1002H;执行后:AL=45H。,4、符号定义语句,符号定义语句EQU、=,格式 特点,符号 EQU 表达式符号=表达式,EQU 不能重复定义=可重复定义,注:符号而非变量,故用 EQU、=定义的 符号不占用存储器单元,伪指令EQU,=的例子COUNT EQU CX;用COUNT代替CX通用寄存器 MEQU MOV;用M代替MOV指令助记符,count=10MOV CX,count;(CX)=10count=count-1MOV BX,count;(CX)=9,5、宏指令,宏指令将程序中多处反复出现的若干条语句定义为一条指令,这条指令被称为宏指令。凡是在程序中出现这几条语句,即可用相应的宏指令代替。目的:简化汇编语言源程序的书写。宏指令的使用过程宏定义:对宏指令进行定义并取名宏调用:通过宏指令名字来调用宏展开:由宏汇编程序用宏定义中的指令来代替宏调用中的宏指令名,过程调用与宏调用的特点,相同点 不同点,均应先定义,后调用,过程:执行程序时,调用过程代码,需保护、恢复现场;宏:汇编源程序时,展开宏指令,无断点问题;,过程调用与宏调用,宏调用,过程调用,源文件,汇编时,执行时,源文件,宏调用,宏调用,宏定义,过程调用,过程调用,过程定义,替换,替换,调用,调用,基本源程序结构,段的定义,一般方法,使用特点,先定义数据段 DS、附加段 ES、堆栈段 SS后编写代码段 CS,代码段 CS 必须数据段 DS 需要附加段 ES 重叠(可以与数据段 DS 同段)堆栈段 SS 可以省缺,基本源程序结构,段说明与段赋值,仅说明了 DS 段(CS 段必须说明)ASSUME CS:CODE,DS:DATA DS段赋值 MOV AX,DATA MOV DS,AX,说明了DS段、ES段 ASSUME CS:CODE,DS:DATA,ES:EDATA DS段、ES段赋值 MOV AX,DATA MOV DS,AX MOV AX,EDATA MOV ES,AX,基本源程序结构,代码段(CS)的定义,汇编程序是在PC-DOS操作系统环境下执行的,必须保证程序执行完后,能回到DOS,可使用如下两种方法:1、FAR过程定义法;2、主程序定义法。,基本源程序结构,代码段(CS)的定义FAR过程定义法,CODE SEGMENT;CODE为代码段名 ASSUME CS:CODE,DS:DATA START PROC FAR;START为过程名 PUSH DS MOV AX,0 PUSH AX;正常返回DOS所需的段地址及偏移地址 MOV AX,DATA MOV DS,AX;上述为固定写法,基本源程序结构,。程序正文(指令集合)RET;过程返回 START ENDP;结束过程定义 CODE ENDS;结束代码段 END START;结束汇编,固定写法,基本源程序结构,代码段(CS)的定义主程序定义法,CODE SEGMENT;CODE为代码段名 ASSUME CS:CODE,DS:DATA MAIN:MOV AX,DATA;从MAIN开始汇编 MOV DS,AX 程序正文(指令集合)MOV AH,4CH INT 21H;21H号中断,返回DOS CODE ENDS;结束代码段 END MAIN;结束汇编,完整汇编程序例程,例 设有两个长为8字节无符号数分别存在以NUM1、NUM2为首址的连续内存单元中,将两数相加,结果存入SUM内存单元。,NUM1,NUM2,SUM,数据表,程 序,;-数据段定义-DATASEGMENTNUM1DQ00120030FC218B4AH;数1 NUM2DQ3E8144E96D701155H;数2SUMDQ?;结果单元DATAENDS;-代码段定义-CODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;-循环初始化-LEABX,NUM1;BX指向数1的最低一个字LEA SI,NUM2;SI指向数2的最低一个字LEADI,SUM;DI指向结果单元的最低一个字MOV CX,4;循环次数(4个字相加)CLC;清进位标志,程 序,AGAIN:MOV AX,BX;字相加ADC AX,SIMOV DI,AX;存和INC BX;指针调整INC BXINC SI INC SIINC DIINC DILOOP AGAIN;循环控制;-MOV AH,4CH;返回DOSINT 21HCODEENDSEND START,PC/XT机中中断号分配,系统专用功能调用 INT 00H INT 04H 8259A芯片专用功能调用 INT 08H 0FH BIOS专用功能调用 INT 10H INT 1AH DOS专用功能调用 INT 20H INT 27H 用户保留功能调用,PC机常用系统功能介绍,DOS功能调用,DOS功能调用,DOS系统功能调用和BIOS系统调用,8088/8086除了将00H04H类型中断规定为专用中断以外,IBM PC把类型08H0FH中断分配给主板和扩展槽上的基本外设的中断服务程序(8259专用),类型10H-1AH作为ROM-BIOS中的I/O功能子程序调用使用,类型20H0FFH中断中的一部分分配给DOS操作系统使用,类型40H7FH中断留给用户开发时使用。DOS系统功能调用使用中断的方式调用DOS操作系统提供的功能子程序(80多个),实现磁盘的读写、内存管理、基本I/O管理等系统服务功能。DOS将所有功能子程序放在中断类型号为21H的中断服务程序中,并按顺序编号,这个编号就是子程序的功能号。因此,可通过INT 21H指令,并通过不同的功能号调用指定的功能子程序,从而实现DOS系统功能调用。,注意:调用这些功能子程序时,程序中应包含以下三方面的内容:入口参数(有些子程序不需要);子程序的功能号送入AH寄存器;INT 21H。调用结束后,如果要返回DOS操作系统,应在程序后加入退出语句:MOV AH,4CH INT 21H,DOS常用系统功能调用示例(1)键盘输入并回显(功能号01)等待键盘按键,有键按下时,将相应键符的ASCII码读入AL中,同时回显在屏幕上。例如:MOV AH,01H INT 21H(2)显示输出(功能号02)根据DL中的内容(字符的ASCII码)在屏幕上显示对应的字符。例如 MOV AH,02HMOV DL,AINT 21H,(3)字符串显示功能,功能号 09H 入口参数 DS:DX 存储字符串的首地址 字符串结束符$,例显示数据段中定义的字符串,定义数据段编写代码段,DATA SEGMENT BUF DB Welcome to you!DB$DATA ENDS,ASSUME CS:CODE,DS:DATALEA DX,BUFMOV AH,09HINT 21H,BIOS功能调用,固化在PC机内存较高地址的ROM区中,通常从地址0FE000H开始的8K ROM中装有BIOS的例行程序,提供了系统加电自检、引导装入、主要I/O设备的处理以及接口控制等程序功能模块。与使用DOS中断调用非常类似,用户也可以通过 INT N 指令调用BIOS中断不同的是BIOS中断调用占用的中断类型号为10H1FH与DOS相比,BIOS是在更低的层次上为用户提供系统服务,例 使用ROM-BIOS功能调用显示字符A。CODE SEGMENT ASSUME CS:CODESTART:MOV AL,A MOV BX,0 MOV AH,0EH INT 10H MOV AH,4CH INT 21HCODE ENDS END START,由于汇编语言仅提供 IN、OUT 指令访问外设,我们可以利用ROM-BIOS和DOS操作系统提供的丰富的中断服务程序来访问外设。,用户中断服务子程序的装载,将用户中断服务子程序的入口地址放入中断向量表的相应位置的过程称为用户中断服务子程序的装载。常用的装载方法有三种,中断向量设置方法,编程写入法 3、INT 21H 功能设置法,1、数据段定义法 2、指令传送法,置中断向量功能 读中断向量功能,用户中断服务子程序的装载,1、定义数据段与向量表重合DATA SEGMENT AT 0000H;定义数据段(DS)=0000H ORG n*4;n为中断类型号SUP DW noffset;中断服务程序的入口IP DW nseg;中断服务程序的入口CSDATA ENDS,注:此方法未保存原中断向量,用户中断服务子程序的装载,2、程序初始化部分用数据传送指令DATA SEGMENT AT 0000H ORG n*4SUP DW 2DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,ES:DATA MOV AX,DATA MOV ES,AX MOV ES:SUP,OFFSET INISUP;中断服务程序INISUP的入口IP MOV ES:SUP+2,SEG INISUP;中断服务程序的入口CS,3、INT 21H 功能设置法,INT 21H 读中断向量法 功能号 35H AH 中断号 n AL INT 21H 出口参数 原中断服务程序的中断向量 CS:IP ES:BX,注:将中断号 n 的中断向量 CS:IP 送 ES:BX 中保存为出口参数,INT 21H 功能设置法,INT 21H 写中断向量法 功能号 25H AH 中断号 n AL 入口参数 新中断服务程序的中断向量 CS:IP DS:DX INT 21H,注:将中断号 n 的中断向量 CS:IP 送 DS:DX 中作入口参数,INT 21H 功能保存原中断向量,MOV AL,n;中断类型号 n 送 ALMOV AH,35H;读中断向量功能号送 AH INT 21H;执行 DOS 功能 PUSH ES;中断向量的 CS 值入栈保存 PUSH BX;中断向量的 IP 值入栈保存,注:这样可以在中断服务程序的最后恢复原中断向量,INT 21H 功能置新中断向量,PUSH DS;保护 DS MOV AX,SEG INTSUBMOV DS,AX;中断向量的 CS 送 DSMOV DX,OFFSET INTSUB;中断向量的 IP 送 DXMOV AL,n;中断类型号 n 送 ALMOV AH,25H;置中断向量功能号送 AHINT 21H;执行 DOS 功能 POP DS;恢复 DS,例,某中断服务程序的中断类型号为40H,中断服务程序的入口地址标号是 INTADD,用数据段定义法、传送指令法、INT 21H功能设置法分别实现中断向量的装载。,注:假设 INTADD 的 CS=46A8H IP=9578H,数据段定义中断向量法,VECDATA SEGMENT AT 0000H ORG 40H*4 SUB DW OFFSET INTADD DW SEG INTADD VECDATA ENDS,00100H,指令传送中断向量法,MOV DI,40H*4 MOV DI,OFFSET INTADD MOV DI+2,SEG INTADD,00100H,INT 21H 置中断向量法,PUSH DS;保存数据段寄存器 MOV AX,SEG INTADDMOV DS,AX MOV DX,OFFSET INTADD MOV AL,40H;中断号 MOV AH,25H INT 21H POP DS,00100H,