收藏 分享(赏)

第四章-汇编语言程序设计.ppt

上传人:无敌 文档编号:109456 上传时间:2018-03-13 格式:PPT 页数:59 大小:205.52KB
下载 相关 举报
第四章-汇编语言程序设计.ppt_第1页
第1页 / 共59页
第四章-汇编语言程序设计.ppt_第2页
第2页 / 共59页
第四章-汇编语言程序设计.ppt_第3页
第3页 / 共59页
第四章-汇编语言程序设计.ppt_第4页
第4页 / 共59页
第四章-汇编语言程序设计.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

1、第四章 汇编语言程序设计,4.1 计算机程序设计语言的演变机器语言:以二进制数字编码表示的机器指令和数据。机器指令编码与CUP有关。汇编语言:以符号(助记符)表示的指令、数据、地址和变量等。汇编指令与机器指令一一对应。高级语言:以接近人们的自然语和数学语言来描述计算机的处理步骤和过程。高级语言中的语句与机器指令无关。,汇编语言的应用流程:,浮动代码.OBJ,汇编指令汇编源程序中的3种语句 伪指令 宏指令,其中只有汇编指令可转换为机器指令编码,伪指令和宏指令无对应的机器指令编码,仅在汇编的过程中被执行,起着控制汇编的作用。,4.2 汇编语言语法,4.2.1 汇编语言的语句格式 由汇编语言编写的源

2、程序是由许多语句(也可称为汇编指令)组成的。每个语句由14个部分组成。其格式是: 标号 指令助记符 操作数;注解 其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格(至少一个)分开,一行最多可有132个字符。,1标识符 是给指令或某一存储单元地址所起的名字。可由下列字符组成: 字母:AZ ; 数字:0 9 ; 特殊字符:?、 、一、$ 。 数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。标识符最长为31个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。,2指令助记符 表示不同操作的指令,可以是8088的

3、指令助记符,也可以是伪指令。3操作数 是指令执行的对象。依指令的要求,可能有一个、两个或者没有。 4注解 该项可有可无,是为源程序所加的注解,用于提高程序的可读性。,4.2.2 汇编语言的运算符1算术运算符、逻辑运算符和关系运算符 算术运算符可以应用于数字操作数,结果也是数字。而应用于存储器操作数时,只有、 运算符有意义。2取值运算符SEG、OFFSET、TYPE、SIZE和LENGTH SEG ; 取一个变量或标号的段地址例如,定义 SLOT DW 25 ;SLOT是标号则:MOV AX,SLOT ;从SLOT地址中取一个字送入AX MOV AX,SEG SLOT ;将SLOT所在段的段地址

4、送入AX,OFFSET ;求一个变量或标号的偏移量。例:MOV AX,OFFSET SLOT;将SLOT所在段的段内偏移地址送AX 。相当于 LEA AX,SLOT TYPE ;返回一个表示存储器操作数类型的数值。各种存储器地址操作数类型部分的值见下表:,LENGTH和SIZE操作符只应用于数据存储器操作数。(用DB/DW/DD等定义的操作数) LENGTH;求一个与存储器地址操作数相联系的单元个数, SIZE; 求为一个存储器操作数所分配的总的字节数。例如:若 MULT-WORD DW 50 DUP(0)则 LENGTH MULT-WORD = 50 SIZE MULT-WORD = 100

5、注意:SIZE = LENGTH * TYPE,3属性运算符 属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属性。常用的有:(1) 合成运算符PTR 它作用于操作数时,则忽略了操作数当前的类型(字节或字)及属性(NEAR或FAR),而给出一个临时的类型或属性,一般格式:类型 PTR 表达式功能:建立一个存储器地址操作数,它与其后的存储器地址操作数有相同的段地址偏移量,但有不同的类型。例如:SLOT DW 25 此时SLOT已定义成字单元。若我们想取出它的第一个字节内容,则可用PTR对其作用,使它暂时改变为字节单元,即 MOV AL,BYTE PTR SLOT,4.2.3 表达

