第三章第10节汇编程序常用伪指令简介_第1页
第三章第10节汇编程序常用伪指令简介_第2页
第三章第10节汇编程序常用伪指令简介_第3页
第三章第10节汇编程序常用伪指令简介_第4页
第三章第10节汇编程序常用伪指令简介_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章第3章3.10 3.10 汇编程序常用伪指令汇编程序常用伪指令 汇编语言是用指令的助记符、符号地址、汇编语言是用指令的助记符、符号地址、标号等书写程序的语言,用汇编语言编标号等书写程序的语言,用汇编语言编写的程序称为汇编语言源程序。写的程序称为汇编语言源程序。把汇编把汇编语言源程序翻译成机器语言程序(目标语言源程序翻译成机器语言程序(目标程序)的过程称为汇编程序)的过程称为汇编。完成汇编任务。完成汇编任务的程序称为汇编程序。的程序称为汇编程序。 在基本汇编的基础上进一步允许在源在基本汇编的基础上进一步允许在源程序中把一个指令序列定义为一条宏指程序中把一个指令序列定义为一条宏指令的汇编程序

2、叫做宏汇编令的汇编程序叫做宏汇编第3章第3章第3章3.10.1汇编语言的格式例例 3.10.1:用重复加法的方法实现乘法运算的子程序用重复加法的方法实现乘法运算的子程序STACK SEGMENT PARA STACK ;堆栈段开始堆栈段开始 DB 64 DUP(?) ;堆栈段空间为;堆栈段空间为100个字节个字节STACK ENDS ;堆栈段结束;堆栈段结束MYDATA SEGMENT PARA STACK ;数据段开始;数据段开始NUM1 DB 2AH ;数据段放的数据;数据段放的数据NUM2 DB 78HPRODUPCT DW ? ;数据缓冲区;数据缓冲区MYDATA ENDS ;数据段结

3、束;数据段结束MYCODE SEGMENT ;代码段开始;代码段开始 ASSUME CS:MYCODE DS:MYDATA ;指明代码段、数据段、;指明代码段、数据段、 SS:STACK ;堆栈段段名;堆栈段段名MYPROC PROC FAR ;定义过程;定义过程 PUSH DS ;DS进栈进栈 SUB AX,AX ;AX清零清零 PUSH AX ; AX进栈进栈 MOV AX,SEG MYDATA ;段地址送;段地址送AX MOV DS,AX ; AX送送DS第3章第3章 SUB AX,AX ; AX清零清零 MOV CX,AX ; CX清零清零 MOV CL,NUM2 ;数据送数据送CL

4、DEC CL ; CL1 MOV AL,NUM1 ;数据送;数据送ALK: ADD AL, NUM1 ; AL+ NUM1送送AL ADC AH,00H ;进位送;进位送AH LOOP K ; K循环,次数由循环,次数由CX决定决定 MOV PRODUCT ,AX;结果送;结果送AX RET ;调用返回调用返回MYPROC ENDP ;过程结束;过程结束MYCODE ENDS ;代码段结束;代码段结束 END MYPROC ;程序结束;程序结束第3章第3章例4.2假设LISTA与LISTB为两个字类型数组,将他们各对应相加,其和放在LISTB数组中,程序设计如下: STACK SEGMENT

5、;堆栈段开始堆栈段开始 DW 32H DUP(?) ;堆栈段空间为;堆栈段空间为40个字个字STACK ENDS ;堆栈段结束;堆栈段结束DSEG SEGMENT ;数据段开始;数据段开始 LISTA DW 64H DUP(1234H) ;100字的源缓冲区字的源缓冲区DSEG ENDS ;数据段结束数据段结束ESEG SEGMENT ;附加段开始;附加段开始 LISTB DW 100 DUP (432H1) ; 100字的目的缓冲区字的目的缓冲区ESEG ENDS ;附加段结束;附加段结束CSEG SEGMENT ;代码段开始;代码段开始 ASSUME CS:CSEG DS:DSEG;指明代

6、码段、数据段段名;指明代码段、数据段段名 ASSUME SS:STACK ES:ESEG ;堆栈段、附加段段名;堆栈段、附加段段名 MAIN PROC ;定义过程;定义过程 0000H B8 9014 MOV AX,DSEG ;数据段段地址送;数据段段地址送AX 0003H 8ED8 MOV DS, AX ;数据段段地址装入数据段段地址装入DS 0005H B8 9D14 MOV AX, ESEG ;附加段段地址送附加段段地址送AX 0008H 8EC0 MOV ES, AX ;附加段段地址装入;附加段段地址装入ES 000AH FC CLD ; 选择地址增方向选择地址增方向第3章第3章第3章

7、000BH BE 0000 MOV SI, OFFSET LISTA ; 指向源块的首地址指向源块的首地址000EH BF 0000 MOV DI, OFFSET LISTB ; 指向目的块的首地址指向目的块的首地址0011H B9 6400 MOV CX,100 ;循环次数循环次数0014H AD LOP1: LODSW ; LISTA元素送元素送AX0015H 260305 ADD AX,ES:DI ;将将LISTB元素加到元素加到AX0018H AB STOSW ;两数之和存入;两数之和存入LISTB0019H E2F9 LOOP LOP1 ;循环至循环至CX=0001BH B4 4C

