匯編語(yǔ)言第六章子程序結(jié)構(gòu).ppt
《匯編語(yǔ)言第六章子程序結(jié)構(gòu).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《匯編語(yǔ)言第六章子程序結(jié)構(gòu).ppt(44頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、在程序設(shè)計(jì)中,可以發(fā)現(xiàn)一些多次無(wú)規(guī)律重復(fù)的程序段或語(yǔ)句序列。解決此類問(wèn)題一個(gè)行之有效的方法就是將它們?cè)O(shè)計(jì)成可供反復(fù)調(diào)用的獨(dú)立的子程序結(jié)構(gòu),以便在需要時(shí)調(diào)用。在匯編語(yǔ)言中,子程序又稱過(guò)程。 調(diào)用子程序的程序稱為主調(diào)程序或主程序。,第6章 子程序結(jié)構(gòu),子程序的基本結(jié)構(gòu)包括以下幾個(gè)部分: (1)子程序定義 (2)保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng) (3)子程序體 (4)子程序返回,子程序的結(jié)構(gòu),子程序的定義是由過(guò)程定義偽指令PROC和ENDP來(lái)完成的。其格式如下: 過(guò)程名 PROC NEAR/FAR 過(guò)程名 ENDP 其中PROC表示過(guò)程定義開(kāi)始,ENDP表示過(guò)程定義結(jié)束。過(guò)程名是過(guò)程入口地址的符號(hào)表示
2、。 一般過(guò)程名同標(biāo)號(hào)一樣,具有三種屬性,即段屬性、偏移地址屬性以及類型屬性(NEAR 和 FAR)。,6.1.1 子程序的定義,6.1 子程序的設(shè)計(jì)方法,1.如果調(diào)用程序和過(guò)程在同一代碼段中,則使用NEAR屬性;,MAIN PROC FAR CALL SUBR1 RET MAIN ENDP ; SUBR1 PROC NEAR RET SUBR1 ENDP,MAIN PROC FAR CALL SUBR1 RET SUBR1 PROC NEAR RET SUBR1 ENDP MAIN ENDP,例
3、6.1,過(guò)程嵌套定義,2. 如果調(diào)用程序和過(guò)程不在同一代碼段中,則使用FAR屬性;,SEGX SEGMENT SUBT PROC FAR RET SUBT ENDP CALL SUBT SEGX ENDS ; SEGY SEGMENT CALL SUBT SEGY ENDS,例6.2,6.1.2 子程序的調(diào)用和返回,調(diào)用: CALL far/near ptr 過(guò)程名,返回: RET n,6.1.3 保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng),例如:若子程序PROG中改變了寄存器AX,BX,CX,DX的值,則 可采用如下方法保護(hù)
4、和恢復(fù)現(xiàn)場(chǎng)。 PROGPROC PUSHAX PUSH BX PUSHCX;保護(hù)現(xiàn)場(chǎng) PUSHDX POPDX POPCX POPBX;恢復(fù)現(xiàn)場(chǎng) POPAX RET;返回?cái)帱c(diǎn)處 PROCENDP,6.1.4 主程序與子程序參數(shù)傳遞方式,1 通過(guò)寄存器傳送參數(shù) 這是最常用的一種方式,使用方便,但參數(shù)很多時(shí)不能使用這種方法。 例6.3 十進(jìn)制到十六進(jìn)制轉(zhuǎn)換的程序。程序要求從鍵盤取得一個(gè)十進(jìn)制數(shù),然后把該數(shù)以十六進(jìn)制的形式在屏幕上顯示出來(lái)。,開(kāi)始,調(diào)用DECIBIN,調(diào)用CRLF,調(diào)用BINIHEX,調(diào)用CRLF,結(jié)束,,,,,,從鍵盤取得十進(jìn)制 數(shù),保存到B
5、X中,顯示回車和換行,用十六進(jìn)制形式 顯示BX中的數(shù),,,,,,,,,Decihex segment assume cs:Decihex Main proc far Repeat: push ds xor ax, ax push ax call decibin call crlf call binihex call crlf ret Main endp,Decibin proc near mov bx, 0 Newchar: mov ah, 1 int 21h sub al, 30h jl exit c
6、mp al, 9 jg exit cbw xchg ax, bx mov cx, 10 mul cx xchg ax, bx ;每次乘的 add bx, ax ;結(jié)果在BX中 jmp newchar Exit : ret Decibin endp,Binihex proc near mov ch, 4 Rotate: mov cl, 4 rol bx, cl mov dl, bl and dl, 0fh add dl, 30h cmp dl, 3ah jl print
7、 add dl, 7h Print: mov ah, 2 int 21h dec ch jnz rotate ret Binihex endp,Crlf proc near mov ah, 2 mov dl, odh int 21h mov dl, oah int 21h ret Crlf endp Decihex ends end repeat,如果過(guò)程和調(diào)用過(guò)程在同一源文件(同一模塊)中,則過(guò)程可直接訪問(wèn)模塊中的變量。 例 6.4_1 主程序MAIN和過(guò)程PROADD在同一源文件中,要求用過(guò)程PROADD累加數(shù)組
8、的所有元素,并把和(不考慮溢出的可能性)送到指定的存儲(chǔ)單元中去,DATA SEGMENT ARY DW 100 DUP (?) COUNT DW 100 SUM DW ? DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE , DS:DATA START: PUSH DS SUB AX ,AX PUSH AX MOV AX , DATA CALL NEAR PTR PROADD RET MAIN ENDP,PROADD PROC NEAR
9、 PUSH AX PUSH CX PUSH SI PUSH DI LEA SI ,ARY MOV CX ,COUNT XOR AX , AX NEXT: ADD AX , SI ADD SI , 2 LOOP NEXT MOV SUM , AX POP DI POP SI POP CX POP AX RET PROADD ENDP CODE ENDS END START,,CODE SEGMENT ARY DW 1
10、00 DUP(?) COUNT DW 100 SUM DW ? NUM DW 100 DUP (?) N DW 100 TOTAL DW ? MOV TABLE , OFFSET ARY MOV TABLE+2, OFFSET COUNT MOV TABLE+4 , OFFSET SUN MOV BX , OFFSET TABLE CALL PROADD ;計(jì)算SUM ,PROADD PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI PUSH SI,BX MOV DI , B
11、X+2 MOV CX , DI MOV DI , BX+4 XOR AX , AX NEXT: ADD AX , SI ADD SI , 2 LOOP NEXT MOV 【DI, AX POP DI POP SI POP CX POP AX RET PROADD ENDP CODE ENDS END START,3 通過(guò)地址表傳遞參數(shù),例6.4_2,4 通過(guò)堆棧傳遞地址或參數(shù),Data segment Ary dw 100 dup(?) Count db
12、100 Sum dw ? Data ends Stack segment para stack stack dw 100 dup(?) tos label word Stack ends Code1 segment assume cs:code1, ds:data, ss;stack Main proc far Start: push ds xor ax, ax push ax mov ax, data mov ds, ax,mov ax,stack mov ss, ax mov sp,offset tos Mov bx, offset ar
13、y Push bx Mov bx, offset count Push bx Mov bx, offset sum Push bx Call far ptr proadd mov al, sum mov dl, al mov ah, 2 int 21h ret Main endp Code1 ends,例6.4_3,,,,,,,,,,Sum地址 Count地址 Ary地址,,sp,di si cx ax bp,(Sp)bp,,,,,IP CS,,Code2 segment assume cs:code2 Proadd proc far push b
14、p mov bp, sp push ax push cx push si push di mov si, bp+0ah mov di, bp+08h mov cl, di mov di, bp+06h xor al, al Again: add al, si inc si dec cl jnz again mov di, al pop di pop si pop cx,,pop ax pop bp ret 6 Proadd endp Code2
15、ends end start,bp+0ah,bp+08h,bp+06h,Sp,Sp,Sp,Sp,,,,,Sp,,(1) PUBLIC偽指令 格式:PUBLIC 符號(hào) ,符號(hào) 功能:說(shuō)明其后的符號(hào)是全局符號(hào)。全局符號(hào)能被其他模塊引用。(局部符號(hào)) (2) EXTRN偽指令 格式:EXTRN 符號(hào):類型 ,符號(hào):類型 功能:說(shuō)明在本模塊中需要引用的、由其他模塊定義的符號(hào),即外部符號(hào)。,5 多個(gè)模塊之間的參數(shù)傳送問(wèn)題,,; source module 1 extrn var2:word,lab2:far public var1,lab1 Data1 segment var1 db ?
16、var3 dw ? var4 dw ? Data1 ends code1 segment assume cs:code1,ds:data1 Main proc far start: mov ax , data1 mov ds,ax lab1: mov ah,4ch int 21h Main endp Code1 ends End start,; source module 2 extern var1:byte,var4:word public var2 Data2 segment var2 dw ? var3 dw ? Data2 ends code2 se
17、gment assume cs:code2,ds:data2 Main proc far start: mov ax , data2 mov ds,ax mov ah,4ch int 21h Main endp Code2 ends End start,注意:應(yīng)先有public 定義,然后才有extrn說(shuō)明,; source module 3 extern lab2: far public lab2,lab3 Data2 segment var2 dw ? var3 dw ? Data2 ends code3 segment assume cs:code3 Lab
18、2: .. Lab3: .. Code3 ends End,例6.5 多個(gè)模塊間的參數(shù)共享,;Source model 1 EXTERN proadd: far DATA SEGMENT common ARY DW 100 DUP (?) COUNT DW 100 SUM DW ? DATA ENDS CODE1 SEGMENT MAIN PROC FAR ASSUME CS:CODE1 , DS:DATA START: PUSH DS SUB AX ,AX PUSH AX MOV AX , DATA CA
19、LL far ptr PROADD RET MAIN ENDP CODE1 ENDS END START,主程序和子過(guò)程不在同一個(gè)模塊的時(shí)參數(shù)傳遞方法一,LOOP NEXT: MOV SUM , AX POP DI POP SI POP CX POP AX RET PROADD ENDP CODE2 ends END,;Source model 2 PUBLIC PROADD DATA SEGMENT common ARY DW 100 DUP (?) COUNT DW 100 SUM DW ? DATA ENDS CODE2 S
20、EGMENT PROADD PROC FAR ASSUME CS:CODE2 , DS:DATA MOV AX,DATA MOV DS,AX PUSH AX PUSH CX PUSH SI PUSH DI LEA SI, ARY MOV CX, COUNT XOR AX, AX NEXT: ADD AX, SI ADD SI, 2,(如例6.4_1的參數(shù)傳遞可利用段覆蓋),;Source model 1 extern var1 : word extern output: far extern var2 : word public quit local_data segm
21、ent var dw 5 local_data ends code segment assume cs:code,ds:local_data main proc far start: mov ax,local_data mov ds,ax mov bx,var mov ax,seg var1 mov es,ax add bx,es:var1,主程序和子過(guò)程不在同一個(gè)模塊的時(shí)參數(shù)傳遞方法二, mov ax,seg var2 mov es,ax sub es:var2,50 jmp ouput quit:mov ah,4ch int 21h main endp co
22、de ends end start ;Source model 2 public var1 extdata1 segment var1 dw 10 extdata1 ends end,;source model 3 public var2 extern quit: far extdata2 segment var2 dw 3 extdata2 ends public output program segment assume cs:program, ds:extdata2 output: jmp quit program ends end,(例6.6 含三個(gè)
23、源模塊),;Source model 1 Global segment public Extern var1:word Extern var2:word Global ends Local_data segment Local_data ends code segment assume cs:code, ds: local_data, es:global main proc far,主程序和子過(guò)程不在同一個(gè)模塊的時(shí)參數(shù)傳遞方法三,start: mov x,local_data mov ds,ax mov ax, global mov es,ax mov bx,es:var1 add
24、 es:var2,bx mov ah,4ch int 21h main endp code ends end start,(例6.7 含二個(gè)源模塊),;source model 2 Global segment public public var1 public var2 var1 dw ? var2 dw ? Global ends end,6.1.5 增強(qiáng)功能的過(guò)程定義偽操作,Procname PROC attributes field USER register list ,parameter field Procname ENDP Attr
25、ibutes field(屬性字段)包括: Distance : near 、far Language type :說(shuō)明是那種高級(jí)語(yǔ)言的子程序 如pascal 、c 等。 Visibility : 說(shuō)明程序的可見(jiàn)性 是private 或是public。 Prologue :是一個(gè)宏的名字,允許用宏來(lái)控制過(guò)程的入口或出口有關(guān)的代碼 USER:該字段用來(lái)指定用戶所需保存和恢復(fù)的寄存器表。 Parameter field: 參數(shù)字段 ,允許用戶指定該過(guò)程所用的參數(shù) 。 標(biāo)識(shí)符:類型,標(biāo)識(shí)符:類型,Data segment Ary db 10 dup(?) Count db 10 Sum
26、 db ? Data ends Stack segment para stack stack db 100 dup(?) Stack ends Code1 segment assume cs:code1, ds:data, ss:stack Main proc far Start: push ds xor ax, ax push ax mov ax, data mov ds, ax,Mov bx, offset ary Push bx Mov bx, offset count Push bx Mov bx, offset sum Push
27、 bx Call far ptr proadd mov al, sum mov dl, al mov ah, 2 int 21h ret Main endp Code1 ends,對(duì)例6.4 采用用增強(qiáng)功能過(guò)程定義偽操作實(shí)現(xiàn),Code2 segment assume cs:code2 Proadd proc far push bp mov bp, sp push ax push cx push si push di mov si, bp+0ah mov di, bp+08h mov
28、 cl, di mov di, bp+06h xor al, al Again: add al, si inc si dec cl jnz again mov di, al pop di pop si pop cx pop ax pop bp ret 6 Proadd endp Code2 ends end start,Code2 segment assume cs:code2 Proadd proc pascal user ax cx si di , para:word,parc
29、:word,pars:word mov si, para mov di, parc mov cl, di mov di, pars xor al, al Again: add al, si inc si dec cl jnz again mov di, al ret Proadd endp Code2 ends end start,,,,,,,,,,Sum地址 Count地址 Ary地址,(bp),,,,,IP CS,,,( bp +2),( bp +4),( bp +6),( bp +8),( bp +
30、a),原始bp,pars,para,parc,局部變量,di si cx ax,( bp -2),Code2 segment assume cs:code2 Proadd proc far push bp mov bp, sp push ax push cx push si push di mov si, bp+0ah mov di, bp+08h mov cl, di mov di, bp+06h xor al, al Again: add al, si inc si dec cl
31、 jnz again mov di, al pop di pop si pop cx pop ax pop bp ret 6 Proadd endp Code2 ends end start,Code2 segment assume cs:code2 Proadd proc C user ax cx si di , pars:word,parc:word,para:word mov si, para mov di, parc mov cl, di mov di, pars x
32、or al, al Again: add al, si inc si dec cl jnz again mov di, al ret Proadd endp Code2 ends end start,,,,,,,,,,Sum地址 Count地址 Ary地址,(bp),,,,,IP CS,,,( bp +2),( bp +4),( bp +6),( bp +8),( bp +a),原始bp,pars,para,parc,局部變量,di si cx ax,( bp -2),增強(qiáng)功能的過(guò)程定義偽操作除了以上功能外 ,還可以在過(guò)程中定義局部變量。局部變
33、量是在過(guò)程內(nèi)部使用的變量,他是在過(guò)程調(diào)用是在堆棧中建立的,在退出過(guò)程是被釋放。 可以用 LOCAL 定義 LOCAL 變量:類型,變量:類型,,,,,,,,,,Sum地址 Count地址 Ary地址,(bp),,,,,IP CS,,,( bp +2),( bp +4),( bp +6),( bp +8),( bp +a),原始bp,( bp -2),( bp -4),局部變量,例6.8 編程把以ASCII形式表示的十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),.model small .386 .stack 200h .data Ascval db 12345 Binval dw ? .code Main pro
34、c far Start: mov ax,data mov ds,ax, lea bx,asval push bx lea bx,binval push bx call convaxbin mov ah,4ch int 21h Main endp,Convascbin proc pascal uses ax,bx,cx,dx,si,di,par1:word,par2:word Local asclen:word,mulfact:word mov bx,10 mov si,par1 mov di,par2 sub di,si mov asclen,di
35、 mov cx,asclen add si,asclen dec si mov mulfact,1 mov di,par2 mov di,0 Next: mov al,si and ax,000fh,Mul mulfact Add di,ax Mov ax,mulfact Mul bx Mov mulfact,ax Dec si Loop next Ret Convascbin endp end main,push bp mov bp,sp add sp,0fch push ax push bx push cx push dx pus
36、h si push di mov bx,oah mov si,bp+6 mov di,bp+4 sub di,si mov bp2】,di mov cx,bp-2 add si,bp-2 dec si mov word ptr bp-2,0001 mov di,bp+4 mov word ptr di,0,例6.8 經(jīng)過(guò)匯編后的Convascbin子過(guò)程程序,next : mov al,si and ax,000fh mul word ptr bp-4 add di ,ax mov ax,bp-4 mul bx mov bp-4
37、, ax dec si loop next pop di pop si pop dx pop cx pop bx pop ax mov sp,bp pop bp ret 0004,6.2 子程序的嵌套 一個(gè)子程序可以作為調(diào)用程序去掉用另一個(gè)子程序,這種情況稱為子程序的嵌套。嵌套深度不限。但應(yīng)注意的問(wèn)題是堆棧的溢出:上溢、下溢 遞歸子程序:如果一個(gè)子程序調(diào)用的是子程序的本身,就是遞 歸子程序。,例 計(jì)算 N!=N*(N-1)*(N-2)* *1 -------遞歸子程序,Data segment Num db 3 Result
38、 dw ? Data ends Stack segment para stack stack db 100 dup(?) tos label word Stack ends Code segment assume cs:code, ds:data, ss:stack Main proc far Begin: push ds xor ax, ax push ax mov ax, data mov ds, ax,mov ax,stack mov ss,ax mov sp, offset tos mov ah, 0 mov al, num
39、 call factor mov result, ax ret Main endp,Factor proc push ax sub ax, 1 jne f_cont pop ax jmp return f_cont: call factor pop cx mul cl return: ret factor endp Code ends end begin,,,,,,,,,,,,,,,IP1,Mov result, ax 地址,3,IP2,Pop cx 地址,2,IP3,Pop cx 地址,1,ax =1,IP POP CX
40、 地址,,cx =2,ax*cx =1*2,IP POP CX 地址,,cx =3,ax*cx =1*2*3,,,IP Mov result, ax 地址,,,常用的DOS系統(tǒng)功能調(diào)用,1單字符輸入(1號(hào)調(diào)用) 2單字符顯示(2號(hào)調(diào)用) 3打印輸出(5號(hào)調(diào)用) 4結(jié)束調(diào)用(4CH號(hào)調(diào)用) 5顯示字符串(9號(hào)調(diào)用) 6字符串輸入(10號(hào)調(diào)用),1單字符輸入(1號(hào)調(diào)用) 格式:MOVAH,1 INT21H 功能:從鍵盤輸入字符的ASCII碼送入寄存器AL中,并送顯示器顯示。 2單字符顯示(2號(hào)調(diào)用) 格式:MOV DL,待顯示字符的ASCII碼 MOV AH,2 INT 21H 功
41、能:將DL寄存器中的字符送顯示器顯示.,3打印輸出(5號(hào)調(diào)用) 格式:MOVDL,待打印字符的ASCII碼 MOV AH,5 INT 21H 功能:將DL寄存器中的字符送打印機(jī)打印。 4結(jié)束調(diào)用(4CH號(hào)調(diào)用) 格式:MOVAH,4CH INT21H 功能:終止當(dāng)前程序并返回調(diào)用程序。,5顯示字符串(9號(hào)調(diào)用) 格式:LEA DX,待顯示字符串首偏移地址 MOV AH,9 INT 21H 功能:將當(dāng)前數(shù)據(jù)區(qū)中以結(jié)尾的字符串送顯示器顯示。 6字符串輸入(10號(hào)調(diào)用) 格式:LEA DX,緩沖區(qū)首偏移地址 MOV AH,10 INT 21H 功能:從鍵盤上輸入一字符串到用戶定義的輸入緩
42、沖區(qū)中,并送顯示器顯示。,maxlen db 32 actlen db ? string db 32 dup(?),lea dx , maxlen mov ah,0ah int 21h,說(shuō)明:緩沖區(qū)的第一個(gè)字節(jié)保存最大字符數(shù),這個(gè)最 大字符數(shù)由用戶程序給出。如果鍵入的字符數(shù) 比此數(shù)大,機(jī)器發(fā)出嘟嘟聲。第二個(gè)字節(jié)存放 實(shí)際輸入的字節(jié)數(shù),這個(gè)不是由用戶填入的而 由功能A填入的。在這兩個(gè)字節(jié)之后,才是我們 輸入的字符串。,6.3 子程序舉例,例1:HEXIDEX是一個(gè)十六進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)的程序。要求把從鍵盤輸入的0 FFFFH的十六進(jìn)制正數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)并在屏幕上顯示出來(lái)。,,Dis
43、play equ 2h Key equ 1h Doscall equ 21h Hexidec segment Main proc far assume cs:hexidec Start: push ds sub ax,ax push ax call hexidec call crlf call binidec call crlf jmp main ret main endp,Crlf proc near mov dl ,0ah mov ah,display int boscall mov dl,0dh mov ah,display
44、 int doscall ret crlf endp Hexidec ends end start,Hexidec proc near mov bx ,0 Newchar: mov key_in int doscall sub al,30h jl exit cmp al, 10d jl add_to sub al ,27h cmp al,0ah jl exit cmp ah,10h jge exit Add_to: mov cl ,4 shl bx , cl mov ah ,0
45、 add bx,ax jmp Exit: Ret Hexidec endp,Binidec proc near mov cx , 10000d call dec_div mov cx , 1000d call dec_div mov cx,100d call dec_div mov cx,10d call dec_div mov cx,1d call dec_div ret Dec_div proc near mov ax, bx mov dx ,0 div cx mov bx,d
46、x mov dl,al add dl,30h mov ah,display int doscall,ret dec_div endp Binidec endp,例2:一個(gè)簡(jiǎn)單的信息檢索系統(tǒng)。在數(shù)據(jù)區(qū)里,有10個(gè)不同的信息,編號(hào)為09,每個(gè)信息包括30個(gè)字符?,F(xiàn)在要編制一個(gè)程序:從鍵盤接收09之間的一個(gè)編號(hào),然后在屏幕上顯示相應(yīng)編號(hào)的信息的內(nèi)容。,Datarea segment thirty db 30 msg0 db 0 I like my IBM-PC-------------- msg1 db 1 I like my IBM-P
47、C-------------- msg2 db 2 I like my IBM-PC-------------- msg3 db 3 I like my IBM-PC-------------- msg4 db 4 I like my IBM-PC-------------- msg5 db 5 I like my IBM-PC-------------- msg6 db 6 I like my IBM-PC-------------- msg7 db 7 I like my IBM-PC-------------- msg8 db 8 I like
48、my IBM-PC-------------- msg9 db 9 I like my IBM-PC-------------- errmsg db error!!! Invalid praameter Datarea ends,Stack segment db 256 dup(0) tos lable word Stack ends Prognam segment assume cs:prognam ,ds:datarea,ss:stack Start: push ds xor ax,ax push ax mov ax,stack mov ss,ax
49、 mov ax,datarea mov ds,ax mov sp,offset tos Begin:mov ah,1 int 21h sub al,0 jc error cmp al, 9 ja error,Mov bx,offset msg0 Mul thirty Add bx,ax Call display Jmp begin Error: mov bx,offset errmsg call display ret Display proc near mov cx,30 mov dl,bx call
50、 dispchar inc bx loop disp1 mov dl,0dh call dispchar mov dl,0ah call dispchar ret Dispchar endp,,Dispchar proc naer mov ah,2 int 21h ret Dispchar endp Main endp Prognam ends End start,例3:人名排序程序。先從終端鍵入最多30個(gè)人名,當(dāng)所有人名都進(jìn)入后,按字母上升的次序?qū)⑷嗣判?,并在屏幕上顯示已經(jīng)排好的人名。,,Data segment
51、 namepar label byte maxnlen db 21 namelen db ? namefld db 21 dup(?) crlf db 13,10,$ endaddr dw ? messg1 db name?,$” messg2 db sorted names,13,10,$ namectr db 0 nametab db 30 dup (20 dup( )) namesav db 20 dup (?),13,10,$ swapped db 0 Data ends Code segment main proc
52、 far assume cs:code,ds:data,es:data start:push ds mov ax,0 push ax,mov ax,data mov ds,ax mov es,ax cld lea di,nametab a20loop:call b10read cmp namelen,0 jz a30 cmp namectr,30 je a30 call d10stor jmp a20loop a30:cmp namectr,1 jbe a40 call g10sort call k10disp a40:mov
53、 ah,4ch Int 21h Main endp,,b10read proc near mov ah,09 lea dx ,messg1 int 21h mov ah,0ah lea dx,namepar int 21h mov ah,09h lea dx crlf Int 21h mov bx,0 mov bl ,namelen mov cx,21 sub cx,bx b20: mov namefldbx,20h inc bx loop b20 ret b10read endp,d10st
54、or proc near inc namectr cld lea si , namectr mov cx,10 rep movsw ret p10stor endp g10sort proc near sub di ,40 mov endaddr,di g20: mov swapped,0 lea si,nametab g30: mov cx,20 mov di,si add di,20 add ax,di mov ax,di mov bx,si repe cmpsb,j
55、be g40 call h10 xchg g40: mov si,ax cmp swapped,0 jnz g20 ret G10sort endp,h10 xchg proc near mov cx,10 lea di , namesav mov si,bx rep movsw mov cx,10 mov di,bx rep movsw mov cx ,10 lea si,namesav rep movsw mov swapped,1 ret h10 xchg endp,k10disp proc near mov ah,09 lea dx,messg2 int 21h lea si,nametab lea di,namesav mov cx,10 rep movsw mov ah,09 lea dx, namesav int 21h dec namectr jnz k20 ret K10disp endp end start,第六章 作業(yè),6.1 6.2 6.3 6.7 6.8,
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 六級(jí)上冊(cè)科學(xué)ppt課件-誰(shuí)選擇了它們-教科版
- 護(hù)理核心制度培訓(xùn)一_圖文課件
- 部編《池子與河流》課件
- SWOT分析法(非常全面)課件
- 主題班會(huì)我的成長(zhǎng)目標(biāo)課件
- 城市交通擁堵及治理總結(jié)課件
- 輸血相關(guān)性急性肺損傷課件
- 議論文的謀篇布局與論點(diǎn)的提出ppt課件
- 六級(jí)上冊(cè)科學(xué)ppt課件-地球的近鄰——月球-冀人版
- 疾病預(yù)防、冬季保暖-課件
- 中考英語(yǔ)語(yǔ)法復(fù)習(xí)之狀語(yǔ)從句ppt課件集4
- 《百分?jǐn)?shù)的意義和讀寫》參考ppt課件
- 主題班會(huì)堅(jiān)持就是勝利課件
- 第二章--用人單位對(duì)大學(xué)生的要求概況ppt課件
- 教科版六年級(jí)科學(xué)上冊(cè)第三單元檢測(cè)卷(含答案)課件