6、式 表达式是由运算符和操作数组成的序列,在汇编时产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址,相应的表达式称为常量表达式和地址表达式。 1常数 汇编语言语句中出现的常数可以有7种: 二进制数 后跟字母B,如01000001B。 八进制数 后跟字母Q或O,如202Q或202O。 十进制数 后跟D或不跟字母,如85D或85。 十六进制数 后跟H,如56H,0FFH。注意,当数字的第一个字符是AF时,在字符前应添加一个数字0,以示和变量的区别。另有,十进制浮点数、十六进制实数、字符和字符串,2常量操作数 常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符。可

7、以为数字常量操作数或字符串常量操作数。前者可采用二进制、八进制、十进制或十六进制等计数形式;而后者则为相应字符的ASCII码。例 : K1 EQU 1024 K2 EQU A,3存储器操作数 存储器操作数是一个地址操作数,代表一个存储单元的地址,通常以标识符的形式出现。 存储器操作数可以分为变量及标号两者类型,如果存储器操作数所代表的是某个数据在数据段、附加段或堆栈段中的地址,那么这个存储器操作数就称为变量;如果存储器操作数所代表的是某条指令代码在码段中的地址,那么这个存储器操作数称为标号。例: A1 DB? LOOP1: A2 DB10 . ADD A1,A2 JMP LOOP1 变量所对应

8、的存储单元内容在程序的运行过程中是可以改变的,标号通常作为转移指令或调用指令的目标操作数,在程序运行过程中不能改变。,4常量表达式 由常量操作数及运算符构成,在汇编时产生一个常量。如PORT、VAL十1、 OFFSET SUM、SEG SUM、TYPE CYCLE等。 5地址表达式 由存储器操作数与运算符构成,必须有明确的物理意义。例如 SUM2、CYCLE5 表达式SUM2、CYCLE5的值仍然是一个存储器操作数,该存储器操作数的段地址与类型属性分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比SUM及CYCLE大2或小5。表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可

9、以改变。,4.2.4 伪指令 伪指令用来对汇编程序进行控制,是在汇编过程中对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但不产生目标代码,即不在目标代码中出现。1. 定义数据伪指令 该类伪指令用来定义存储空间及其所存数据的长度。 DB;定义字节,即每个数据是1个字节。 DW;定义字,即每个数据占1个字(2个字节)。 DD;定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址。 DQ;定义4字长,即每个数据占4个字。 DT;定义10个字节长,用于压缩式十进制数,,例如:DATA1 DB 5,6,8,100 DATA2 DW 7,287 TABLE DB

10、? ;表示在TABLE单元中存放的内容是随机的 。 当一个定义的存储区内的每个单元要放置同样的数据时,可用DUP操作符。 一般格式:COUNT DUP(?)COUNT 为重复的次数,“()”中为要重复的数据。如:BUFFER DB 100 DUP (0) ;表示以BUFFER为首地址的100个字节中存放00H数据BUFFER1 DB 100 DUP(3,5,2 DUP(10),35,24,NUM)想一想存储区的情况?,2. 符号定义伪指令EQU、=、及PURGE EQU 伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替,如:TIMES EQU 50 DATA DB T

11、IMES DUP(?)上述两个语句实际等效于如下一条语句:DATA DB 50 DUP(?) “=”伪指令可给初始变量赋值。如:COUNT=100 ;COUNT=100 TIME=50 ;TIME=50 PURGE伪指令用于释放由EQU伪指令定义的变量, 使这些变量可以被重新定义。 PURGE TIMES ; 释放TIMES变量 TIMES EQU 2 ; 重新定义,3. 段定义伪指令SEGMENT和ENDS 一般来说,一个完整的汇编源程序由3个段组成,即堆栈段、数据段和代码段。段定义伪指令可将源程序划分成若干段,以便生成目的代码和连接时将各同名段进行组合。 段定义伪指令一般格式为 : 段名