8、MOV AH,4CH ;功能调用号功能调用号4CH送入送入AH001DH CD 21 INT 21H ;程序结束后返回程序结束后返回DOS MAIN ENDP ;过程结束;过程结束 CSEG ENDS ;代码段结束;代码段结束 END MAIN ;程序结束;程序结束第3章第3章第3章举例程序得出结论 (1) 源程序一般由源程序一般由n个段构成,个段构成,理论上讲可以有很多,但实际理论上讲可以有很多,但实际上上8086/8088规定不超出规定不超出16段。段。每个段都以每个段都以 SEGMEN语句开始,语句开始,以以ENDS语句结束。程序中第一段称为语句结束。程序中第一段称为STACK(堆栈段)

9、,它(堆栈段),它用来在存储器的某个地方建立一个栈区;第二段称为用来在存储器的某个地方建立一个栈区;第二段称为DATA (数据段),它在存储器中放了被乘数,乘数的数据,第三段(数据段),它在存储器中放了被乘数,乘数的数据,第三段称为称为CODE (代码段),其中包括了许多以符号表示的指令用(代码段),其中包括了许多以符号表示的指令用于实现乘法运算。程序中出现了于实现乘法运算。程序中出现了SEGMEN 、ASSUME伪指令。伪指令。 (2) ASSUME语句可使汇编程序知道语句可使汇编程序知道CS、DS、SS、ES指向指向那个段地址,它在汇编时起作用,在运行时那个段地址,它在汇编时起作用,在运行

10、时CPU不知道除不知道除CS外外的其他段地址,所以必须在程序中用指令进行赋值。的其他段地址,所以必须在程序中用指令进行赋值。 (3)所有过程(用)所有过程(用RROC语句定义)必须用过程结束语句语句定义)必须用过程结束语句(ENDP)结束。整个源程序也必须用结束语句()结束。整个源程序也必须用结束语句(END)来结)来结束。束。 汇编程序有三种基本语句构成:汇编程序有三种基本语句构成:(硬)(硬)指令语句,指令语句,(说明)(说明)伪指令语句,伪指令语句,(说明)(说明)宏指令语句。宏指令语句。 (4)程序开始必须申明(装入)各段寄存器的值,即各段地址)程序开始必须申明(装入)各段寄存器的值,

11、即各段地址的值的值第3章第3章第3章一:(硬)指令语句和伪指令语句使使CPU产生动作、并在程序执产生动作、并在程序执行时才处理的语句,就是前面第行时才处理的语句,就是前面第3章学习章学习的处理器指令的处理器指令,汇编时会生成目标代码,汇编时会生成目标代码(Directive)不产生不产生CPU动动作、在程序执行前由汇编程序处理的说明作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等性语句,例如,数据说明、变量定义等等伪指令与具体的处理器类型无关,但与汇伪指令与具体的处理器类型无关,但与汇编程序的版本有关编程序的版本有关,即;伪指令语句只为,即;伪指令语句只为汇编程序提供汇

12、编时所需的信息,而本身汇编程序提供汇编时所需的信息,而本身不会生成目标代码不会生成目标代码第3章 执行性语句执行性语句由硬指令构成的语句,它通常对应由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:一条机器指令,出现在程序的代码段中: 标号标号: 硬指令助记符硬指令助记符 目的操作数目的操作数, 源操作数;注释源操作数;注释 前面章节已讲过前面章节已讲过 说明性语句说明性语句由伪指令构成的语句,它通由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:常指示汇编程序如何汇编源程序: 名字名字 伪指令助记符伪指令助记符 参数参数,参数参数,;注释;注释第3章MOV CX,0MOV

13、 CX,0; ;传送指令,具有传送指令,具有2 2个操作数个操作数DELAY:DELAY: NOPNOP; ;空操作指令,没有操作数,带有标号空操作指令,没有操作数,带有标号LOOP DELAYLOOP DELAY; ;循环指令,标号循环指令,标号DELAYDELAY说明转移位置说明转移位置BUFFERBUFFER DB 1,2,3,4,5,6,7 DB 1,2,3,4,5,6,7; ;数据定义伪指令,数据定义伪指令,在主存中在主存中开辟开辟7 7个连续的字节单元,初值依次为个连续的字节单元,初值依次为1 17 7,BUFFERBUFFER表示首地址,即段地址和偏移地址,具有赋过初值的变量的表

