版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言程序设计汇编语言程序设计第六章 子程序结构 过程定义伪操作过程定义伪操作 子程序的调用与返回子程序的调用与返回 保存与恢复寄存器保存与恢复寄存器 子程序的参数传送子程序的参数传送 子程序的嵌套与递归子程序的嵌套与递归汇编语言程序设计汇编语言程序设计一、调用程序与子程序一、调用程序与子程序 子程序子程序: :在许多应用程序中,常常需要多次使用某功能的指令在许多应用程序中,常常需要多次使用某功能的指令序列。这时,为了减少重复编写程序,节省内存空间,把这一功序列。这时,为了减少重复编写程序,节省内存空间,把这一功能的指令序列组成一个相对独立的程序段。在程序运行时,如果能的指令序列组成一个相对
2、独立的程序段。在程序运行时,如果需要使用这个给定的功能,就转移到这个独立的程序段,待这个需要使用这个给定的功能,就转移到这个独立的程序段,待这个独立的程序段指令序列执行完后,又返回到原来位置继续运行程独立的程序段指令序列执行完后,又返回到原来位置继续运行程序。我们把这个相对独立的程序段就叫子程序或过程。序。我们把这个相对独立的程序段就叫子程序或过程。调用程序调用程序: :编制程序时,按需要转向子程序,称为子程序调用,编制程序时,按需要转向子程序,称为子程序调用,或称为过程调用。调用子程序的程序称为调用程序或主程序。主、或称为过程调用。调用子程序的程序称为调用程序或主程序。主、子程序是相对而言的
3、。但子程序一定是受调用程序或主程序调用子程序是相对而言的。但子程序一定是受调用程序或主程序调用的。子程序定义的位置可以放在主程序的前面或后面。的。子程序定义的位置可以放在主程序的前面或后面。汇编语言程序设计汇编语言程序设计二二. 过程定义伪操作过程定义伪操作 过程名过程名 PROC PROC NEARNEAR ( ( FAR FAR ) ) 过程名过程名 ENDPENDP(1 1)NEARNEAR属性:调用程序和子程序在同一代码段中,属性:调用程序和子程序在同一代码段中, 可省略。(段内调用)可省略。(段内调用)(2 2)FARFAR属性:调用程序和子程序不在同一代码段中。属性:调用程序和子程
4、序不在同一代码段中。 (段间调用)(段间调用).汇编语言程序设计汇编语言程序设计code1 segmentcode1 segmentmain proc main proc farfar callcall far ptr subp far ptr subp ret retmain endpmain endpcode1 endscode1 endscode2 segmentcode2 segmentsubp proc subp proc farfar retretsubp endpsubp endpcode2 endscode2 ends 段间调用和返回段间调用和返回code segmentcod
5、e segmentmain proc main proc farfar call call subp subp ret retmain endpmain endpsubp proc subp proc nearnear retretsubp endpsubp endpcode endscode ends 段内调用和返回段内调用和返回汇编语言程序设计汇编语言程序设计segx segmentsegx segmentsubtsubt proc proc farfar retretsubtsubt endp endp callcall subtsubt segx endssegx endssegy s
6、egmentsegy segment callcall far ptr far ptr subtsubt segy endssegy ends同一个子程序同一个子程序可以被段内调可以被段内调用,也可以段用,也可以段间调用间调用汇编语言程序设计汇编语言程序设计 (1)CALL 子程序调用指令:子程序调用指令:隐含使用堆栈保存返回地址隐含使用堆栈保存返回地址 指令格式:指令格式: CALL DST ;其中其中DST为过程的目标地址(即过程名)。为过程的目标地址(即过程名)。指令功能:指令功能: 把把CALL指令的下一条指令地址(称为返回点或断点)指令的下一条指令地址(称为返回点或断点) 推推入堆栈
7、保存,然后转到目标地址(入堆栈保存,然后转到目标地址(DST)。)。 CALL指令可以在段内、段间调用,寻址方式分为直接和指令可以在段内、段间调用,寻址方式分为直接和间接两种。间接两种。三三. 子程序的调用与返回指令子程序的调用与返回指令汇编语言程序设计汇编语言程序设计 段内直接近调用:段内直接近调用:CALL DST执行操作:执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) DST(实际操作是(实际操作是把从把从指令中得到的距目标过程相对偏移量(最大为指令中得到的距目标过程相对偏移量(最大为32K字节)加到指令指针字节)加到指令指针IP上(得到子程序
8、的上(得到子程序的入口地址),实现过程调用。入口地址),实现过程调用。)段内间接近调用:段内间接近调用:CALL DST执行操作:执行操作: PUSH IP (IP) (EA)DST给出子程序的入口地址给出子程序的入口地址(子程序为(子程序为near属性)属性)比如:比如:CALL subpDST给出寄存器或存储单元的内给出寄存器或存储单元的内容(转向地址)容(转向地址)比如:比如: CALL word ptr bx (SP) (IP)汇编语言程序设计汇编语言程序设计段间直接远调用:段间直接远调用:CALL FAR PTR DST执行操作:执行操作: PUSH CS PUSH IP (IP)
9、DST DST偏移地址偏移地址 (CS) DST DST段地址段地址段间间接远调用段间间接远调用:CALL FAR PTR DST 执行操作:执行操作: PUSH CS PUSH IP (IP) (EA) (CS) (EA+2)(IP)(CS)(SP) DST给出子程序的入口地址给出子程序的入口地址(子程序为(子程序为far属性)属性)比如:比如:CALL far ptr subp汇编语言程序设计汇编语言程序设计(2)RET 返回主程序指令:返回主程序指令: 属于无属于无条件转移指令。可以在段内或段间返条件转移指令。可以在段内或段间返回。回。段内近返回:段内近返回:RET 执行操作:执行操作:
10、 POP IP段内带立即数近返回:段内带立即数近返回:RET EXP 执行操作:执行操作: POP IP (SP) (SP)+EXP段间远返回:段间远返回:RET(F) 执行操作:执行操作: POP IP POP CS 段间带立即数远返回:段间带立即数远返回:RET EXP表达式表达式 (SP) (IP) (SP) 。 (SP)(SP)+EXP汇编语言程序设计汇编语言程序设计例:带立即数返回例:带立即数返回(SP)(SP) 堆栈段堆栈段code segmentcode segmentmain proc farmain proc farStart:Start: push ds push dsSu
11、b ax,axSub ax,axpush ax push ax push ax push ax push bx push bx push cx push cx call sub call sub ret retmain endpmain endpsub proc sub proc nearnear ret 6 ret 6sub endpsub endpcode endscode endsend startend start(IP)(IP)(cx)(cx)(bx)(bx)(ax)(ax)(SP)(SP)(SP)(SP)主程序模块主程序模块子程序模块子程序模块(SP)(SP)程序返回程序返回汇编语
12、言程序设计汇编语言程序设计【例】已知三个八位无符号数【例】已知三个八位无符号数X X、Y Y、Z Z,分别存放于,分别存放于BUFBUF、BUF+1BUF+1和和BUF+2BUF+2存储单元,计算存储单元,计算2X+5Y+8Z2X+5Y+8Z,结果送,结果送RESRES和和RES+1RES+1单元。单元。DATA SEGMENTBUF DB 71H,0A4H,9BHRES DB 2 DUP(?)DATA ENDSSTACK SEGMENT DW 50 DUP(?)TOP LABEL WORDSTACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:S
13、TACKMAIN PROC FAR START:MAIN ENDPCODE ENDS END START汇编语言程序设计汇编语言程序设计将主程序补充完整将主程序补充完整START: PUSHDS SUB AX,AX PUSH AX ;保存程序前缀PSP地址 MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP MOV AX,0 ;AX清0 MOV WORD PTR RES,AX ;RES字单元清0 LEA BX,BUF ;置地址指针 MOV AL,2 CALL MULL ;过程调用计算RES+2X MOV AL,5 CAL
14、L MULL ;过程调用计算RES+5Y MOV AL,8 CALL MULL ;过程调用计算RES+8Z RET ;程序返回汇编语言程序设计汇编语言程序设计子程序编写子程序编写MULL PROC NEAR ;乘法子程序 MUL BYTE PTR BX ;做乘法结果在AX ADD WORD PTR RES,AX ;做加法 MOV AX,0 ;AX清0 INC BX ;地址加1 RET ;返回主程序 MULL ENDP汇编语言程序设计汇编语言程序设计四四. 现场现场保护与恢复保护与恢复subtsubt proc near proc near push ax push ax push bx pus
15、h bx push cx push cx push dx push dx pop dx pop dx pop cx pop cx pop bx pop bx pop ax pop ax ret retsubtsubt endp endp要保护的寄存器:应该是在子程序要保护的寄存器:应该是在子程序中将被使用,返回调用程序后仍然中将被使用,返回调用程序后仍然需要使用其原有内容的那些寄存器。需要使用其原有内容的那些寄存器。即保护调用程序和子程序两者在使即保护调用程序和子程序两者在使用上发生冲突的那些寄存器。用上发生冲突的那些寄存器。但在但在编程时,一时很难弄清哪些是有冲编程时,一时很难弄清哪些是有冲
16、突的寄存器,一种较为简单的方法突的寄存器,一种较为简单的方法是把所有的寄存器均加以保护。是把所有的寄存器均加以保护。一般在子程序中进行寄存器保护较一般在子程序中进行寄存器保护较好。好。即在子程序的开始部分,先进即在子程序的开始部分,先进行相关寄存器(主要是在子程序中行相关寄存器(主要是在子程序中使用的各寄存器)的保护。然后再使用的各寄存器)的保护。然后再进行子程序的处理操作。在执行完进行子程序的处理操作。在执行完子程序后,返回前,先恢复各寄存子程序后,返回前,先恢复各寄存器内容后,再返回调用程序。器内容后,再返回调用程序。汇编语言程序设计汇编语言程序设计(1) 通过寄存器传送参数通过寄存器传送
17、参数(2) 通过存储器传送参数通过存储器传送参数(3) 通过地址表传送参数地址通过地址表传送参数地址(4) 通过堆栈传送参数或参数地址通过堆栈传送参数或参数地址五五. 子程序的参数传送子程序的参数传送实现的方法是把子程序所需要的入口参实现的方法是把子程序所需要的入口参数,由调用程序予先放入指定的寄存器数,由调用程序予先放入指定的寄存器中。在进入子程序后,子程序就可直接中。在进入子程序后,子程序就可直接对这些寄存器内容进行操作了。同样子对这些寄存器内容进行操作了。同样子程序的运行结果,也可置入寄存器中,程序的运行结果,也可置入寄存器中,把它们作为子程序的出口参数寄存器使把它们作为子程序的出口参数
18、寄存器使用。用。请大家注意:参数的传递方法并不是固定不变的,即它们是可以综合请大家注意:参数的传递方法并不是固定不变的,即它们是可以综合使用的。依实现的需要和情况的不同,可以灵活使用其中一种方式,使用的。依实现的需要和情况的不同,可以灵活使用其中一种方式,也可以同时使用几种方式的混合。有的时候还可能并不需要参数传递。也可以同时使用几种方式的混合。有的时候还可能并不需要参数传递。汇编语言程序设计汇编语言程序设计例例1:十六进制到十进制的转换(:十六进制到十进制的转换(通过寄存器传送参数通过寄存器传送参数)hexidec segment ; 1610 assume cs: hexidec main
19、 proc farstart: push ds sub ax, ax push ax call hexibin ; 162 call crlf call binidec ; 210 call crlf retmain endphexidec ends end startCrlf proc near mov dl, 0dh mov ah,2 int 21h mov dl, 0ah mov ah,2 int 21h retCrlf endp汇编语言程序设计汇编语言程序设计hexibin proc nearhexibin proc near mov bx, 0mov bx, 0newchar: mo
20、v ah, 1 int 21h sub al, 30h jl exit cmp al, 10 jl add_to sub al, 27h cmp al, 0ah jl exit cmp al, 10h jge exitadd_to: mov cl, 4 shl bx, cl mov ah, 0 add bxbx, ax jmp newchar exit: rethexibin endphexibin endpbinidec proc nearbinidec proc near mov cx, 10000d call dec_divcall dec_div mov cx, 1000d call
21、dec_divcall dec_div mov cx, 100d call dec_divcall dec_div mov cx, 10d call dec_divcall dec_div mov cx, 1d call dec_divcall dec_div retbinidec endpbinidec endpdec_div proc neardec_div proc near mov ax, mov ax, bxbx mov dx, 0 mov dx, 0 div cx div cx mov mov bxbx, dx, dx mov dl, al mov dl, al add dl, 3
22、0h add dl, 30h mov ah, 2 mov ah, 2 int 21h int 21h ret retdec_div endpdec_div endp 1 a b 5 31 61 62 35汇编语言程序设计汇编语言程序设计例例2:累加数组中的元素(:累加数组中的元素(通过存储器传送参数通过存储器传送参数)data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data endscode segment assume cs:code,ds:datastart: mov ax, data mov ds, ax call
23、 proaddcall proadd mov ax,4c00h int 21hmain endpcode ends end startproadd proc nearproadd proc near push ax push cx push si lea si, aryary mov cx, countcount xor ax, axnext: add ax, si add si, 2 loop next mov sumsum,ax pop si pop cx pop ax retproadd endpproadd endp汇编语言程序设计汇编语言程序设计如果数据段定义如下:如果数据段定义如下
24、:data segmentdata segment ary dwary dw 1,2,3,4,5,6,7,8,9,10 1,2,3,4,5,6,7,8,9,10 count dwcount dw 10 10 sum dwsum dw ? ? ary1 dwary1 dw 10,20,30,40,50,60,70,80,90,100 10,20,30,40,50,60,70,80,90,100 count1 dwcount1 dw 10 10 sum1 dwsum1 dw ? ?data endsdata ends 如果直接访问内存变量,那么累加如果直接访问内存变量,那么累加数组数组aryary
25、和和数组数组ary1ary1中的元素不能用同一个子程序中的元素不能用同一个子程序 proaddproadd。那那如何能实现调用同一个子程序如何能实现调用同一个子程序proadd来累加另一个来累加另一个数组元素?数组元素?汇编语言程序设计汇编语言程序设计例例3:累加数组中的元素(:累加数组中的元素(通过地址表传送参数地址通过地址表传送参数地址)data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ? table dw 3 dup (?) ; 地址表data endscode segmentmain proc f
26、ar assume cs:code, ds:data push ds sub ax, ax push ax mov ax, data mov ds, ax mov table, offset ary ;把要传送给子程序把要传送给子程序 mov table+2, offset count;的参数都存放在地址的参数都存放在地址 mov table+4, offset sum ;表中,然后把地址表表中,然后把地址表 mov bx, offset table;的首地址通过寄存器的首地址通过寄存器 call proadd ;BX传送到子程序中去。传送到子程序中去。 retmain endp 汇编语言程序
27、设计汇编语言程序设计proadd proc nearproadd proc near push ax push cx push si push di mov si, bx mov di, bx+2 mov cx, di mov di, bx+4 xor ax, axnext: add ax, si add si, 2 loop next mov di,ax pop di pop si pop cx pop ax retproadd endpproadd endpcode ends end main 30d 40d 50d 60d 70d 80d 90d100d 10d ary 20d 10dc
28、ountsumtable00000000001400140016001600180018000000000014001400160016(bx)(bx)(si)(si)(di)(di)550d550d存储单元的内容存储单元的内容汇编语言程序设计汇编语言程序设计例例4:累加数组中的元素(:累加数组中的元素(通过堆栈传送参数地址通过堆栈传送参数地址) 在主程序里把参数地址保存到堆栈中,在子程序里从堆栈中取出在主程序里把参数地址保存到堆栈中,在子程序里从堆栈中取出参数以达到传送参数的目的。参数以达到传送参数的目的。data segmentdata segment ary dw 10,20,30,40
29、,50,60,70,80,90,100 ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 count dw 10 sum dw ? sum dw ?data endsdata endsstack segment stack segment dw 100 dup (?) dw 100 dup (?) ;堆栈全是字操作,必须用;堆栈全是字操作,必须用DWDW tos label word tos label word ;栈顶指针也必须是字类型;栈顶指针也必须是字类型stack endsstack ends 汇编语言程序设计汇编语言程序设计code
30、segmentmain proc far assume cs:code, ds:data, ss:stackstart: mov ax, stack mov ss, ax mov sp, offset tos ;堆栈段及;堆栈段及SPSP设置方法设置方法 mov ax, data mov ds, ax mov bx, offset ary push bx mov bx, offset count push bx mov bx, offset sum push bx ;把参数地址保存到堆栈把参数地址保存到堆栈 call proadd mov ax, 4c00h int 21hmain endpc
31、ode ends end start汇编语言程序设计汇编语言程序设计proadd proc nearproadd proc near push bppush bp mov mov bpbp, sp, sp push ax push cx push si push di mov si,bpbp+8 mov di,bpbp+6 mov cx,di mov di,bpbp+4 xor ax, axnext: add ax, si add si, 2 loop next mov di,ax pop di pop si pop cx pop ax pop bp ret 6ret 6proadd endp
32、proadd endp(ip)sumcountarray (di) (si) (cx) (ax)(sp)(bpbp)(bp) (bpbp)+8 (bpbp)+6 (bpbp)+4tosCALL指令指令堆栈最满的状态堆栈最满的状态汇编语言程序设计汇编语言程序设计子程序的嵌套:子程序的嵌套:一个子程序也可以作为调用程序去调用另一个子程序。一个子程序也可以作为调用程序去调用另一个子程序。 主程序主程序 子程序子程序A A 子程序子程序B B六六. 子程序的嵌套与递归调用子程序的嵌套与递归调用 call call proc_Aproc_Aproc_Aproc_A call call proc_Bpro
33、c_BCall Call proc_Aproc_Aretretproc_Bproc_B retret子程序的递归调用是指一个子子程序的递归调用是指一个子程序直接或间接地调用自己。程序直接或间接地调用自己。递归调用要注意必须有结束递递归调用要注意必须有结束递归调用的判断语句。归调用的判断语句。汇编语言程序设计汇编语言程序设计编写子程序计算(编写子程序计算(bx)!=axFact proc near and bx,bx jzfact1 ;等于等于0跳转跳转 pushbx dec bx call fact ;递归调用递归调用L: pop bx mulbx ;结果在结果在ax中中 retFact1:
34、mov ax,1 retFact endp编写程序计算编写程序计算4!+7! . . ;主程序开始部分主程序开始部分 mov bx, 4 ;入口参数入口参数 call fact ;调用子程序调用子程序M: push ax ;保存保存4!的结果的结果 mov bx, 7 call fact ;(ax)=7! pop bx ;(bx)=4! add ax,bx . .递归子程序:递归子程序:n! n ( n - 1 ) ( n - 2 ) 1 3! 3 21= 6 0!=1 n!=n(n-1)!汇编语言程序设计汇编语言程序设计子程序如果段间调用时,必须定义为子程序如果段间调用时,必须定义为FARF
35、AR类型类型。段间调用通常用于不同模块之间的调用。段间调用通常用于不同模块之间的调用。编写不同模块的段间调用程序,应该注意以下几个个问题:编写不同模块的段间调用程序,应该注意以下几个个问题: (1 1)主程序模块和子程序模块分别汇编,然后用连接)主程序模块和子程序模块分别汇编,然后用连接程序将它们连接在一起。程序将它们连接在一起。 (2 2)在主程序模块中,主程序所调用的外部过程名必)在主程序模块中,主程序所调用的外部过程名必须用须用EXTRNEXTRN伪指令说明。伪指令说明。 (3 3)在过程模块中,提供给外段调用的过程名必须用)在过程模块中,提供给外段调用的过程名必须用PUBLICPUBL
36、IC伪指令说明。伪指令说明。 (4 4)模块间其它公用符号名及外部符号名的定义不可)模块间其它公用符号名及外部符号名的定义不可缺少。缺少。七七. 多模块程序设计(段间调用)多模块程序设计(段间调用)汇编语言程序设计汇编语言程序设计局部符号:局部符号:在本模块中定义,在本模块中引用的符号。在本模块中定义,在本模块中引用的符号。不同模块中不同模块中的局部符号允许重名。的局部符号允许重名。外部符号:外部符号:在某一模块中定义,在另一模块中引用的符号。在某一模块中定义,在另一模块中引用的符号。要连接要连接的模块中的外部符号不允许重名。的模块中的外部符号不允许重名。 PUBLIC PUBLIC 符号符号
37、 EXTRN EXTRN 符号符号: :类型类型 extrn proadd : farextrn proadd : far ;在本模块中引用其他模块;在本模块中引用其他模块 ;中定义的外部符号;中定义的外部符号proaddproaddcode1 segmentcode1 segmentstart:start: call far ptr proadd call far ptr proadd code1 endscode1 ends end start end start; proadd1.asmpublic proaddpublic proadd ;在本模块中定义可供;在本模块中定义可供 ;其他
38、模块引用的符号;其他模块引用的符号code2 segmentcode2 segmentproadd proc farproadd proc far ret retproadd endpproadd endpcode2 endscode2 ends end end ; proadd2.asm汇编语言程序设计汇编语言程序设计将【例将【例6.16.1】 中的段内调用改为段间调用中的段内调用改为段间调用已知三个八位无符号数已知三个八位无符号数X X、Y Y、Z Z,分别存放于,分别存放于BUFBUF、BUF+1BUF+1和和BUF+2BUF+2存储单元,存储单元,计算计算2X+5Y+8Z2X+5Y+8
39、Z,结果送,结果送RESRES和和RES+1RES+1单元。单元。NAME EXAM6_2EXTRN MULL:FAR ;外部引用说明PUBLIC RES ;定义公用名DATA SEGMENTBUF DB 71H,0A4H,9BHRES DB 2 DUP(?)DATA ENDSSTACK SEGMENT DW 50 DUP(?)TOP LABEL WORDSTACK ENDSCODE1 SEGMENTASSUME CS:CODE1, DS:DATA, SS:STACKMAIN PROC FAR START:MAIN ENDPCODE1 ENDS END START NAME L6_2A EXT
40、RN RES:BYTE ;外部引用说明;外部引用说明 PUBLIC MULL ;定义公用名;定义公用名CODE2 SEGMENT ASSUME CS:CODE2MULL PROC FAR ;乘法子程序;乘法子程序 MUL BYTE PTR BX ;做乘法结果在;做乘法结果在AX ADD WORD PTR RES, AX ;做加法;做加法 MOV AX,0 ;AX清清0 INC BX ;地址加;地址加1 RET ;返回主程序;返回主程序 MULL ENDPCODE2 ENDS END汇编语言程序设计汇编语言程序设计例例5:用:用两个模块两个模块累加数组累加数组元素。元素。; proadd1.as
41、mextrn proadd : farextrn proadd : fardata segment common ;允许同名段重叠;允许同名段重叠 ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data endscode1 segment main proc far assume cs:code1, ds:datastart: mov ax, data mov ds, ax call far ptr proadd mov ah, 4ch int 21hmain endpcode1 ends end start汇编语言程序设计汇编语言程序设计;
42、proadd2.asmpublic proaddpublic proadddata segment common ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data ends code2 segment proadd proc far assume cs:code2,ds:data mov ax, data mov ds, ax push ax push cx push si lea si, ary mov cx, count xor ax, ax next: add ax, si add si, 2 loop next mov sum,a
43、x pop si pop cx pop ax retproadd endpcode2 ends end汇编语言程序设计汇编语言程序设计补充: 模块化程序设计思想 在设计大型程序时,常常要将整个问题分解为若干个在设计大型程序时,常常要将整个问题分解为若干个小问题,必要时还要将小问题再次分解为更小的若干问小问题,必要时还要将小问题再次分解为更小的若干问题,每个小问题编写成独立的源文件,最后将所有的源题,每个小问题编写成独立的源文件,最后将所有的源文件连接起来组合成一个大程序。也就是说,一个程序文件连接起来组合成一个大程序。也就是说,一个程序往往由多个源文件组成,那么构成一个程序的各个相对往往由多个
44、源文件组成,那么构成一个程序的各个相对独立的源文件通常称为模块。独立的源文件通常称为模块。 这样把一个程序分成多个功能相对独立的程序模块这样把一个程序分成多个功能相对独立的程序模块分别编制、调试后,再用连接程序把它们连接在一起生分别编制、调试后,再用连接程序把它们连接在一起生成一个完整的程序的设计方法称为模块化程序设计。成一个完整的程序的设计方法称为模块化程序设计。汇编语言程序设计汇编语言程序设计模块化程序设计的优点模块化程序设计的优点 开发速度快开发速度快 可维护性与可读性强可维护性与可读性强 可移埴性强可移埴性强模块划分的原则和方法模块划分的原则和方法模块划分是一个自上而下的过程。主模块是
45、一个总控模块,首先确模块划分是一个自上而下的过程。主模块是一个总控模块,首先确定主要的模块,也就是说,要把总任务划分成几个主要的子任务。定主要的模块,也就是说,要把总任务划分成几个主要的子任务。一般来说,可以分成输入任务、输出任务和一个或多个进行处理或一般来说,可以分成输入任务、输出任务和一个或多个进行处理或计算的子任务。在划分子模块的过程中应该明确每个模块的功能、计算的子任务。在划分子模块的过程中应该明确每个模块的功能、数据结构及相互之间的关系。第二步,对这些主要的子模块根据需数据结构及相互之间的关系。第二步,对这些主要的子模块根据需要再划分成下一层的子模块。第三步,重复上述过程,一直到程序
46、要再划分成下一层的子模块。第三步,重复上述过程,一直到程序分成易于理解和易于实现的小模块为止。分成易于理解和易于实现的小模块为止。段的定义 SEGMENTSEGMENT伪指令的完整的格式为:伪指令的完整的格式为: 段名段名 SEGMENT SEGMENT 定位类型定位类型 组合类组合类型型 类别类别 段名段名 ENDSENDS定位类型定位类型 定位类型用于指定该段的段起始地定位类型用于指定该段的段起始地址的特性,连接程序连接目标文件时,址的特性,连接程序连接目标文件时,根据定位类型来确定段的开始地址。根据定位类型来确定段的开始地址。一共有一共有5 5种选择。种选择。 1PAGE(页) 段的起始
47、地址从页边界开始,也段的起始地址从页边界开始,也就是说必须为就是说必须为256256的倍数,即该地址的的倍数,即该地址的最后最后8 8位二进制位应为位二进制位应为0 0。 2PARA(节) 段的起始地址必须从段边界开始,段的起始地址必须从段边界开始,也就是说必须为也就是说必须为1616的倍数,即该地址的倍数,即该地址的最后的最后4 4位二进制位应为位二进制位应为0 0。 3DWORD(双字) 段的起始地址必须从双字边界段的起始地址必须从双字边界开始,也就是说必须为开始,也就是说必须为4 4的倍数,的倍数,即该地址的最低两位二进制位应为即该地址的最低两位二进制位应为0 0。 4WORD(字) 段的起始地址必须从字边界开段的起始地址必须从字边界开始,也就是说必须为偶数地址,即始,也就是说必
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沈阳理工大学《构成艺术》2021-2022学年第一学期期末试卷
- 沈阳理工大学《单片机原理与接口技术》2021-2022学年期末试卷
- 广东省预拌混凝土买卖合同
- 孩子上学购房合同摘抄表
- 合同变更及终止管理办法
- 2024-2025学年高中政治第四单元认识社会与价值选择11.2社会历史的主体作业含解析新人教版必修4
- 2024《秦皇岛市劳动合同》
- 2024年泰安客运资格证模拟考试题
- 2024工程桩基检测合同书
- 第23课《黄继光》第一课时(分层作业)-【上好课】四年级语文下册部编版
- 小学五年级期中家长会课件(共二篇)
- DZ∕T 0261-2014 滑坡崩塌泥石流灾害调查规范(1:50000)(正式版)
- DZ∕T 0011-2015 地球化学普查规范(1:50000)(正式版)
- 学生体育学情分析报告
- 三年级上册语文 第五单元《交流平台与初试身手》教学课件
- “枫桥经验”课件
- 第15课 列强入侵与中国人民的反抗斗争 教学设计-2023-2024学年中职高一上学期高教版(2023)中国历史全一册
- 2024年广西玉林北流市镇街道社区残疾人专职委员招聘笔试冲刺题(带答案解析)
- 【管道滑脱应急预案脚本】管道滑脱应急预案演练
- 2024年营养指导员理论知识考试题库及答案
- 2024年四川成都青白江蓉欧园区运营管理有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论