12、SEGMENT 定位类型 组合类型 类别 段名 ENDS SEGMENT和ENDS应成对使用,缺不可。其中段名是不可省略的。其它是可选项,是赋予段名的属性,可以省略。例如: DATA SEGMENT DW 20 DUP (?) DATA ENDS,设定段寄存器伪指令ASSUME一般格式: ASSUME 段寄存器:段名,段寄存器:段名,功能:通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。在段名中,CODE表示代码段,DATA表示数据段,STACK表示堆栈段。 由于ASSUME伪指令只指明某一个段地址应存于哪一个段寄存器中,并没有包含将段地址送入该寄

13、存器的操作。因此要将真实段地址装入段寄存器还需用汇编指令来实现。这一步是不可缺少的。,例如,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX内容送DS,DS才有实际段值 CODE ENDS 当程序运行时,由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装入程序中DS寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对DS进行初始化,以装入用户的数据段地址。当使用附加段时,也要用MOV指令给ES赋段地址

14、。,5. 定义过程的伪指令PROC和ENDP 在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。其格式为: 过程名 PROC 类型 过程体 RET 过程名 ENDP 其中过程名是为过程所起的名称,不能省略,过程的类型由FAR(远过程,为段间调用)和NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。ENDP表示过程结束。过程体内至少应有一条RET指令,以便返回被调用处。过程可以嵌套,也可以递归使用。,例如一个延时100ms的子程序,其过程可定义如下, DELAY PROC PUSH BX PUSH CX MOV BL,10

15、 ;延时10ms,改变BL和CX中的值,即可改变延时时间。AGAIN: MOV CX,2801 ; WAIT: LOOP WAIT DEC BL JNZ AGAIN POP CX POP BX RETDELAY ENDP.CALL DELAY ;调用该过程,远过程调用时被调用过程必定不在本段内。例如,有两个程序段,其结构如下: CODE1 SEGMENT ASSUME CS:CODE1 FARPROC PROC FAR RET FARPROC ENDP CODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2 CALL FARPROC . CODE2 ENDSCODE1

16、 段中的FARPROC 过程被另一段CODE2调用,故为远过程 。,宏指令 在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。宏指令的一般格式为:宏指令名 MACRO 形式参量表 宏体 ENDM例如:SHIFT MACRO MOV CL,4 SAL AL,Cl ENDM,这样定义以后,凡是要使AL中内容左移4位的操作都可用一条宏指令SHIFT来代替。 宏指令与子程序有许多类似之处。它们都是一段相对独立的、完成某种功能的、可供调用的程序模块,定义后可多次调用。 但在形成目的代码时,子程序只形成

17、一段目的代码,调用时转来执行。 而宏指令是将形成的目的代码插到主程序调用的地方。因此,前者占内存少,但执行速度稍慢;后者刚好相反。,ORG 伪指令 ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。 一般格式: ORG 例如:DATA SEGMENT BUFF1DB23,56H,EOF ORG 2000H BUFF2DBSTRING DATA ENDS 上述变量定义中,BUFF1从DATA段偏移地址为0的单元开始存放,而BUFF2则从DATA段偏移为2000H的单元开始存放,两者不是连续存放。,8. 汇编结束伪指令END 该伪指令表示源程序的结束令汇编程序停止汇编。因此,任何一个

18、完整的源程序均应有END指令。一般格式: END 表达式其中表达式表示该汇编程序的启动地址。例如:END START ;表明该程序的启动地址为START。,4.3 实地址方式下的汇编语言程序设计,8086/8088汇编语言程序的一般结构:数据段名 SEGMENT 数据空间定义;数据段名 ENDS堆栈段名 SEGMENT 堆栈空间定义;堆栈段名 ENDS附加段名 SEGMENT 附加空间定义;附加段名 ENDS,代码段名 SEGMENT过程名 PROC FAR ASSUME CS:代码段名 ,DS:数据段名 SS:堆栈段名 ,ES:附加段名 标号:PUSH DS MOV AX , 0 PUSH