14、示首地址,即段地址和偏移地址,具有赋过初值的变量的意义意义,由汇编程序自动给出。,由汇编程序自动给出。汇编语言语句实例汇编语言语句实例标号、名字与标识符标号标号是反映硬指令位置(逻辑地址)的标识是反映硬指令位置(逻辑地址)的标识符,后跟一个冒号符,后跟一个冒号“ :”分隔分隔名字名字是反映伪指令位置(逻辑地址)和属性是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒的标识符,后跟空格或制表符分隔,没有冒号号“:”标识符标识符(Identifier)一般最多由)一般最多由31个字母、个字母、数字及规定的特殊符号(如数字及规定的特殊符号(如 _、$、?、)组成,不能以数字开头

15、。默认情况下,汇编组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写程序不区别标识符中的字母大小写一个程序中,每个标识符的定义是唯一的,一个程序中,每个标识符的定义是唯一的,还不能书写成汇编语言采用的保留字还不能书写成汇编语言采用的保留字第4章保留字保留字(保留字(Reserved Word)是汇编程序已)是汇编程序已经利用的标识符,主要有:经利用的标识符,主要有:o硬指令助记符类硬指令助记符类例如:例如:MOV、ADDo伪指令助记符类伪指令助记符类例如:例如:DB、EQUo操作符操作符例如:例如:OFFSET、PTRo寄存器名寄存器名例如:例如:AX、CSo预定义符号预定义

16、符号例如:例如:data第4章 汇编语言大小写不敏感第3章第3章3 . 1 0 . 2 伪 指 令 中 参 数 、 变 量 和 标 号1.汇编伪指令的标号汇编伪指令的标号;不能以数字不能以数字09开头开头不能以保留字开头不能以保留字开头字母不区分大小写字母不区分大小写标号和语句之间不能有标号和语句之间不能有:第3章第3章2.符号定义语句(1) 用符号来表示一个指定的常数或数值表达式即为常用符号来表示一个指定的常数或数值表达式即为常量标号,这种伪指令的格式是在符号与常数之间用量标号,这种伪指令的格式是在符号与常数之间用“=”或者或者“EQU”连接(等值语句)如:连接(等值语句)如:NUM1 EQ

17、U 78H ;将将78H赋值给赋值给NUM1CONT1 = 96 ;将;将60H赋值给赋值给CONT1CONT2 = 28H+NUM1 ;将将A0H赋值给赋值给CONT2CONT3 EQU 2*CONT1 ;将将C0H赋值给赋值给CONT3常量标号是给某个数据取的名字,一经定义,汇编指令常量标号是给某个数据取的名字,一经定义,汇编指令中就可以使用这个名字,无需使用具体的数字中就可以使用这个名字,无需使用具体的数字(2)解除语句解除语句PURGE格式格式 PURGE 符号名符号名1,符号名,符号名2,此语句本身没有符号名,被此语句本身没有符号名,被PURGE解除后的符号名可解除后的符号名可以重新

18、定义,例:以重新定义,例: PURGE NUM1, CONT1第4章第3章第3章3.变量(数据)定义伪指令变量定义(变量定义(Define)伪指令为变量申)伪指令为变量申请固定长度的存储空间,并可同时将请固定长度的存储空间,并可同时将相应的存储单元初始化相应的存储单元初始化变量名变量名 伪指令助记符伪指令助记符 初值表初值表汇编语言规定有汇编语言规定有DB、DW、DD、DF、DQ、DT 变量定义伪指令最常使用变量定义伪指令最常使用第3章第3章第3章变量定义伪指令助记符变量定义伪指令根据申请的主存变量定义伪指令根据申请的主存空间单位分类空间单位分类DB定义字节伪指令定义字节伪指令DW定义字伪指令

19、定义字伪指令DD定义双字伪指令定义双字伪指令DF定义定义3字伪指令字伪指令DQ定义定义4字伪指令字伪指令DT定义定义10字节伪指令字节伪指令第3章第3章第3章变量名变量名为用户自定义标识符,变量名为用户自定义标识符,表示初表示初值表首元素的逻辑地址值表首元素的逻辑地址;用这个符号;用这个符号表示地址,常称为符号地址表示地址,常称为符号地址变量名可以没有。这种情况,汇编程变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号序将直接为初值表分配空间,无符号地址地址设置变量名是为了方便存取它指示的设置变量名是为了方便存取它指示的存储单元存储单元第3章第3章第3章初始值可以是确定的值或字符

20、串初始值可以是确定的值或字符串 DATA1 DW 9999HDATA2 DB OK初始值不确定而为任意值时则使用?初始值不确定而为任意值时则使用?DATA3 DD ?简化定义过程可使用重复定义伪指令简化定义过程可使用重复定义伪指令DUP,例如定义一,例如定义一个拥有个拥有256个存储单元的字节型数据缓冲区个存储单元的字节型数据缓冲区BUFFB,初,初值均为值均为0BUFFB DB 256 DUP(0)简化定义过程,可以在一条伪指令中用逗号分隔而构成简化定义过程,可以在一条伪指令中用逗号分隔而构成任意组合序列任意组合序列BUFFB DB 0,0,ABC,?,?,?,? , 0FFH第3章第3章第

21、3章初值表初值表是用逗号分隔的参数初值表是用逗号分隔的参数主要由数值常数、表达式或?、主要由数值常数、表达式或?、变量中重复数据的定义格式变量中重复数据的定义格式:符号名符号名 Dn 表达式表达式1 DUP(表达式)(表达式)表达式表达式1:数据重复的次数数据重复的次数圆括弧内表达式:要重复的内容圆括弧内表达式:要重复的内容?表示初值不确定,即未赋初值;表示初值不确定,即未赋初值;第3章第3章第3章定义字节单元伪指令DBDB伪指令用于分配一个或多个字节单元,伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值并可以将它们初始化为指定值初 值 表 中 每 个 数 据 一 定 是 字 节

22、量初 值 表 中 每 个 数 据 一 定 是 字 节 量(Byte),存放一个),存放一个8位数据:位数据:n 可以是可以是0255的无符号数的无符号数n 或是或是128127带符号数带符号数 也可以是字符串常数也可以是字符串常数第3章第3章datadatasegmentsegment;数据段;数据段X Xdb a,-5db a,-5db 2 dup(100),?db 2 dup(100),?Y Ydb ABCdb ABCdatadataendsends字节单元定字节单元定义实例义实例第3章第3章第3章mov al,Xmov al,X; ;此处此处X X表示它的第表示它的第1 1个数据,故个数

