版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第6章 子程序結(jié)構(gòu)Assembly Language Programming2第六章第六章 子程序結(jié)構(gòu)子程序結(jié)構(gòu) 把功能相對獨立的程序段單獨編寫和調(diào)試,作為一把功能相對獨立的程序段單獨編寫和調(diào)試,作為一個相對獨立的模塊供程序使用,就形成子程序。個相對獨立的模塊供程序使用,就形成子程序。 子程序可以實現(xiàn)源子程序可以實現(xiàn)源程序的模塊化程序的模塊化,可,可簡化源程序結(jié)簡化源程序結(jié)構(gòu)構(gòu),可以,可以提高編程效率提高編程效率。 定義和使用子程序、參數(shù)傳遞和返回值約定、寄存定義和使用子程序、參數(shù)傳遞和返回值約定、寄存器使用約定、局部變量和堆棧控制等。器使用約定、局部變量和堆棧控制等。 參數(shù)傳遞參數(shù)傳遞是子程
2、序設(shè)計的是子程序設(shè)計的重點和難點重點和難點36.1 子程序的設(shè)計方法子程序的設(shè)計方法 一、一、 過程(子程序)定義偽操作過程(子程序)定義偽操作子程序名子程序名 PROC NEAR ( 或或 FAR ) retret子程序名子程序名 ENDP 子程序名子程序名為符合語法的標(biāo)識符為符合語法的標(biāo)識符 NEAR屬性屬性(段內(nèi)近調(diào)用段內(nèi)近調(diào)用) ): 調(diào)用程序和子程序在同一代碼調(diào)用程序和子程序在同一代碼段中段中,只能被相同代碼段的其他程序調(diào)用只能被相同代碼段的其他程序調(diào)用; ; FAR屬性屬性(段間遠調(diào)用段間遠調(diào)用) ): 調(diào)用程序和子程序不在同一代調(diào)用程序和子程序不在同一代碼段中碼段中,可以被相同或
3、不同代碼段的程序調(diào)用可以被相同或不同代碼段的程序調(diào)用. .4對簡化段定義格式,在微型、小型和緊湊存儲模對簡化段定義格式,在微型、小型和緊湊存儲模式下,過程的缺省屬性為式下,過程的缺省屬性為near;在中型、大型和;在中型、大型和巨型存儲模式下,過程的缺省屬性為巨型存儲模式下,過程的缺省屬性為far對完整段定義格式,過程的缺省屬性為對完整段定義格式,過程的缺省屬性為nearnear用戶可以在過程定義時用用戶可以在過程定義時用nearnear或或farfar改變?nèi)笔俑淖內(nèi)笔傩孕远?、使用子程序二、使用子程?子程序名子程序名 / 子程序入口地址子程序入口地址 子程序名子程序名是一個(全局標(biāo)識符)
4、是一個(全局標(biāo)識符)常量地址常量地址。 子程序調(diào)用(中斷調(diào)用):隱含使用堆棧保存返回地址子程序調(diào)用(中斷調(diào)用):隱含使用堆棧保存返回地址 call near ptr subprog ;段內(nèi)調(diào)用段內(nèi)調(diào)用 (1) 保存返回地址保存返回地址 (2) 轉(zhuǎn)子程序轉(zhuǎn)子程序 (EIP) subprog的的偏移地址偏移地址 call far ptr subprog ;段間調(diào)用;段間調(diào)用 (1) 保存返回地址保存返回地址 (2) 轉(zhuǎn)子程序轉(zhuǎn)子程序 (CS) subprog 的段地址的段地址 (EIP) subprog 的偏移地址的偏移地址 (EIP)(ESP) (EIP)(ESP) (CS)56 int n (
5、n : 中斷類型號)中斷類型號) (1) 保存現(xiàn)場和返回地址保存現(xiàn)場和返回地址 (2) 轉(zhuǎn)中斷處理程序轉(zhuǎn)中斷處理程序 (IP) (n*4) (CS) (n*4+2) 子程序返回子程序返回(1) ret(2) ret imm(3) iret (中斷返回)(中斷返回)(IP)(SP) (CS)(PSW)7例例6.1 調(diào)用程序和子程序在同一代碼段中調(diào)用程序和子程序在同一代碼段中code segment main proc far . call subr1 . retmain endpsubr1 proc near . retsubr1 endpcode ends8 seg1 segment subt
6、 proc far . ret subt endp . call subt .seg1 endsseg2 segment . call subt .seg2 ends代碼段代碼段seg1代碼段代碼段seg2例6.2 調(diào)用程序和子程序不在同一代碼段中 三、三、 增強功能的增強功能的過程(子程序)定義過程(子程序)定義子程序名子程序名 PROC 屬性屬性 USES 寄存器列表寄存器列表 ,參數(shù)表參數(shù)表LOCALLOCAL 局部變量表局部變量表retret子程序名子程序名 ENDP 距離:距離:NEAR/FAR (微、小、緊湊和平坦模式為微、小、緊湊和平坦模式為NEAR,中、大和巨模式為,中、大和巨
7、模式為FAR) 語言類型:語言類型:C、BASIC、PASCAL、FORTRAN、 可見性:可見性:Private / Public可以使用宏名指定屬性可以使用宏名指定屬性 參數(shù)名參數(shù)名:類型類型 ; ; 缺省類型為缺省類型為DWORDDWORD910 入口參數(shù)入口參數(shù)(輸入?yún)?shù)):主程序提供給子程序(輸入?yún)?shù)):主程序提供給子程序 出口參數(shù)出口參數(shù)(輸出參數(shù)):子程序返回給主程序(輸出參數(shù)):子程序返回給主程序參數(shù)的形式:參數(shù)的形式: 數(shù)據(jù)本身(數(shù)據(jù)本身(傳值傳值) 數(shù)據(jù)的地址(數(shù)據(jù)的地址(傳址傳址) 四、四、 參數(shù)傳遞約定參數(shù)傳遞約定 C C語言用語言用 AL / AX / DX:AX /
8、EAX / EDX:EAX AL / AX / DX:AX /EAX / EDX:EAX 返返回整數(shù),用浮點堆棧棧頂返回實數(shù)。匯編語言一般回整數(shù),用浮點堆棧棧頂返回實數(shù)。匯編語言一般建議使用建議使用C C語言約定。語言約定。通過通過寄存器寄存器傳送傳送參數(shù)參數(shù)通過通過存儲器存儲器傳送傳送參數(shù)參數(shù) *子程序和調(diào)用程序在同一程序模塊中,則子子程序和調(diào)用程序在同一程序模塊中,則子程序可直接訪問模塊中的變量。程序可直接訪問模塊中的變量。 *子程序和調(diào)用程序不在同一程序模塊中,則子程序和調(diào)用程序不在同一程序模塊中,則有兩種傳送方式:建立有兩種傳送方式:建立公共數(shù)據(jù)區(qū)公共數(shù)據(jù)區(qū)和使用和使用外部外部符號。符
9、號。通過通過地址表地址表傳送傳送參數(shù)地址參數(shù)地址通過通過堆棧堆棧傳送傳送參數(shù)參數(shù)或或參數(shù)地址參數(shù)地址傳遞的方法:傳遞的方法:12subnameproc;具有缺省屬性的具有缺省屬性的subname過程過程push esi;保護寄存器:保護寄存器:順序壓入堆棧順序壓入堆棧push edi;以以 esi/edi/ebx 為例為例push ebx;過程體過程體pop ebx;恢復(fù)寄存器:恢復(fù)寄存器:逆序彈出堆棧逆序彈出堆棧pop edipop esiret;過程返回過程返回subnameendp;過程結(jié)束過程結(jié)束保護現(xiàn)場保護現(xiàn)場恢復(fù)現(xiàn)場恢復(fù)現(xiàn)場五、利用堆棧五、利用堆棧(保護寄存器、臨時變量和臨時數(shù)據(jù))
10、(保護寄存器、臨時變量和臨時數(shù)據(jù))13六、子程序框架六、子程序框架 (PowerAsm.asm); 計算 iNum * 2 iPower; int GetPowerC(int iNum, int iPower);PUBLIC GetPowerAsm_TEXT SEGMENT WORD PUBLIC CODEGetPowerAsm PROC NEAR ; 保存 EBP ; 保存 ESP 到 EBP,以后可以用 EBP 依據(jù)返回; 地址向前或向后尋址參數(shù)或局部變量 MOV EAX, EBP+8 ; 第一個參數(shù)之前為EBP,再之前是EIP MOV ECX, EBP+12; 第二個參數(shù)也是雙字整數(shù) S
11、HL EAX, CL; EAX = EAX * (2 CL) ; 恢復(fù) EBP RET; 結(jié)果在 EAX 中GetPowerAsm ENDP_TEXT ENDS END堆棧狀態(tài):堆棧狀態(tài):低地址低地址 高地址高地址內(nèi)部臨時堆棧操作內(nèi)部臨時堆棧操作, 局部變量局部變量, EBP,返回地址返回地址,第一個參數(shù)第一個參數(shù),第二個參數(shù)第二個參數(shù)/ 計算計算 iNum * 2 iPower 的的嵌匯編嵌匯編 C 程序程序int GetPowerC(int iNum, int iPower) _asm MOV EAX, iNumMOV ECX, iPowerSHL EAX, CL ; EAX = EAX
12、* (2 CL) / 返回結(jié)果在返回結(jié)果在 EAX 中(編譯時或出現(xiàn)一個警告)中(編譯時或出現(xiàn)一個警告)14第一個參數(shù)第一個參數(shù)第二個參數(shù)第二個參數(shù)返回地址返回地址EBP局部參數(shù)局部參數(shù)局部參數(shù)局部參數(shù)ESP/ 去除框架的去除框架的C函數(shù)函數(shù)void _declspec (naked) MyNakedFunction()_asm / 可自己完成初始化工作可自己完成初始化工作 PUSH EBPMOV EBP, ESPSUB ESP, _LOCAL_SIZE . . ._asm / 執(zhí)行對應(yīng)的掃尾工作執(zhí)行對應(yīng)的掃尾工作 MOV ESP, EBPPOP EBPRET 15; 也可以不使用也可以不使用
13、EBPGetPowerAsm PROC NEAR MOV EAX, ESP+4 ; 第一個參數(shù)之前只有返回的偏移地址第一個參數(shù)之前只有返回的偏移地址EIP MOV ECX, ESP+8 ; 兩個參數(shù)都為雙字整數(shù)兩個參數(shù)都為雙字整數(shù) SHL EAX, CL; EAX = EAX * (2 CL) RET; 返回結(jié)果在返回結(jié)果在 EAX 中中GetPowerAsm ENDP; 計算計算 iNum * 2 iPowerGetPowerAsm PROC _iNum$:DWORD, _iPower$:DWORD MOV EAX, _iNum& MOV ECX, _iPower$ SHL EAX,
14、 CL; EAX = iNum * (2 iPower) RET; 結(jié)果在結(jié)果在 EAX 中中GetPowerAsm ENDP全局變量全局變量:名:名 類型類型 值表值表局部變量:局部變量:LOCAL 名名 / 名名:類型類型 / 名名長度長度:類型類型 ,.定義外部符號:定義外部符號:PUBLIC 標(biāo)識符標(biāo)識符 ,.使用外部符號:使用外部符號:EXTRN 標(biāo)識符標(biāo)識符:類型類型 , .16cdecl 與與STDCALL調(diào)用規(guī)則調(diào)用規(guī)則int addproc (int a, int b)return a+b;int r, s;void main ( )r = addproc (10, 20);
15、s = addproc (r, -1);00401000 PUSH EBP ; addproc 程序入口程序入口00401001 MOV EBP, ESP00401003 MOV EAX, DWORD PTR EBP+800401006 ADD EAX, DWORD PTR EBP+1200401009 POP EBP0040100A RET; STDCALL 用用 RET 80040100B PUSH EBP ; 主程序入口主程序入口0040100C MOV EBP, ESP0040100E PUSH 14H00401010 PUSH 0AH00401012 CALL 00401000004
16、01017 ADD ESP, 80040101A MOV 00405428, EAX ; r = EAX0040101F PUSH 0FFFFFFFFH00401021 MOV EAX, 0040542800401026 PUSH EAX00401027 CALL 004010000040102C ADD ESP, 80040102F MOV 0040542C, EAX ; s = EAX00401034 POP ESP00401035 RET17七、高級語法七、高級語法 函數(shù)原型聲明函數(shù)原型聲明子程序名子程序名 PROTO 距離距離 語言語言, 參數(shù)參數(shù) : 類型類型 , 子程序調(diào)用偽操作符
17、子程序調(diào)用偽操作符INVOKE 子程序名子程序名 , 實參表實參表參數(shù)符合參數(shù)符合 PUSH 的操作數(shù)類型,可以使用的操作數(shù)類型,可以使用 ADDR 取得變量的地址(隱取得變量的地址(隱含地使用含地使用 LEA eax, Var) 定義局部變量定義局部變量LOCAL 變量名變量名重復(fù)數(shù)量重復(fù)數(shù)量:類型類型 , 定義和使用外部標(biāo)識定義和使用外部標(biāo)識PUBLIC 標(biāo)識符標(biāo)識符 , EXTERN 標(biāo)識符:類型標(biāo)識符:類型 , 1819例題例題 : :實現(xiàn)光標(biāo)回車換行實現(xiàn)光標(biāo)回車換行的子程序的子程序dpcrlfproc;子程序開始子程序開始push ax;保護寄存器保護寄存器AX和和DXpush dx
18、mov dl, 0dh;顯示回車顯示回車mov ah, 2int 21hmov dl, 0ah;顯示換行顯示換行mov ah, 2int 21hpop dx;恢復(fù)寄存器恢復(fù)寄存器DX和和AXpop axret;子程序返回子程序返回dpcrlfendp;過程結(jié)束過程結(jié)束20例題例題 : :實現(xiàn)實現(xiàn)alal內(nèi)容內(nèi)容( (兩個十六進制數(shù)兩個十六進制數(shù)) )的顯示的顯示的子程序的子程序ALdisp proc ;子程序開始子程序開始 push ax ;過程中使用了過程中使用了AX、CX和和DX push cx push dx push ax ;暫存暫存ax mov dl,al ;轉(zhuǎn)換轉(zhuǎn)換al的高的高4位
19、位 mov cl,4 shr dl,cl or dl,30h ;al高高4位變成位變成3 cmp dl,39h jbe aldisp1 add dl,7 ;是是0Ah0Fh,還要加上,還要加上7aldisp1: mov ah,2 ;顯示顯示 int 21h21例題例題 : :實現(xiàn)實現(xiàn)alal內(nèi)容內(nèi)容( (兩個十六進制數(shù)兩個十六進制數(shù)) )的顯示的顯示的子程序的子程序 pop dx ;恢復(fù)原恢復(fù)原ax值到值到dx and dl, 0fh ;轉(zhuǎn)換轉(zhuǎn)換al的低的低4位位 or dl, 30h cmp dl, 39h jbe aldisp2 add dl,7aldisp2: mov ah,2 ;顯示顯
20、示 int 21h pop dx pop cx pop ax ret;過程返回過程返回ALdispendp22例題例題 : :實現(xiàn)實現(xiàn)alal內(nèi)容內(nèi)容( (兩個十六進制數(shù)兩個十六進制數(shù)) )的顯示的顯示的子程序的子程序;主程序主程序mov bx,offset array ;調(diào)用程序段開始調(diào)用程序段開始mov cx,countdisplp:mov al,bxcall Aldisp;調(diào)用顯示過程調(diào)用顯示過程mov dl, ,;顯示一個逗號,分隔數(shù)據(jù)顯示一個逗號,分隔數(shù)據(jù)mov ah, 2int 21hinc bxloop displp;調(diào)用程序段結(jié)束調(diào)用程序段結(jié)束.exit 0.;過程定義過程定義
21、end23decihex segment ; 1016 assume cs: decihexmain proc far push ds sub ax, ax push axrepeat: call decibin ; 102 call crlf call binihex ; 216 call crlf jmp repeat retmain endp例例6.3 十進制到十六進制的轉(zhuǎn)換程序十進制到十六進制的轉(zhuǎn)換程序 (通過寄存器傳送變量)通過寄存器傳送變量)24decibin proc near ; 102 mov bx, 0 ; bx為傳遞參數(shù)為傳遞參數(shù)newchar: mov ah, 1 in
22、t 21h sub al, 30h jl exit ; 9退出退出 cbw xchg ax, bx mov cx, 10d mul cx xchg ax, bx add bx, ax jmp newcharexit: retdecibin endp例6.3 十進制到十六進制的轉(zhuǎn)換程序25binihex proc near ; 216 mov ch, 4rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h cmp al, 3ah jl printit add al, 7h ; AF printit: mov dl, al
23、mov ah, 2 int 21h dec ch jnz rotate retbinihex endp例6.3 十進制到十六進制的轉(zhuǎn)換程序26crlf proc near mov dl, 0dh mov ah, 2 int 21h mov dl, 0ah mov ah, 2 int 21h retcrlf endpdecihex ends end main例6.3 十進制到十六進制的轉(zhuǎn)換程序27data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?data endscode segmentmain proc far assum
24、e cs:code, ds:datastart: push ds sub ax, ax push ax mov ax, data mov ds, ax call near ptr proadd retmain endp例6.4 累加數(shù)組中的元素(直接訪問變量)28proadd proc near push ax push cx push si lea si, ary mov cx, count xor ax, ax例6.4 累加數(shù)組中的元素(直接訪問變量)next: add ax, si add si, 2 loop next mov sum, ax pop si pop cx pop ax
25、retproadd endpcode ends end start29data segmentary dw 1,2,3,4,5,6,7,8,9,10count dw 10sum dw ?ary1 dw 10,20,30,40,50,60,70,80,90,100count1 dw 10sum1 dw ?data ends如果數(shù)據(jù)段定義如下:如果數(shù)據(jù)段定義如下:*如果直接訪問內(nèi)存變量,那么累加數(shù)組如果直接訪問內(nèi)存變量,那么累加數(shù)組aryary和和數(shù)組數(shù)組ary1ary1中中的元素不能用同一個子程序的元素不能用同一個子程序proaddproadd例6.4 累加數(shù)組中的元素(直接訪問變量)30 ta
26、ble dw 3 dup (?) ; 定義地址表 code segmentmain proc far assume cs:code, ds:datastart: 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 ret main endp 例6.4 累加數(shù)組中的元素proadd proc near push ax push cx pus
27、h 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 endpcode ends end start aryary 10 10 00000000 20 000220 0002 3030 4040 5050 6060 7070 8080 9090 100100 countcount 10 10 00140014 sum sum ? ? 00
28、160016 table table 00000000 0018 0018 ( (bxbx) )0014001400160016(si)(di)32例6.4 累加數(shù)組中的元素(通過堆棧傳送變量地址)data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ?data endsstack segment dw 100 dup (?) tos label wordstack ends code1 segmentmain proc far assume cs:code1, ds:data, ss:stackstart:
29、 mov ax, stack mov ss, ax mov sp, offset tos push ds sub 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 bx call far ptr proadd retmain endpcode1 endscode2 segment assume cs: code2proadd proc far push bp mov bp, sp push ax push c
30、x push si push di mov si, bp+0ah mov di, bp+8 mov cx, di mov di, bp+6 (bp)+0a (bp)+0a 0000 0000 (sp) (sp) ( (didi) ) ( (sisi) ) ( (cxcx) ) (ax)(ax) ( (bpbp) ) ( (bpbp) ) ( (ipip) ) ( (cscs) ) (bp)+6(bp)+6 0016 0016 (bp)+8 (bp)+8 0014 0014 0 0 ( (dsds) ) xor ax, axnext: add ax, si add si, 2 loop next
31、 mov di, ax pop di pop si pop cx pop ax pop bp ret 6proadd endpcode2 ends end start堆棧示意35例:求ADDSUM PROC MOV AX,5 MOV DX,0 MOV CX,AXNEXTAX: PUSH CX CALL SUM ADD DX,AX POP CX LOOP NEXTAX MOV AH,4CH INT 21H RETADDSUM ENDP 511jjiiSUM PROC MOV AX,0NEXT: ADD AX,CX LOOP NEXT RETSUM ENDPEND ADDSUM36例例:判斷閏年的
32、程序判斷閏年的程序data segment ;定義數(shù)據(jù)段定義數(shù)據(jù)段 infon db 0dh,0ah,Please input a year: $ Y db 0dh,0ah,This is a leap year! $ N db 0dh,0ah,This is not a leap year! $ w dw 0 buf db 8 db ? db 8 dup(?)data endsstack_sg segment stack db 200 dup(0)stack_sg ends37例例:判斷閏年的程序判斷閏年的程序code segment assume ds:data,ss:stack_sg,c
33、s:code start:mov ax,data mov ds,ax lea dx,infon ;在屏幕上顯示提示信息在屏幕上顯示提示信息 mov ah,9 int 21h lea dx,buf ;從鍵盤輸入年份字符串從鍵盤輸入年份字符串 mov ah,10 int 21h 38例例:判斷閏年的程序判斷閏年的程序 mov cl, buf+1 ;取實際輸入的字符數(shù)取實際輸入的字符數(shù) lea di,buf+2 ;DI指向輸入串的起始地址指向輸入串的起始地址 call datacate call ifyears jc a1 lea dx,n mov ah,9 int 21h jmp exita1:
34、lea dx,y mov ah,9 int 21hexit: mov ah,4ch int 21h39;十進制數(shù)轉(zhuǎn)換成二進制 datacate proc near mov ch,0 mov si,di mov bl,10 mov bh,0 mov ax, ;累加器清累加器清“”l1: imul bx sub byte ptr si,30h add al,byte p tr si adc ah,0 inc si loop l1 mov w,ax ret datacate endp鍵盤輸入字符串123 則, 40;判斷閏年 ifyears proc near push bx push cx pus
35、h dx mov ax,w mov cx,ax mov dx,0 mov bx,4 div bx cmp dx,0 jnz lab1 mov ax,cx mov bx,100 div bx cmp dx,041將二進制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串 將一個給定的二進制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串,送到指定的存儲單元并顯示。如二進制數(shù)10010011轉(zhuǎn)換成字符串為10010011。要求將轉(zhuǎn)換過程寫成子程序,且子程序應(yīng)具有較好的通用性,而必須能實現(xiàn)對8位和16位二進制數(shù)的轉(zhuǎn)換。42將二進制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串 入口參數(shù):DX存放待轉(zhuǎn)換的二進制數(shù) CX存放待轉(zhuǎn)換數(shù)的位數(shù)
36、(8位或16位) DI存放ASCII碼首地址 出口參數(shù):轉(zhuǎn)換后的字符串存放在以DI作指針的字節(jié)存貯區(qū)中 程序如下: DATA SEGMENT NUM8 DB93H NUM16 DW0ABCDH ASCBUFDB20DUP(0) DATA ENDS43將二進制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串CODESEGMENTASSUME DS:DATA,CS:CODE, SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;轉(zhuǎn)換二進制數(shù)送DXMOVCX,8;置位數(shù)8LEADI,ASCBUF;字符串首址DICALLBTASC;調(diào)用子程序BTASCMOVDI,B
37、YTE PTR 0DHMOVDI+1,BYTE PTR 0AH44將二進制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串 MOVDI+2,BYTE PTR $LEADX,ASCBUFMOVAH,9INT21HMOVDX,NUM16MOVCX,16 ;置位數(shù)16LEADI,ASCBUFCALL BTASC MOVDL,BYTE PTR 0DHMOVDL+1,BYTE PTR 0AHMOVDL+2,BYTE PTR ;顯示轉(zhuǎn)換后的字符串LEADX, ASCBUF MOVAH,9 INT21H45將二進制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串BTASCPROCPUSHAX;保存;保存AXMOVAL,0CMPCX
38、,8;比較;比較8位數(shù)位數(shù)JNEL1;直接轉(zhuǎn)換;直接轉(zhuǎn)換16位數(shù)位數(shù)MOVDH,DL;8位數(shù)轉(zhuǎn)換送位數(shù)轉(zhuǎn)換送DHL1:ROLDX,,1;DX最高位移入最高位移入CFRCLAL,1;CF移入移入AL最低位最低位ADDAL,30HMOVDI,AL INCDILOOPL1POPAXRETBTASCENDPCODEENDSENDSTART46子程序的嵌套子程序的嵌套主程序主程序 子程序子程序A 子程序子程序B proc_A proc_B. . call proc_A call proc_B . ret ret遞歸子程序:遞歸子程序:n!6.2 嵌套與遞歸子程序47遞歸方法求n!(1n8).model
39、small;定義數(shù)據(jù)段和堆棧段data segment n dw0 result dw0data endsstack1 segmentdw200 dup (0)toslabel wordstack1 ends48主程序code segment assume cs:code,ds:data,ss:stack1main proc far mov ax,stack1 mov ss,ax mov sp,offsettos push ds xor ax,ax push ax mov ax,data mov ds,ax call near ptr decbin ;輸入一個正整數(shù)輸入一個正整數(shù) call n
40、ear ptr crlf ;輸出一個回車換行輸出一個回車換行 49子程序factorialfactorial proc nearpushaxpushbpmovbp,spmovax,bp+6cmpax,0jnefact1incaxjmpexit1fact1:dec ax50子程序decbindecbin proc near movbx,0newchar: movah,1 int21h subal,30h jlexit cmpal,9d jgexit cbw add bx,ax jmpnewcharexit: retdecbin endp51子程序binhexbinhex proc near mo
41、v ch,4rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl print add al,7h52遞推方法求n!(1n8)主代碼段: call near ptr decbin call near ptr crlf mov n,bx mov ax,1 call near ptr factorial mov fact ,ax mov bx,ax call near ptr binhex53子程序factorialfactorial proc nearpushcxmovcx,bxxx:mul bxdec b
42、xloop xxpop cxretfactorial endp54mov bx, offset strpush bxcall reverspop bxmov dl, bxmov ah, 2int 21hrevers proc near push ax push bx push dx push bp mov bp, sp mov bx, bp+10 mov al, bx cmp al, $ jne re_call jmp returnre_call: inc bx push bx call revers pop bx mov dl, bx mov ah, 2 int 21h例:將字符串反序輸出return: pop bp pop dx pop bx pop ax retrevers endp55例例6.8 十六進制到十進制的轉(zhuǎn)換程序(十六進制到十進制的轉(zhuǎn)換程序(通過寄存器傳送變量通過寄存器傳送變量)hexidec se
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年麻布色織布項目可行性研究報告
- 2020-2025年中國防風(fēng)通圣丸行業(yè)市場深度分析及發(fā)展前景預(yù)測報告
- 二零二五不銹鋼板材環(huán)保處理與資源回收利用合同3篇
- 2025年度裝配式建筑木工分包勞務(wù)合同模板4篇
- 2025文藝演出活動現(xiàn)場管理與委托服務(wù)合同3篇
- 二零二五年度鄉(xiāng)村土地流轉(zhuǎn)中介合同模板
- 2025年調(diào)配潤滑油項目可行性研究報告
- 二零二五年度全新長期賽車場租賃合同規(guī)范模板2篇
- 2025年中國數(shù)字化HCM行業(yè)發(fā)展?jié)摿︻A(yù)測及投資戰(zhàn)略研究報告
- 2025年扁型錨具連接器項目投資可行性研究分析報告
- 藥學(xué)技能競賽標(biāo)準(zhǔn)答案與評分細則處方
- 2025屆高考英語 716個閱讀理解高頻詞清單
- 報建協(xié)議書模板
- 汽車配件購銷合同范文
- 貴州省2024年中考英語真題(含答案)
- 施工項目平移合同范本
- (高清版)JTGT 3360-01-2018 公路橋梁抗風(fēng)設(shè)計規(guī)范
- 胰島素注射的護理
- 云南省普通高中學(xué)生綜合素質(zhì)評價-基本素質(zhì)評價表
- 2024年消防產(chǎn)品項目營銷策劃方案
- 聞道課件播放器
評論
0/150
提交評論