19、AX 程序段 RET过程名 ENDP代码段名 ENDS END标号,PUSH DS MOV AX , 0 PUSH AX 过程名 PROC FAR . RET 过程名 ENDP关于以上指令的说明。 在系统运行时调用用户程序,此时系统程序的数据段PSP的前2个 存放是一条“返回操作系统”的 软中断指令INT 20H ,因此当执行RETF指令后,IP=0000, CS=DS,0000:0000HDS,ESDSSSCSFFFF:FFFFH,用户区,系统的数据区(PSP),INT指令所在的单元,8086/8088汇编语言程序的另一种结构:数据段名 SEGMENT 数据空间定义;数据段名 ENDS堆栈段

20、名 SEGMENT 堆栈空间定义;堆栈段名 ENDS附加段名 SEGMENT 附加空间定义;附加段名 ENDS代码段名 SEGMENT ASSUME CS:代码段名 ,DS:数据段名 SS:堆栈段名 ,ES:附加段名 标号: 程序段 MOV AH, 4CH INT 21H 代码段名 ENDS END标号,4.3.1 顺序程序设计 顺序程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。例1: 利用查表法计算平方值。已知0 - 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0X 9且为整数。分析:建立平方表,通

21、过查表完成。,STACK1 SEGMENT PARA STACK DB 100 DUP(?)STACK1 ENDSDATASEGMENTSUR DB ?;存09之间的任一个数。DIS DB ?SQTAB DB 0,1,4,9,16,25,36,49,64,81 ; 09的平方表DATA ENDSCODESEGMENTPROC1 PROC FARASSUME CS:CODE,DS:DATA,SS:STACK1,ES:DATABEGIN:PUSH DS MOVAX,0 PUSHAX ;保证返回DOS, MOVAX,DATA MOVDS,AX ;为DS送初值 LEA BX,SQTAB ;以下程序部分

22、完成查表求平方值 MOVAH,0 ;亦可用查表指令完成(如下程序段) MOVAL,SUR ;AL=X LEA BX, SQTAB ADDBX,AX ; MOV AL, SUR MOVAL,BX ; XLAT MOVDIS,AL ; MOV DIS, AL RETPROC1 ENDPCODE ENDS END BEGIN,例2 已知 Z=(X+Y)-(W+Z),其中X,Y,Z,W均为用压缩BCD码表示的数,写出程序。分析:这也是一种典型的直线程序,在这里要注意是BCD数相加,要进行十进制调整。具体程序如下:MOVAL,ZMOVBL,WADDAL,BLDAAMOVBL,AL ; BL=(W+Z)M

23、OVAL,XMOVDL,YADDAL,DL ; AL=(X+Y)DAA ;十进制调整SUBAL,BL ; AL=(X+Y)-(Z+W)DAS ;十进制调整MOVZ,AL ;结果送Z,4.3.2 分支程序设计 分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。 例1 试编写程序段,实现符号函数。分析:变量X的符号函数可表示为: 1 X0 Y= 0 X=0 -1 X0 程序可通过对符号标志的判别来确定执行哪一分支。,START:MOVAX,BUFFER ;(BUFFER)=XORAX,AXJEZERO ;X0,则转ZEROJNSPLUS ;X为正数,

24、则转PLUSMOVBX,0FFFFH ;X为负数,则1送BXJMPCONT1ZERO:MOVBX,0JMPCONT1PLUS:MOVBX,1CONT1: ,例2 利用表实现分支 根据AL中各位被置位情况,控制转移到8个子程序P1P8之一中去。转移表的结构如下表所示。分析:对于这种程序关键要找出每种情况的转移地址,表地址=表基地址+偏移量, 而偏移量可由AL各位所在位置*2求得。,DATASEGMENTBASEDW SR0,SR1,SR2,SR3,SR4,SR5,SR6,SR7DATAENDSCODESEGMENTPROC1 PROC FARASSUME CS:CODE,DS:DATA,ES:D