23、据,故ALaALadec X+1dec X+1; ;对对X X为始的第为始的第2 2个数据减个数据减1 1,故成为,故成为-6-6mov Y,almov Y,al; ;现在现在Y Y这个字符串成为这个字符串成为 aaBCBC字节变量的字节变量的应用应用第3章第3章定义字单元伪指令DWDW伪指令用于分配一个或多个字单伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值元,并可以将它们初始化为指定值初 值 表 中 每 个 数 据 一 定 是 字 量初 值 表 中 每 个 数 据 一 定 是 字 量(Word),一个字单元可用于存放任),一个字单元可用于存放任何何16位数据:位数据:n 一个段

24、地址一个段地址n一个偏移地址一个偏移地址n 两个字符两个字符n 065535之间的无符号数之间的无符号数 3276832767之间的带符号数之间的带符号数第3章第3章datadatasegmentsegment;数据段;数据段countcount dw 8000h,?,ABdw 8000h,?,ABmaxintmaxint equ 64hequ 64hnumbernumber dw maxintdw maxintarrayarray dw maxint dup(0)dw maxint dup(0)datadataendsends字单元定义字单元定义实例实例第3章第3章字变量和字常量的定义:字变

25、量和字常量的定义:WNUMWNUM EQU 5678HEQU 5678H; ;定义定义WNUMWNUM为常量为常量COUNTCOUNT DW 20H DW 20H; ;定义定义COUNTCOUNT是赋了初值的变量,假设在数据段的是赋了初值的变量,假设在数据段的有效偏移地址为有效偏移地址为10H.10H.字变量和字常量的应用:字变量和字常量的应用:M O V A X , B X + S I + W N U M M O V A X , B X + S I + W N U M ; ; M O V M O V AX,BX+SI+5678HAX,BX+SI+5678HMOV AX,COUNTMOV AX

26、,COUNT; ; MOV AX,0010HMOV AX,0010H ; ; AX=0020H AX=0020HMOV AX,SI+COUNTMOV AX,SI+COUNT ; ; MOV AX,COUNTSIMOV AX,COUNTSI; ; MOV AX,SI+MOV AX,SI+2 20H0HLEA BX,COUNTLEA BX,COUNT; ; LEA BX,0010HLEA BX,0010HMOV BX,OFFSET COUNTMOV BX,OFFSET COUNT; ; MOV BX,0010HMOV BX,0010H字变量和字常量字变量和字常量第3章第3章定义双字单元伪指令DDD

27、D伪指令伪指令用于分配一个或多个双字单元,用于分配一个或多个双字单元,并可以将它们初始化为指定值并可以将它们初始化为指定值初值表中每个数据是一个初值表中每个数据是一个3232位的双字量位的双字量(Double WordDouble Word):):n 可以是有符号或无符号的可以是有符号或无符号的3232位整数位整数n 也可以用来表达也可以用来表达1616位段地址(高位字)和位段地址(高位字)和1616位的偏移地址(低位字)的远指针位的偏移地址(低位字)的远指针varddvarddDD 0,?,12345678hDD 0,?,12345678hfarpointfarpointDD 0040007

28、8hDD 00400078h第3章第3章其他数据单元定义伪指令定义定义3 3字伪指令字伪指令DFDF用于为一个或多个用于为一个或多个6 6字节变量分配空间及初始化字节变量分配空间及初始化6 6字节常用在字节常用在3232位位CPUCPU中表示一个中表示一个4848位远指针位远指针(1616位段选择器位段选择器:32:32位偏移地址)位偏移地址)定义定义4 4字伪指令字伪指令DQDQ用于为一个或多个用于为一个或多个8 8字节变量分配空间及初始化字节变量分配空间及初始化8 8字节变量可以表达一个字节变量可以表达一个6464位整数位整数定义定义1010字节伪指令字节伪指令DTDT用于为一个或用于为一

29、个或多个多个1010字节变量分配空间及初始化字节变量分配空间及初始化1010字节变量可以表达扩展精度浮点数字节变量可以表达扩展精度浮点数第3章第3章ORG定位伪指令、END结束伪指令ORGORG (段的起始点)伪指令(段的起始点)伪指令该指令对程序计数器置数,为程序该指令对程序计数器置数,为程序起始点。起始点。ORG 100hORG 100h ; ;从从100h100h处安排数据或程处安排数据或程序序END结束汇编伪指令STRUC 数据结构定义的开始NEAR 段内转移的近过程调用FAR 段间转移的远过程调用第3章第3章分析和合成操作符(1)合成操作符)合成操作符 PTR操作符操作符格式:类型格

30、式:类型 PTR 表达式表达式类型可以是类型可以是 BYTE、WORD 、 DWORD、 FWORD 、 QWORD 、TBYTE 、 NEAR 、FAR如;如;BYTE PTR : 操作数为操作数为1个存储单元的字节类型个存储单元的字节类型 WORD PTR:操作数为:操作数为2个存储单元的字节类型个存储单元的字节类型 DWORD PTR :操作数为:操作数为4个存储单元的字节类型个存储单元的字节类型 FWORD PTR :操作数为:操作数为6个存储单元的字节类型个存储单元的字节类型 QWORD PTR :操作数为:操作数为8个存储单元的字节类型个存储单元的字节类型 TBYTE PTR :操

