1、第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 ;数据段结束;数据段结束MYCODE SEGMENT
2、;代码段开始;代码段开始 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 DEC CL ;CL1 MOV AL,NUM1 ;数据送
3、;数据送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 ;堆栈段开始堆栈段开始 DW 32H DUP(?);堆栈段空间为;堆栈段
4、空间为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 SS:STACK ES:E
5、SEG;堆栈段、附加段段名;堆栈段、附加段段名 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章000BH BE 0000 MOV SI,OFFSET LISTA ;指向源块的首地址指向源
6、块的首地址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 MOV AH,4CH ;功能调用号功能调用号4CH送入送入AH001DH CD 21 INT 21H ;
7、程序结束后返回程序结束后返回DOS MAIN ENDP ;过程结束;过程结束 CSEG ENDS ;代码段结束;代码段结束 END MAIN ;程序结束;程序结束第3章第3章第3章举例程序得出结论 (1)源源程程序序一一般般由由n个个段段构构成成,理理论论上上讲讲可可以以有有很很多多,但但实实际际上上8086/8088规规定定不不超超出出16段段。每每个个段段都都以以 SEGMEN语语句句开开始始,以以ENDS语语句句结结束束。程程序序中中第第一一段段称称为为STACK(堆堆栈栈段段),它它用用来来在在存存储储器器的的某某个个地地方方建建立立一一个个栈栈区区;第第二二段段称称为为DATA(数数
8、据据段段),它它在在存存储储器器中中放放了了被被乘乘数数,乘乘数数的的数数据据,第第三三段段称称为为CODE(代代码码段段),其其中中包包括括了了许许多多以以符符号号表表示示的的指指令令用用于实现乘法运算。程序中出现了于实现乘法运算。程序中出现了SEGMEN、ASSUME伪指令。伪指令。(2)ASSUME语语句句可可使使汇汇编编程程序序知知道道CS、DS、SS、ES指指向向那那个个段段地地址址,它它在在汇汇编编时时起起作作用用,在在运运行行时时CPU不不知知道道除除CS外外的其他段地址,所以必须在程序中用指令进行赋值。的其他段地址,所以必须在程序中用指令进行赋值。(3)所所有有过过程程(用用R
9、ROC语语句句定定义义)必必须须用用过过程程结结束束语语句句(ENDP)结结束束。整整个个源源程程序序也也必必须须用用结结束束语语句句(END)来来结结束。束。汇汇编编程程序序有有三三种种基基本本语语句句构构成成:(硬硬)指指令令语语句句,(说说明明)伪指令语句,(说明)宏指令语句。伪指令语句,(说明)宏指令语句。(4)程程序序开开始始必必须须申申明明(装装入入)各各段段寄寄存存器器的的值值,即即各各段段地地址址的的值值第3章第3章第3章一:(硬)指令语句和伪指令语句硬硬指指令令使使CPU产产生生动动作作、并并在在程程序序执执行行时时才才处处理理的的语语句句,就就是是前前面面第第3章章学学习习
10、的处理器指令,汇编时会生成目标代码的处理器指令,汇编时会生成目标代码伪伪指指令令(Directive)不不产产生生CPU动动作作、在在程程序序执执行行前前由由汇汇编编程程序序处处理理的的说说明明性语句,例如,数据说明、变量定义等等性语句,例如,数据说明、变量定义等等伪伪指指令令与与具具体体的的处处理理器器类类型型无无关关,但但与与汇汇编编程程序序的的版版本本有有关关,即即;伪伪指指令令语语句句只只为为汇汇编编程程序序提提供供汇汇编编时时所所需需的的信信息息,而而本本身身不会生成目标代码不会生成目标代码第3章 执行性语句执行性语句由硬指令构成的语句,它通常对应由硬指令构成的语句,它通常对应一条机
11、器指令,出现在程序的代码段中:一条机器指令,出现在程序的代码段中:标号标号:硬指令助记符硬指令助记符 目的操作数目的操作数,源操作数;注释源操作数;注释 前面章节已讲过前面章节已讲过 说明性语句说明性语句由伪指令构成的语句,它通由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:常指示汇编程序如何汇编源程序:名字名字 伪指令助记符伪指令助记符 参数参数,参数参数,;注释;注释第3章MOV CX,0MOV CX,0;传送指令,具有传送指令,具有2 2个操作数个操作数DELAY:DELAY:NOPNOP;空操作指令,没有操作数,带有标号空操作指令,没有操作数,带有标号LOOP DELAYLOOP
12、 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表表示示首首地地址址,即即段段地地址址和和偏偏移移地地址址,具具有有赋赋过过初初值值的的变变量量的的意意义,由汇编程序自动给出。义,由汇编程序自动给出。汇编语言语句实例汇编语言语句实例标号、名字与标识符标标号号是是反反映映硬硬指指令令位位置置(逻逻辑辑地地址址)的的
13、标标识识符符,后跟一个冒号后跟一个冒号“:”分隔分隔名名字字是是反反映映伪伪指指令令位位置置(逻逻辑辑地地址址)和和属属性性的的标标识识符符,后后跟跟空空格格或或制制表表符符分分隔隔,没没有有冒冒号号“:”标标识识符符(Identifier)一一般般最最多多由由31个个字字母母、数数字字及及规规定定的的特特殊殊符符号号(如如 _、$、?、)组组成成,不不能能以以数数字字开开头头。默默认认情情况况下下,汇汇编编程程序不区别标识符中的字母大小写序不区别标识符中的字母大小写一一个个程程序序中中,每每个个标标识识符符的的定定义义是是唯唯一一的的,还还不能书写成汇编语言采用的保留字不能书写成汇编语言采用
14、的保留字第4章保留字保保留留字字(Reserved Word)是是汇汇编编程程序序已已经利用的标识符,主要有:经利用的标识符,主要有:o硬指令助记符类硬指令助记符类例如:例如:MOV、ADDo伪指令助记符类伪指令助记符类例如:例如:DB、EQUo操作符操作符例如:例如:OFFSET、PTRo寄存器名寄存器名例如:例如:AX、CSo预定义符号预定义符号例如:例如:data第4章 汇编语言大小写不敏感第3章第3章3.10.2 伪 指 令 中 参 数、变 量 和 标 号1.汇编伪指令的标号;汇编伪指令的标号;不能以数字不能以数字09开头开头不能以保留字开头不能以保留字开头字母不区分大小写字母不区分大
15、小写标号和语句之间不能有标号和语句之间不能有:第3章第3章2.符号定义语句(1)用用符符号号来来表表示示一一个个指指定定的的常常数数或或数数值值表表达达式式即即为为常常量量标标号号,这这种种伪伪指指令令的的格格式式是是在在符符号号与与常常数数之之间间用用“=”或者或者“EQU”连接(等值语句)如:连接(等值语句)如:NUM1 EQU 78H;将将78H赋值给赋值给NUM1CONT1 =96 ;将;将60H赋值给赋值给CONT1CONT2 =28H+NUM1;将将A0H赋值给赋值给CONT2CONT3 EQU 2*CONT1;将将C0H赋值给赋值给CONT3常常量量标标号号是是给给某某个个数数据
16、据取取的的名名字字,一一经经定定义义,汇汇编编指指令令中就可以使用这个名字,无需使用具体的数字中就可以使用这个名字,无需使用具体的数字(2)解除语句解除语句PURGE格式格式 PURGE 符号名符号名1,符号名,符号名2,此此语语句句本本身身没没有有符符号号名名,被被PURGE解解除除后后的的符符号号名名可可以重新定义,例:以重新定义,例:PURGE NUM1,CONT1第4章第3章第3章3.变量(数据)定义伪指令变变量量定定义义(Define)伪伪指指令令为为变变量量申申请请固固定定长长度度的的存存储储空空间间,并并可可同同时时将将相应的存储单元初始化相应的存储单元初始化变量名变量名 伪指令
17、助记符伪指令助记符 初值表初值表汇编语言规定有汇编语言规定有DB、DW、DD、DF、DQ、DT 变量定义伪指令最常使用变量定义伪指令最常使用第3章第3章第3章变量定义伪指令助记符变变量量定定义义伪伪指指令令根根据据申申请请的的主主存存空空间单位分类间单位分类DB定义字节伪指令定义字节伪指令DW定义字伪指令定义字伪指令DD定义双字伪指令定义双字伪指令DF定义定义3字伪指令字伪指令DQ定义定义4字伪指令字伪指令DT定义定义10字节伪指令字节伪指令第3章第3章第3章变量名变变量量名名为为用用户户自自定定义义标标识识符符,表表示示初初值值表表首首元元素素的的逻逻辑辑地地址址;用用这这个个符符号号表示地
18、址,常称为符号地址表示地址,常称为符号地址变变量量名名可可以以没没有有。这这种种情情况况,汇汇编编程程序序将将直直接接为为初初值值表表分分配配空空间间,无无符符号号地址地址设设置置变变量量名名是是为为了了方方便便存存取取它它指指示示的的存储单元存储单元第3章第3章第3章初始值可以是确定的值或字符串初始值可以是确定的值或字符串 DATA1 DW 9999HDATA2 DB OK初始值不确定而为任意值时则使用?初始值不确定而为任意值时则使用?DATA3 DD?简简化化定定义义过过程程可可使使用用重重复复定定义义伪伪指指令令DUP,例例如如定定义义一一个个拥拥有有256个个存存储储单单元元的的字字节
19、节型型数数据据缓缓冲冲区区BUFFB,初初值均为值均为0BUFFB DB 256 DUP(0)简简化化定定义义过过程程,可可以以在在一一条条伪伪指指令令中中用用逗逗号号分分隔隔而而构构成成任意组合序列任意组合序列BUFFB DB 0,0,ABC,?,?,?,?,0FFH第3章第3章第3章初值表初值表是用逗号分隔的参数初值表是用逗号分隔的参数主要由数值常数、表达式或?、主要由数值常数、表达式或?、变量中重复数据的定义格式变量中重复数据的定义格式:符号名符号名 Dn 表达式表达式1 DUP(表达式)(表达式)表达式表达式1:数据重复的次数数据重复的次数圆括弧内表达式:要重复的内容圆括弧内表达式:要
20、重复的内容?表示初值不确定,即未赋初值;表示初值不确定,即未赋初值;第3章第3章第3章定义字节单元伪指令DBDB伪伪指指令令用用于于分分配配一一个个或或多多个个字字节节单单元元,并可以将它们初始化为指定值并可以将它们初始化为指定值初初 值值 表表 中中 每每 个个 数数 据据 一一 定定 是是 字字 节节 量量(Byte),存放一个),存放一个8位数据:位数据:可以是可以是0255的无符号数的无符号数 或是或是128127带符号数带符号数 也可以是字符串常数也可以是字符串常数第3章第3章datadatasegmentsegment;数据段;数据段X Xdb a,-5db a,-5db 2 du
21、p(100),?db 2 dup(100),?Y Ydb ABCdb ABCdatadataendsends字节单元定字节单元定义实例义实例第3章第3章第3章mov al,Xmov al,X;此处此处X X表示它的第表示它的第1 1个数据,故个数据,故ALaALadec X+1dec X+1;对对X X为始的第为始的第2 2个数据减个数据减1 1,故成为,故成为-6-6mov Y,almov Y,al;现在现在Y Y这个字符串成为这个字符串成为 aaBCBC字节变量的字节变量的应用应用第3章第3章定义字单元伪指令DWDW伪伪指指令令用用于于分分配配一一个个或或多多个个字字单单元,并可以将它们初
22、始化为指定值元,并可以将它们初始化为指定值初初 值值 表表 中中 每每 个个 数数 据据 一一 定定 是是 字字 量量(Word),一一个个字字单单元元可可用用于于存存放放任任何何16位数据:位数据:一个段地址一个段地址一个偏移地址一个偏移地址 两个字符两个字符 065535之间的无符号数之间的无符号数 3276832767之间的带符号数之间的带符号数第3章第3章datadatasegmentsegment;数据段;数据段countcount dw 8000h,?,ABdw 8000h,?,ABmaxintmaxint equ 64hequ 64hnumbernumber dw maxintd
23、w maxintarrayarray dw maxint dup(0)dw maxint dup(0)datadataendsends字单元定义字单元定义实例实例第3章第3章字变量和字常量的定义:字变量和字常量的定义:WNUMWNUM EQU 5678HEQU 5678H;定义定义WNUMWNUM为常量为常量COUNTCOUNT DW 20H DW 20H;定定义义COUNTCOUNT是是赋赋了了初初值值的的变变量量,假假设设在在数数据据段段的的有效偏移地址为有效偏移地址为10H.10H.字变量和字常量的应用:字变量和字常量的应用:MOV AX,BX+SI+WNUMMOV AX,BX+SI+W
24、NUM;MOV AX,BX+SI+5678HMOV AX,BX+SI+5678HMOV AX,COUNTMOV AX,COUNT;MOV AX,0010HMOV AX,0010H ;AX=0020H AX=0020HMOV AX,SI+COUNTMOV AX,SI+COUNT;MOV AX,COUNTSIMOV AX,COUNTSI;MOV AX,SI+20HMOV AX,SI+20HLEA BX,COUNTLEA BX,COUNT;LEA BX,0010HLEA BX,0010HMOV BX,OFFSET COUNTMOV BX,OFFSET COUNT;MOV BX,0010HMOV BX
25、,0010H字变量和字常量字变量和字常量第3章第3章定义双字单元伪指令DDDD伪伪指指令令用用于于分分配配一一个个或或多多个个双双字字单单元元,并可以将它们初始化为指定值并可以将它们初始化为指定值初初值值表表中中每每个个数数据据是是一一个个3232位位的的双双字字量量(Double WordDouble Word):):可以是有符号或无符号的可以是有符号或无符号的3232位整数位整数 也可以用来表达也可以用来表达1616位段地址(高位字)和位段地址(高位字)和1616位的偏移地址(低位字)的远指针位的偏移地址(低位字)的远指针varddvarddDD 0,?,12345678hDD 0,?,1
26、2345678hfarpointfarpointDD 00400078hDD 00400078h第3章第3章其他数据单元定义伪指令定定义义3 3字字伪伪指指令令DFDF用用于于为为一一个个或或多多个个6 6字节变量分配空间及初始化字节变量分配空间及初始化6 6字字节节常常用用在在3232位位CPUCPU中中表表示示一一个个4848位位远远指指针针(1616位段选择器位段选择器:32:32位偏移地址)位偏移地址)定定义义4 4字字伪伪指指令令DQDQ用用于于为为一一个个或或多多个个8 8字节变量分配空间及初始化字节变量分配空间及初始化8 8字节变量可以表达一个字节变量可以表达一个6464位整数位
27、整数定定义义1010字字节节伪伪指指令令DTDT用用于于为为一一个个或或多个多个1010字节变量分配空间及初始化字节变量分配空间及初始化1010字节变量可以表达扩展精度浮点数字节变量可以表达扩展精度浮点数第3章第3章ORG定位伪指令、END结束伪指令ORGORG (段的起始点)伪指令(段的起始点)伪指令该该指指令令对对程程序序计计数数器器置置数数,为为程程序序起始点。起始点。ORG 100hORG 100h;从从100h100h处处安安排排数数据据或或程程序序END结束汇编伪指令STRUC 数据结构定义的开始NEAR 段内转移的近过程调用FAR 段间转移的远过程调用第3章第3章分析和合成操作符
28、(1)合成操作符)合成操作符 PTR操作符操作符格式:类型格式:类型 PTR 表达式表达式类类型型可可以以是是 BYTE、WORD、DWORD、FWORD、QWORD、TBYTE、NEAR、FAR如;如;BYTE PTR:操作数为操作数为1个存储单元的字节类型个存储单元的字节类型 WORD PTR:操作数为:操作数为2个存储单元的字节类型个存储单元的字节类型 DWORD PTR:操作数为:操作数为4个存储单元的字节类型个存储单元的字节类型 FWORD PTR:操作数为:操作数为6个存储单元的字节类型个存储单元的字节类型 QWORD PTR:操作数为:操作数为8个存储单元的字节类型个存储单元的字
29、节类型 TBYTE PTR:操作数为:操作数为10个存储单元的字节类型个存储单元的字节类型SHORT:迫使转移指令在迫使转移指令在128个字节的近距离内实现短跳转个字节的近距离内实现短跳转例例 JC SHORT NEXT修修饰饰 JC指指令令转转移移到到标标号号NEXT,具具有有NEAR属属性性,说说明明它它下下一一条条指令不超过指令不超过128-127个字节。个字节。第3章第3章分析操作符SEG取标号或变量的段地址取标号或变量的段地址例例 MOV AX,SEG STACK;将将变变量量STACK存存储储单单元元的的段段地地址址送送AX寄存器寄存器OFFSET操作符操作符取标号或变量的偏移值取
30、标号或变量的偏移值例例 MOV 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章第
31、3章段/过程规定伪操作SEGMENT和和ENDS将将汇汇编编语语言言源源程程序序分分割割成成段段,仅仅用用来来做做段段的的界界符符。一一个个程程序序最最多多可可有有4段段:数据段、代码段、附加段、堆栈段数据段、代码段、附加段、堆栈段。PROC 每每个个过过程程(子子程程序序)都都以以伪伪操操作作符符PROC开始,并以开始,并以ENDP结束。结束。ASSUME 告告诉诉汇汇编编程程序序一一个个段段是是使使用用那那一一个段寄存器。个段寄存器。格格式式:ASSUME 段段寄寄存存器器名名:段段名名,(由由SEGMENT说明的段名说明的段名)例:例:ASSUME CS:MY_CODE,DS:SEG_D
32、ATA第3章第3章第3章操作数(参数)处处理理器器指指令令的的操操作作数数可可以以是是常常数数操操作作数数、寄寄存存器器和存储单元和存储单元常常数数操操作作数数:具具有有数数字字值值的的常常数数或或表表示示常常数数的的标标号和名字号和名字存储器操作数:可分成标号和变量存储器操作数:可分成标号和变量标号是可执行的指令的地址符号标号是可执行的指令的地址符号伪伪指指令令的的参参数数可可以以是是常常数数、变变量量名名、表表达达式式等等,可可以以有有多多个个,参参数数之之间间用用逗号分隔逗号分隔第3章第3章第3章常数二进制:如二进制:如 00101110B十进制:如十进制:如 196D或或196十六进制
33、:如十六进制:如 0FDH八进制:如八进制:如 367Q十进制科学表示法:十进制科学表示法:2.735E-2十十六六进进制制实实数数:由由若若干干十十六六进进制制数数数数码码组组成成,以以数数字字开开头头、以以字字母母R结结尾尾,总总位位数数必必须须是是8、16或或20,以以字字母母打打头头的的数数前前面面必必须须加加0,此此时时总总位位数数多多1位位例例 4FA0C65BR串串常常数数:用用引引号号括括起起来来的的字字符符串串,其其值值是是字字符符的的ASCII代码值代码值例例 “A5”其值是其值是4135H第3章第3章第3章宏指令语句 宏宏指指令令是是现现代代汇汇编编为为自自己己定定义义的
34、的新新型型指指令令,应应用用宏宏指指令令会会提提高程序设计的有效性并简化程序的编写和调整。高程序设计的有效性并简化程序的编写和调整。在在编编写写程程序序时时常常常常遇遇到到一一个个多多次次出出现现的的指指令令序序列列(语语句句组组),为为了了简简化化程程序序的的书书写写和和修修正正,给给这这个个指指令令序序列列起起一一个个名名字字,这这个个经定义后的名字就称为宏指令。经定义后的名字就称为宏指令。宏指令的好处;简化程序的编写;易于修改程序。宏指令的好处;简化程序的编写;易于修改程序。1.宏定义宏定义格式格式 标号标号 操作码操作码 操作数操作数 NAME MACRO List 语语 句句 体体
35、ENDM第3章第3章第3章NAME是名字不是形式地址,在名字后不能用是名字不是形式地址,在名字后不能用“:”MACRO和和ENDM也也是是伪伪指指令令。该该伪伪指指令令指指示示汇汇编编用用MACRO和和ENDM之之间间的的语语句句组组作作为为命命名名为为“NAME”的的宏宏定定义义。经经过过这这种种定定义义的的名名字字NAME便便可可在在程程序序中中当当作作指指令令语语句句的的操操作作码码使使用用。对对源源程程序序进进行行汇汇编编时时,在在程程序序中中遇遇到到NAME汇汇编编程程序序就就自自动动地地用语句组(宏指令体)来代替用语句组(宏指令体)来代替例例 把累加器把累加器AL的高、低的高、低4
36、位交换。位交换。标号标号 操作码操作码 操作数操作数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.宏扩展宏扩展对对源源程程序序进进行行汇汇编编时时,汇汇编编程程序序用
37、用宏宏指指令令体体代代替替每每次次出出现现的的宏宏指指令令称称为为宏宏扩扩展展。宏宏扩扩展展由由汇汇编编程程序序自自动动完完成成。编编程程人人员员只只完完成成宏宏定义和宏调用。例如上述源程序经宏扩展后变为下列源程序定义和宏调用。例如上述源程序经宏扩展后变为下列源程序标号标号 操作码操作码 操作数操作数 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.宏变元宏变元宏宏定定义义中中的的操操作作数数List称称为为形形式式参参数数,宏宏指指令令中中的的操操作作数数称
38、称为为宏宏参参数数。在在宏宏扩扩展展中中,用用宏宏指指令令中中的的宏宏参参数数代代替替相相应应的的宏宏定定义义中中的的形形式式参参数数称称为为宏宏变变元元。上上例例中中若若不不是是累累加加器器AL高高低低4位位交交换换,而而是是其其它它8位位寄寄存存器器,这这时时写写入入适适当当形形式式参参数数。定定义义如如下下 标号标号 操作码操作码 操作数操作数ROTATE MACRO REG ROL REG ROL REG ROL REG ROL REG ENDM 其其宏宏定定义义中中的的操操作作数数REG为为形形式式参参数数。功功能能是是寄寄存存器器REG内内容容左左移移,当当调调用用宏宏指指令令时时
39、必必须须填填入入宏宏参参数数,即即在在指指令令中中填填入入操操作数。若是寄存器作数。若是寄存器BL时,调用形式如下时,调用形式如下第3章第3章第3章 标号标号 操作码操作码 操作数操作数 ROTATE BL 汇编时用宏参数汇编时用宏参数BL代替形式参数代替形式参数REG宏指令会扩展为宏指令会扩展为标号标号 操作码操作码 操作数操作数 ROL BL ROL BL ROL BL ROL BL在程序中经常会出现数据块在内存的两个区间互相传送,也可以用一条宏指令代替。程序如下;在程序中经常会出现数据块在内存的两个区间互相传送,也可以用一条宏指令代替。程序如下;DATA SEGMENTSTRT DB“T
40、HE 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 为宏参数。为宏参数。#A,#B为形参。为形参。程序将把以程序将把以STRT为首地址的数据块,传到以为首地址的数据
41、块,传到以MEMO为首地址的数据区中为首地址的数据区中第3章第3章第3章汇编程序指令举例DATA SEGMENT;数据段开始,段名为数据段开始,段名为DATABUFF DB 256 DUP(?);BUFF缓冲区有缓冲区有256个单元,初值未定个单元,初值未定DATA1 DW 1234H ;定义一个字单元定义一个字单元DATA ENDS ;数据段结束数据段结束CODE SEGMENT ;指令段开始,段名为指令段开始,段名为STARTSTART PROC ;定义一个标号为定义一个标号为START的过程的过程 ASSUME DS:DATA,CS:CODE;告知汇编器告知汇编器DATA和和CODE段名
42、段名 ;汇编语言程序主体汇编语言程序主体START ENDP ;START过程结束过程结束CODE ENDS ;指令段结束;指令段结束 END START ;程序结束,程序起始地址为;程序结束,程序起始地址为START第3章第3章第3章3.10.3汇编语言的程序设计汇编语言程序设计的基本步骤汇编语言程序设计的基本步骤1、分分析析问问题题,抽抽象象出出描描述述问问题题的的数数学模型学模型2、确定解决问题的算法思路、确定解决问题的算法思路3、绘制流程图或结构图、绘制流程图或结构图4、分配存储空间(包括寄存器)、分配存储空间(包括寄存器)5、编写程序、编写程序6、上机调试、上机调试第3章第3章第3章
43、 一、顺序程序设计 一、顺序程序设计一、顺序程序设计程序是顺序执行的,无分支、无循环,又称直线型程序程序是顺序执行的,无分支、无循环,又称直线型程序例例 内内存存中中自自TABLE开开始始的的16个个单单元元连连续续存存放放着着自自然然数数015的的平平方方(称称作作平平方方表表)。任任意意给给定定数数X(0X 15)在在XX单单元元,查查表表求求X的平方值,并把结果存入的平方值,并把结果存入YY单元。单元。分分析析一一下下表表的的存存放放规规律律如如图图所所示示,可可知知表表的的起起始始地地址址与与数数X的的和和,便是便是X平方值所在单元的地址,由此可得子程序如下;平方值所在单元的地址,由此
44、可得子程序如下;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 AX,0 PUSH AX MOV AX,SEG DATA;取段地址;取段地址 MOV DS,AX MOV BX,OFFSET TAB
45、LE;取偏移地址取偏移地址 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章二、分支程序设计一一般般情情况况下下程程序序按按顺顺序序方方式式执执行行,有有时时进进行行运运算算时时要要根根据据不不同同的的情情况况选选择择不不同同的的处处理理方方法法,执执行行不同的程序,这就需要分支。如下图所示不同的程序,这就需要分支。如下图所示条件程序段2程序段1NY第3章第3章第3章见教材P157页下面举例例例 在存储器中有一个首地
46、址为在存储器中有一个首地址为ARRAY的的N个字数组,个字数组,要求测试其中正数、要求测试其中正数、0、及负数的个数,正数的个数、及负数的个数,正数的个数放在放在DI中中,0的个数放在的个数放在SI中中,并根据并根据N、DI、SI的的值,求得负数的个数并放在值,求得负数的个数并放在AX中,如果有负数则转中,如果有负数则转移到移到NEG_VAL中去执行。程序片段如下中去执行。程序片段如下 MOV CX,N;计数器置值;计数器置值 MOV BX,0;BX清零清零 MOV DI,BX ;正数个数计数器清零;正数个数计数器清零 MOV SI,BX ;零数个数计数器清零;零数个数计数器清零AGAIN:C
47、MP 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的计数器加的计数器加1 NEXT:ADD BX,2 ;修改数组指针;修改数组指针 DEC CX ;修改循环计数器;修改循环计数器 JNZ AGAIN ;CX0转移,继续比较转移,继续比较 MOV AX,N SUB AX,DI SUB AX,SI ;数组中除了正数个数和数组中除了正数个数
48、和0个数就是负数个数个数就是负数个数 JZ SKIP;累加器结果为零转移;累加器结果为零转移 JMP NEAT PTR NEG_VAL SKIP:.NEG_VAL:第3章第3章第3章三、循环程序结构在在实实际际解解决决问问题题过过程程中中,往往往往需需要要重重复复的的做做一一些些工工作作,凡凡需需要要重重复复做做的的工工作作,可用循环结构程序实现。循环程序结构有以下部分组成;可用循环结构程序实现。循环程序结构有以下部分组成;(1)初始化:建立指针,设计计数器,设置变量初值)初始化:建立指针,设计计数器,设置变量初值(2)循环体:放置重复执行的部分)循环体:放置重复执行的部分(3)修改部分:修改
49、操作数的地址等,为下次循环做好准备)修改部分:修改操作数的地址等,为下次循环做好准备(4)循环控制:修改计数器,判断循环控制条件,决定是否继续循环。)循环控制:修改计数器,判断循环控制条件,决定是否继续循环。循环程序有两种基本结构形式:循环程序有两种基本结构形式:1先判断后执行结构:先判断后执行结构:2先执行后判断结构:先执行后判断结构:初始化条件程序段NY初始化循环体修改部分 控制部分(循环结束吗)NY先判断后执行结构先判断后执行结构先执行后判断结构先执行后判断结构第3章第3章第3章先执行后判断结构举例统计一个数据块中负数的个数程序统计一个数据块中负数的个数程序,即统计符号位为即统计符号位为
50、1的个数,先执行后判断循环程序如下:的个数,先执行后判断循环程序如下:DATA SEGMENTD1 DW 14A8H,A6C1H,F10AHRS DD?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTAT:MOV AX,DATA MOV DS,AX MOV BX,OFFSET D1 ;建数据指针建数据指针 MOV CX,LENGTH D1 ;置计数器初值;置计数器初值 初始化初始化 MOV DX,0 :置结果初值:置结果初值LOP1:MOV AX,BX CMP AX,0 JGE JUS ;大于或等于;大于或等于0 转移转移 循环体循环体 INC DX
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100