25、ATABEGIN:PUSHDSXORAX,AXPUSH AXMOVAX,DATA MOVDS,AXLEABX,BASE ;表头送BXINAL,PORT GETBIT: RCR AL,1 ;右移一位JC GETAD ;移出位是1?INC BX INC BX ;修改指针JMP GETBIT GETAD: JMP WORDPTRBX ;实现散转 RETFPROC1 ENDPCODEENDS END BEGIN,根据跳转表构成方法不同,实现分支的方法也有所改变,下面有三个问题希望大家思考:若跳转表地址由段值和偏移量四个字节构成,程序应如何实现?(JMP DWORD PTR 间接寻址)(2) 若跳转表中

26、的内容由JMP OPRD指令构成,表的结构应如何组织、程序如何实现?(修改IP,寄存器寻址)(3) 上述程序若不用间接跳转指令,而改为直接跳转,程序如何变动?(直接寻址),;思考(2)CODESEGMENTPROC1 PROC FARASSUME CS:CODE,DS:DATA,ES:DATABEGIN: :LEABX,BASE ;表头送BXINAL,PORT GETBIT: RCR AL,1 ;右移一位JC GETAD ;移出位是1?ADD BX, 3 ;修改指针JMP GETBIT GETAD: JMP BX ;实现散转BASE: JMP RS0 ; 3字节指令 JMP RS1 : JMP

27、 RS7 : RETFPROC1 ENDPCODEENDS END BEGIN,;思考(3)CODESEGMENTPROC1 PROC FARASSUME CS:CODE,DS:DATA,ES:DATABEGIN: : : INAL,PORT GETBIT0: RCR AL,1 ;右移一位 JNC GETBIT1 ;移出位是1? JMP RS0GETBIT1:RCR AL,1 ;右移一位 JNC GETBIT2 ;移出位是1? JMP RS1GETBIT2: : : GETBIT7: JMP RS7 : RETFPROC1 ENDPCODEENDS END BEGIN,例3:将内存中某一区域的

28、原数据块传送到另一区域中。分析:这种程序若源数据块与目的数据块之间地址没有重叠,则可直接用传送或串操作实现;若地址重叠,则要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送。程序如下:DATA SEGMENT STR DB1000DUP(?) STR1 EQUSTR+7 STR2 EQUSTR+25 STRCOUNTEQU50DATA ENDSSTAC SEGMENT PARA STACK STACK STAPN DB 100 DUP(?)STAC ENDS,CODESEGMENTGOO PROC FAR ASSUME CS:C

29、ODE,DS:DATA,ES:DATA,SS:STACGO:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXMOVCX,STRCOUNTMOVSI,STR1MOVDI,STR2CLDPUSHSIADDSI,STRCOUNT-1CMPSI,DIPOPSIJLOKSTDADDSI,STRCOUNT-1ADDDI,STRCOUNT-1,OK:REP MOVSBRETFGOOENDPCODEENDSENDGO,4.4.3 循环程序设计 循环程序是经常遇到的程序结构,一个循环结构通常由以下几个部分组成。 循环初始化部分:

30、一般要进行地址指针、循环次数及某标志的设置,相关寄存器的清零等操作。只有正确地进行了初始化设置,循环程序才能正确运行,及时停止。2循环体: 是要求重复执行的程序段部分,对应于要求重复执行的操作。 3循环控制部分: 由该部分修改并判断控制循环的条件是否满足。以决定是否继续循环。,4循环结束部分: 如保存循环运行结果等。 循环程序有两种结构形式,一种是DO-WHILE结构,另一种是DO-UNTIL结构。前者把循环控制部分放在循环体的前面,先判断执行循环体的条件,满足条件就执行循环体,否则就退出循环。而后者则是在执行循环体之后,再判断循环控制条件是否满足,若满足条件,则继续执行循环操作,否则,则退出

31、循环。,例4. 在给定个数的16位数串中,找出大于零、等于零和小于零的个数,并紧跟着原串存放。分析:这是一个统计问题,须设定三个计数器分别统计三种情况下的结果。程序如下:DATASEGMENT BUFFDW X1,X2,X3,Xn COUNT EQU $-BUFF ;此时,COUNT的值为BUFF所占的字节数 PLUSE DB ? ZERO DB ? MINUS DB ?DATAENDSSTAC SEGMENT PARA STACK STACK STAPN DB 100 DUP(?)STACENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACBEGIN:M