31、作数为:操作数为10个存储单元的字节类型个存储单元的字节类型SHORT: 迫使转移指令在迫使转移指令在128个字节的近距离内实现短跳转个字节的近距离内实现短跳转例例 JC SHORT NEXT修饰修饰 JC指令转移到标号指令转移到标号NEXT,具有具有NEAR属性,说明它下一条属性,说明它下一条指令不超过指令不超过128-127个字节。个字节。第3章第3章分析操作符SEG取标号或变量的段地址取标号或变量的段地址例例 MOV AX,SEG STACK;将变量将变量STACK存储单元的段地址存储单元的段地址送送AX寄存器寄存器OFFSET操作符操作符取标号或变量的偏移值取标号或变量的偏移值例例 M

32、OV SP, OFFSET STACK-TOP;将栈顶的偏移量送将栈顶的偏移量送SP寄寄存器存器 SIZE操作符操作符取分配给变量的字节个数取分配给变量的字节个数例例 NUM1 DB 150(?) MOV DL, SIZE NUM1;150 DLLENGTH 取分配给变量的字节或字个数即变量的长度取分配给变量的字节或字个数即变量的长度例例 NUM1 DW 150(?) MOV AH, LENGTH NUM1;150 AHHIGH 取取16位数值或地址表达式的高字节。位数值或地址表达式的高字节。LOW 取取16位数值或地址表达式的低字节。位数值或地址表达式的低字节。第3章第3章第3章段/过程规定

33、伪操作SEGMENT和和ENDS将汇编语言源程序分割将汇编语言源程序分割成段,仅用来做段的界符。一个程序最多可有成段,仅用来做段的界符。一个程序最多可有4段:段:数据段、代码段、附加段、堆栈段数据段、代码段、附加段、堆栈段。PROC 每个过程(子程序)都以伪操作符每个过程(子程序)都以伪操作符PROC开始,并以开始,并以ENDP结束。结束。ASSUME 告诉汇编程序一个段是使用那一告诉汇编程序一个段是使用那一个段寄存器。个段寄存器。格式:格式:ASSUME 段寄存器名:段名段寄存器名:段名, (由由SEGMENT说明的段名说明的段名)例:例:ASSUME CS:MY_CODE, DS:SEG_

34、DATA第3章第3章第3章操作数(参数)处理器指令的处理器指令的操作数操作数可以是常数操作数、寄存器可以是常数操作数、寄存器和存储单元和存储单元常数操作数:具有数字值的常数或表示常数的标常数操作数:具有数字值的常数或表示常数的标号和名字号和名字存储器操作数:可分成标号和变量存储器操作数:可分成标号和变量标号是可执行的指令的地址符号标号是可执行的指令的地址符号伪指令的伪指令的参数参数可以是常可以是常数、变量名、表达式等,数、变量名、表达式等,可以有多个,参数之间用可以有多个,参数之间用逗号分隔逗号分隔第3章第3章第3章常数二进制:如二进制:如 00101110B十进制:如十进制:如 196D或或

35、196十六进制:如十六进制:如 0FDH八进制:如八进制:如 367Q十进制科学表示法:十进制科学表示法:2.735E-2十六进制实数:由若干十六进制数数码组成,以数十六进制实数:由若干十六进制数数码组成,以数字开头、以字母字开头、以字母R结尾,总位数必须是结尾,总位数必须是8、16或或20,以字母打头的数前面必须加,以字母打头的数前面必须加0,此时总位数,此时总位数多多1位位例例 4FA0C65BR串常数:用引号括起来的字符串,其值是字符的串常数:用引号括起来的字符串,其值是字符的ASCII代码值代码值例例 “A5”其值是其值是4135H第3章第3章第3章宏指令语句 宏指令是现代汇编为自己定

36、义的新型指令,应用宏指令会提宏指令是现代汇编为自己定义的新型指令,应用宏指令会提高程序设计的有效性并简化程序的编写和调整。高程序设计的有效性并简化程序的编写和调整。 在编写程序时常常遇到一个多次出现的指令序列(语句组),在编写程序时常常遇到一个多次出现的指令序列(语句组),为了简化程序的书写和修正,给这个指令序列起一个名字,这个为了简化程序的书写和修正,给这个指令序列起一个名字,这个经定义后的名字就称为宏指令。经定义后的名字就称为宏指令。宏指令的好处;简化程序的编写;易于修改程序。宏指令的好处;简化程序的编写;易于修改程序。1.宏定义宏定义格式格式 标号标号 操作码操作码 操作数操作数 NAM

37、E MACRO List 语语 句句 体体 ENDM第3章第3章第3章NAME是名字不是形式地址,在名字后不能用是名字不是形式地址,在名字后不能用“:”MACRO和和ENDM也是伪指令。该伪指令指示汇编用也是伪指令。该伪指令指示汇编用MACRO和和ENDM之间的语句组作为命名为之间的语句组作为命名为“NAME”的宏定义。经过这种的宏定义。经过这种定义的名字定义的名字NAME便可在程序中当作指令语句的操作码使用。便可在程序中当作指令语句的操作码使用。对源程序进行汇编时,在程序中遇到对源程序进行汇编时,在程序中遇到NAME汇编程序就自动地汇编程序就自动地用语句组(宏指令体)来代替用语句组(宏指令体

38、)来代替例例 把累加器把累加器AL的高、低的高、低4位交换。位交换。标号标号 操作码操作码 操作数操作数ROTATE MACRO ROL AL ROL AL ROL AL ROL AL ENDM第3章第3章第3章2.宏调用宏调用 编写程序时使用宏指令就是宏调用。宏调用时编写程序时使用宏指令就是宏调用。宏调用时把宏指令填写在操作码字段。宏指令能任意调把宏指令填写在操作码字段。宏指令能任意调用。如用。如; 标号标号 操作码操作码 操作数操作数 MOV AL, 2FH ROTATE ADD AL, 03H ROTATE HLT 程序中程序中ROTATE被调用两次被调用两次第3章第3章第3章3.宏扩展

39、宏扩展对源程序进行汇编时,汇编程序用宏指令体代替每次出现的宏指对源程序进行汇编时,汇编程序用宏指令体代替每次出现的宏指令称为宏扩展。宏扩展由汇编程序自动完成。编程人员只完成宏令称为宏扩展。宏扩展由汇编程序自动完成。编程人员只完成宏定义和宏调用。例如上述源程序经宏扩展后变为下列源程序定义和宏调用。例如上述源程序经宏扩展后变为下列源程序标号标号 操作码操作码 操作数操作数 MOV AL, 2FH ROL AL ROL AL ROL AL ROL AL ADD AL,03H ROL AL ROL AL ROL AL ROL AL HLT第3章第3章第3章4.宏变元宏变元宏定义中的操作数宏定义中的操作

40、数List称为形式参数,宏指令中的操作数称为宏称为形式参数,宏指令中的操作数称为宏参数。在宏扩展中,用宏指令中的宏参数代替相应的宏定义参数。在宏扩展中,用宏指令中的宏参数代替相应的宏定义中的形式参数称为宏变元。上例中若不是累加器中的形式参数称为宏变元。上例中若不是累加器AL高低高低4位位交换,而是其它交换,而是其它8位寄存器,这时写入适当形式参数。定义如位寄存器,这时写入适当形式参数。定义如下下 标号标号 操作码操作码 操作数操作数ROTATE MACRO REG ROL REG ROL REG ROL REG ROL REG ENDM 其宏定义中的操作数其宏定义中的操作数REG为形式参数。功

41、能是寄存器为形式参数。功能是寄存器REG内容内容左移,当调用宏指令时必须填入宏参数,即在指令中填入操左移,当调用宏指令时必须填入宏参数,即在指令中填入操作数。若是寄存器作数。若是寄存器BL时,调用形式如下时,调用形式如下第3章第3章第3章 标号标号 操作码操作码 操作数操作数 ROTATE BL 汇编时用宏参数汇编时用宏参数BL代替形式参数代替形式参数REG宏指令会扩展为宏指令会扩展为标号标号 操作码操作码 操作数操作数 ROL BL ROL BL ROL BL ROL BL在程序中经常会出现数据块在内存的两个区间互相传送,也可以用一条宏指令代替。程序如下;在程序中经常会出现数据块在内存的两个

42、区间互相传送,也可以用一条宏指令代替。程序如下;DATA SEGMENTSTRT DB “THE QUICK BROWNFOX JUMPS OVER THE LAZY DOG”MEMO DB 45 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE DS:DATA ES:DATAMOVE MACRO #A,#B MOV SI,OFSET#A MOV DI,OFSET#B MOV CX,SIZE#B CLD REP MOVSB ENDM用一条宏指令用一条宏指令MOVE STRT, MEMO 代替上述程序段,而代替上述程序段,而STRT , MEMO 为宏参数。为

43、宏参数。 #A, #B为形参。为形参。程序将把以程序将把以STRT为首地址的数据块,传到以为首地址的数据块,传到以MEMO为首地址的数据区中为首地址的数据区中第3章第3章第3章汇编程序指令举例DATA SEGMENT; 数据段开始,段名为数据段开始,段名为DATABUFF DB 256 DUP(?);BUFF缓冲区有缓冲区有256个单元,初值未定个单元,初值未定DATA1 DW 1234H ;定义一个字单元定义一个字单元DATA ENDS ;数据段结束数据段结束CODE SEGMENT ;指令段开始,段名为指令段开始,段名为STARTSTART PROC ;定义一个标号为定义一个标号为STAR

44、T的过程的过程 ASSUME DS:DATA,CS:CODE;告知汇编器告知汇编器DATA和和CODE段名段名 ;汇编语言程序主体汇编语言程序主体START ENDP ; START过程结束过程结束CODE ENDS ;指令段结束;指令段结束 END START ;程序结束,程序起始地址为;程序结束,程序起始地址为START第3章第3章第3章3.10.3汇编语言的程序设计汇编语言程序设计的基本步骤汇编语言程序设计的基本步骤1、分析问题,抽象出描述问题的数、分析问题,抽象出描述问题的数学模型学模型2、确定解决问题的算法思路、确定解决问题的算法思路3、绘制流程图或结构图、绘制流程图或结构图4、分配

45、存储空间(包括寄存器)、分配存储空间(包括寄存器)5、编写程序、编写程序6、上机调试、上机调试第3章第3章第3章 一、顺序程序设计 一、顺序程序设计一、顺序程序设计程序是顺序执行的,无分支、无循环,又称直线型程序程序是顺序执行的,无分支、无循环,又称直线型程序例例 内存中自内存中自TABLE开始的开始的16个单元连续存放着自然数个单元连续存放着自然数015的平的平方(称作平方表)。任意给定数方(称作平方表)。任意给定数X(0X 15)在在XX单元,查表求单元,查表求X的平方值,并把结果存入的平方值,并把结果存入YY单元。单元。 分析一下表的存放规律如图所示,可知表的起始地址与数分析一下表的存放