32、OVAX,DATAMOV DS,AXMOV CX,COUNTSHR CX,1 ;相当于除2,正好为BUFF中的数据个数MOV DX,0 ;设定计数器初值MOV AX,0 ;设定计数器初值,LEABX,BUFFAGAIN:CMP WORD PTRBX,0JAEPLU ;大于等于0,则转PIUINCAH ;0,则统计JMPNEXTZER:INCDH ;0,则统计NEXT:INCBXINCBXLOOPAGAINMOVPLUS,DLMOVZERO,DHMOVMINUS,AHMOVAX,4C00HINT21HCODEENDSENDBEGIN,例5:将内存的二进制数转化成压缩的BCD码。程序如下:.MOD

33、EL SMALL.386DATA SEGMENT BINNUM DD 12345678H ;内存中的二进制数 DECINUM DB 5 DUP(0) ;BCD码存储区 NUMBER DD 1000000000,100000000,10000000 DD 1000000,100000,10000,1000,100,10,1DATA ENDSCODE SEGMENTMT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA mov ds,ax MOV EAX,BINNUM,MOV SI , OFF

34、SET DECINUMMOV DI , OFFSET NUMBERMOV CX , 5ROTATE:CALL BINDECI ;转换子程序 ADD DI , 8 ;DI下移8字节 INC SI ;SI下移1字节LOOP ROTATERETMAIN ENDPBINDECI PROC NEAR PUSHFPUSH CXMOV CX, 0CLCDO_AGAIN1:SUB EAX,DWORD PTR DI ;EAX减去相应的减数JC NEXT1 ;不够减INC CL ;够减JMP DO_AGAIN1NEXT1:MOV CH , CL ;转换的部分结果送CH MOV CL , 0ADD EAX , DW

35、ORD PTR DI 还原最后一次减前的值,CLCDO_AGAIN2:SUB EAX , DWORD PTR DI+4JC NEXT2INC CL ;获得另一部分转换值JMP DO_AGAIN2NEXT2: ADD EAX,DWORD PTRDI+4 ;还原最后一次减前的值SHL CH,1 SHL CH,1SHL CH,1 ;将CH的低4位移至高4位SHL CH,1 OR CH,CL ;拼接2位转换结果。MOV BYTE PTR SI , CHPOP CXPOPFRETBINDECI ENDPCODE ENDS END START,4.3.4 子程序设计 子程序是程序设计中经常使用的程序结构,

36、通过把一些固定的、经常使用的功能做成子程序的形式,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。 对于一个子程序,应该注意它的入口参数和出口参数。 入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。另外,子程序所使用的寄存器和存储单元往往需要保护,以免影响返回后主程序的运行。 主程序在调用子程序时,一方面初始数据要传给子程序,另一方面子程序运行结果要传给主程序,因此,主子程序之间的参数传递是非常重要的。,参数传递一般有三种方法实现。利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。(2) 利用存储单元。这种参数传递方

37、法,把所需传递的参数直接放在某些存储单元中。(3) 利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。,过程的定义和调用:定义: 过程名 PROC NEAR/FAR 过程体 过程名 ENDP调用:在主程序中 执行 CALL 过程名 指令过程定义时的“现场”保护和恢复: 原则:凡在过程体中要改变值的“资源”,改变前先入栈。一般做法是执行过程体前先依次将需保护的单元入栈,然后执行过程体,最后“反序”将保护单元出栈。过程的嵌套和递归调用: 每一次过程调用都要占用一些堆栈空间,当过程嵌套调用的层数过深时,要注意栈空间的溢出。,4.4.3 汇编语言和 PC DOS 的接口,用户空间,系统RAM,00000H,FFFFFH,DOS启动后,程序装入后,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报