46、规律如图所示,可知表的起始地址与数X的和,的和,便是便是X平方值所在单元的地址,由此可得子程序如下;平方值所在单元的地址,由此可得子程序如下;DATA SEGMENTTABLE DB 0,1,4,9,16,25,36,49 DB 64,81,100,121,144,169,196,255XX DB ?YY DB ?DATA ENDSSTACK SEGMENT PARA STACKSTACK DB 50 DUP(?)STACK ENDS第3章第3章第3章CODE SEGMENT ASSUME CS:CODE, DS:DATA,SS:STACKSTART PROC FAR PUSH DS MOV

47、AX,0 PUSH AX MOV AX,SEG DATA;取段地址;取段地址 MOV DS,AX MOV BX, OFFSET TABLE ;取偏移地址取偏移地址 MOV AH, 0 MOV AL, XX ADD BX, AX MOV AL, BX MOV YY, AL RETSTART ENDSCODE ENDS END STARTDSTABLE00 010409.XX第3章YY255第3章第3章例4.2假设LISTA与LISTB为两个字类型数组,将他们各对应相加,其和放在LISTB数组中,程序设计如下: STACK SEGMENT ;堆栈段开始堆栈段开始 DW 32H DUP(?) ;堆栈

48、段空间为;堆栈段空间为40个字个字STACK ENDS ;堆栈段结束;堆栈段结束DSEG SEGMENT ;数据段开始;数据段开始 LISTA DW 64H DUP(1234H) ;100字的源缓冲区字的源缓冲区DSEG ENDS ;数据段结束数据段结束ESEG SEGMENT ;附加段开始;附加段开始 LISTB DW 100 DUP (432H1) ; 100字的目的缓冲区字的目的缓冲区ESEG ENDS ;附加段结束;附加段结束CSEG SEGMENT ;代码段开始;代码段开始 ASSUME CS:CSEG DS:DSEG;指明代码段、数据段段名;指明代码段、数据段段名 ASSUME S

49、S:STACK ES:ESEG ;堆栈段、附加段段名;堆栈段、附加段段名 MAIN PROC ;定义过程;定义过程 MOV AX,DSEG ;数据段段地址送;数据段段地址送AX MOV DS, AX ;数据段段地址装入数据段段地址装入DS MOV AX, ESEG ;附加段段地址送附加段段地址送AX MOV ES, AX ;附加段段地址装入;附加段段地址装入ES CLD ; 选择地址增方向选择地址增方向第3章第3章第3章 MOV SI, OFFSET LISTA ; 指向源块的首地址指向源块的首地址 MOV DI, OFFSET LISTB ; 指向目的块的首地址指向目的块的首地址 MOV C

50、X,100 ;循环次数循环次数 LOP1: LODSW ; LISTA元素送元素送AX ADD AX,ES:DI ;将将LISTB元素加到元素加到AX STOSW ;两数之和存入;两数之和存入LISTB LOOP LOP1 ;循环至循环至CX=0 MOV AH,4CH ;功能调用号功能调用号4CH送入送入AH INT 21H ;程序结束后返回程序结束后返回DOS MAIN ENDP ;过程结束;过程结束CSEG ENDS ;代码段结束;代码段结束 END MAIN ;程序结束;程序结束第3章第3章第3章二、分支程序设计一般情况下程序按顺序方式执行,有时进行运算一般情况下程序按顺序方式执行,有时

51、进行运算时要根据不同的情况选择不同的处理方法,执行时要根据不同的情况选择不同的处理方法,执行不同的程序,这就需要分支。如下图所示不同的程序,这就需要分支。如下图所示条件程序段2程序段1NY第3章第3章第3章见教材P157页下面举例例例 在存储器中有一个首地址为在存储器中有一个首地址为ARRAY的的N个字数组,个字数组,要求测试其中正数、要求测试其中正数、0、及负数的个数,正数的个数、及负数的个数,正数的个数放在放在DI中中 ,0的个数放在的个数放在SI中中,并根据并根据N 、DI、SI的的值,求得负数的个数并放在值,求得负数的个数并放在AX中,如果有负数则转中,如果有负数则转移到移到NEG_V

52、AL中去执行。程序片段如下中去执行。程序片段如下 MOV CX,N ;计数器置值;计数器置值 MOV BX,0 ;BX清零清零 MOV DI,BX ;正数个数计数器清零;正数个数计数器清零 MOV SI,BX ;零数个数计数器清零;零数个数计数器清零AGAIN:CMP ARRAYBX,0 ;数组的元素与数组的元素与0比较比较 JLE LESS_OR_EQ ;若小于等于若小于等于0则转移则转移 INC DI ;大于大于0则正计数器加则正计数器加1 JMP SHORT NEXT第3章第3章第3章LESS_OR_EQ: JL NEXT ;若小于若小于0,转移,转移 INC SI ; 0的计数器加的计

53、数器加1 NEXT: ADD BX,2 ;修改数组指针;修改数组指针 DEC CX ;修改循环计数器;修改循环计数器 JNZ AGAIN ;CX0转移,继续比较转移,继续比较 MOV AX,N SUB AX,DI SUB AX,SI ;数组中除了正数个数和数组中除了正数个数和0个数就是负数个数个数就是负数个数 JZ SKIP ;累加器结果为零转移;累加器结果为零转移 JMP NEAT PTR NEG_VAL SKIP: . . NEG_VAL:第3章第3章第3章三、循环程序结构在实际解决问题过程中,往往需要重复的做一些工作,凡需要重复做的工作,在实际解决问题过程中,往往需要重复的做一些工作,凡

54、需要重复做的工作,可用循环结构程序实现。循环程序结构有以下部分组成;可用循环结构程序实现。循环程序结构有以下部分组成;(1)初始化:建立指针,设计计数器,设置变量初值)初始化:建立指针,设计计数器,设置变量初值(2)循环体:放置重复执行的部分)循环体:放置重复执行的部分(3)修改部分:修改操作数的地址等,为下次循环做好准备)修改部分:修改操作数的地址等,为下次循环做好准备(4)循环控制:修改计数器,判断循环控制条件,决定是否继续循环。)循环控制:修改计数器,判断循环控制条件,决定是否继续循环。循环程序有两种基本结构形式:循环程序有两种基本结构形式:1先判断后执行结构:先判断后执行结构:2先执行

55、后判断结构:先执行后判断结构:初始化条件程序段NY初始化循环体修改部分 控制部分(循环结束吗)NY先判断后执行结构先判断后执行结构先执行后判断结构先执行后判断结构第3章第3章第3章先执行后判断结构举例统计一个数据块中负数的个数程序统计一个数据块中负数的个数程序,即统计符号位为即统计符号位为1的个数,先执行后判断循环程序如下:的个数,先执行后判断循环程序如下:DATA SEGMENTD1 DW 14A8H,A6C1H,F10AHRS DD ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTAT: MOV AX,DATA MOV DS,AX MOV B

56、X, OFFSET D1 ;建数据指针建数据指针 MOV CX,LENGTH D1 ;置计数器初值;置计数器初值 初始化初始化 MOV DX,0 :置结果初值:置结果初值LOP1: MOV AX,BX CMP AX,0 JGE JUS ;大于或等于;大于或等于0 转移转移 循环体循环体 INC DX; 负数个数增负数个数增1 JUS: INC BX ;修改部分;修改部分 INC BX;指向下一个数据;指向下一个数据 DEC CX JNE LOP1 ;控制部分;控制部分 MOV RS, DX ;存结果;存结果CODE ENDS END STAT第3章第3章第3章先判断后执行结构上例变成先判断后执

57、行结构程序如下:这种结构特点是进入循环后,上例变成先判断后执行结构程序如下:这种结构特点是进入循环后,先判断循环结束条件,再决定是否执行循环体。如果一进入循环就先判断循环结束条件,再决定是否执行循环体。如果一进入循环就满足结束条件,循环体将一次也不执行,即循环次数为零满足结束条件,循环体将一次也不执行,即循环次数为零STAT: MOV BX, OFFSET D1 ;建数据指针建数据指针 MOV CX, LENGTH D1 ;置计数器初值;置计数器初值 初始化部分初始化部分 MOV DX,0 :置结果初值:置结果初值 INC CXLOOP1: DEC CX ;控制部分控制部分 JZ DNE MO

58、V AX,BX CMP AX,0 JGE JUS ;大于或等于;大于或等于 转移转移 循环体循环体 INC DX JUS: INC BX INC BX ;修改部分;修改部分 JMP LOOP1 DNE: MOV RS, DX ;存结果;存结果CODE ENDS END STAT第3章第3章第3章四、子程序 一段程序在一个程序中多次使用或在多个程序中一段程序在一个程序中多次使用或在多个程序中使用,则可将这段程序抽出来放在内存某一区域,每使用,则可将这段程序抽出来放在内存某一区域,每当需要执行这段程序时,就用调用指令转到这段程序当需要执行这段程序时,就用调用指令转到这段程序去,执行完毕再返回原来程

59、序。这段程序就叫子程序去,执行完毕再返回原来程序。这段程序就叫子程序或过程。而调用它的程序为主程序。或过程。而调用它的程序为主程序。调用子程序用调用子程序用CALL指令;子程序结束返回时用指令;子程序结束返回时用RET指令。必须成对出现。调用子程序时,必须进栈保护指令。必须成对出现。调用子程序时,必须进栈保护断点和现场(标志寄存器和各寄存器内容)。当返回断点和现场(标志寄存器和各寄存器内容)。当返回时要出栈恢复现场和弹出断点,使程序能继续执行。时要出栈恢复现场和弹出断点,使程序能继续执行。CALL直接调用,目标地址就在直接调用,目标地址就在CALL指令中。指令中。间接调用其目标地址在由指令指定

60、的寄存器或内存单间接调用其目标地址在由指令指定的寄存器或内存单元中。元中。如:如:CALL DWORD PTR BX第3章第3章第3章1.子程序说明组成部分(1)功能描述:包括子程序的名称、功能、)功能描述:包括子程序的名称、功能、性能指标等。性能指标等。(2)所有的寄存器和存储单元)所有的寄存器和存储单元(3)子程序入口、出口参数。)子程序入口、出口参数。(4)子程序又调用其它子程序。)子程序又调用其它子程序。(5)调用实例(可有可无)调用实例(可有可无)第3章第3章第3章2、子程序中参数传递子程序中允许改变的数据叫参数,分为入口参数子程序中允许改变的数据叫参数,分为入口参数和出口参数两种,

温馨提示

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

评论

0/150

提交评论