《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > 匯編基礎(chǔ):子程序設(shè)計

匯編基礎(chǔ):子程序設(shè)計

2017-06-10
關(guān)鍵詞: 匯編

在一個程序中的不同地方,常常需要多次非循環(huán)的使用完成特定功能的程序段,這些程序段除了某些變量的賦值不同外,具有相同的指令序列,這時,我們?yōu)榱藴p少重復(fù)編寫程序,縮短目標(biāo)代碼,節(jié)省內(nèi)存空間,把視線這一功能的指令序列組成一個相對獨立的程序段。這也就是我們這片文章中所要討論的子程序。

子程序相當(dāng)于高級語言(比如C語言)中的過程和函數(shù),在匯編語言中子程序也稱為過程。使用子程序的好處:

a、有利于程序模塊化、結(jié)構(gòu)化和自頂向下的程序設(shè)計方法,簡化了程序設(shè)計過程。

b、增加了源程序的可讀性,便于調(diào)試維護

c、減少了目標(biāo)代碼鎖占用的空間

d、子程序一旦編制成功,在開發(fā)研制各種軟件時都可使用,縮短了軟件的開發(fā)周期。

一、子程序的調(diào)用與返回

1、子程序的定義

子程序必須定義在一個邏輯段內(nèi),子程序的定義由過程定義偽指令PROC/ENDP來實現(xiàn),它們分別用在程序的子程序的前后,一般格式如下:

PROC_NAME   PROC    [NEAR/FAR]    
......    
PROC_NAME   ENDP

其中PROC_NAME為子程序名,也極為CALL的操作數(shù),自程序具有3個屬性:段屬性、偏移量屬性和類型屬性,段屬性表示該子程序所在段的段基值。偏移量屬性表示該子程序在段中的偏移量。類型屬性也稱為距離屬性,可以是NEAR或FAR,屬性為NEAR的子程序只能在本段內(nèi)調(diào)用,屬性為FAR的子程序則可以在本段以內(nèi)以及其他段中調(diào)用。

2、調(diào)用指令

當(dāng)主程序?qū)傩允荖EAR的子程序時,CPU把當(dāng)前指令指針I(yè)P的內(nèi)容壓入堆棧,作為返回地址保存起來,然后將子程序的偏移量送入IP,當(dāng)從子程序返回時,將從堆棧彈出2個字節(jié)的返回地址送入IP,當(dāng)調(diào)用屬性是FAR的過程時,CPU把當(dāng)前的段寄存器CS與指令指針I(yè)P的內(nèi)容都壓入堆棧,作為返回地址保存起來,然后將子程序的段基值與偏移量送入CS與IP,當(dāng)子程序返回時,將從堆棧彈出4個字節(jié)的返回地址分別送入IP與CS。

我們?nèi)菀字溃?dāng)主程序和子程序處于同一邏輯段時,可以把類型屬性定義為NEAR,也可以把類型屬性定義為FAR,然后進行調(diào)用。而當(dāng)主程序與子程序不在同一邏輯段是,只可把過程的類型定義為FAR,然后調(diào)用。

二、返回指令

返回指令RET是子程序邏輯上的最后一條指令,也就是最后一條被執(zhí)行的指令,它使子程序在完成功能后返回到調(diào)用它的CALL指令的后續(xù)指令處,即返回地址處繼續(xù)執(zhí)行。

三、子程序設(shè)計的基本要求

1、子程序必須有一定的通用性

2、注意寄存器的保存和恢復(fù)

3、正確使用堆棧

4、選用適當(dāng)?shù)姆椒ㄔ谥鞒绦蚺c子程序間進行參數(shù)傳遞

5、編制子程序說明信息文件

四、子程序與主程序間的參數(shù)傳遞

在匯編語言中最常用的參數(shù)傳遞方式有3種,分別是:用寄存器傳遞參數(shù)、用堆棧傳遞參數(shù)和用地址表達式傳遞參數(shù)。

1、用寄存器傳遞參數(shù)

這種方式是通過通用寄存器來傳遞的參數(shù),即在主程序調(diào)用子程序前,將入口參數(shù)送到約定的通用寄存器中,子程序可以直接從這些寄存器中取出參數(shù)進行加工處理,并將結(jié)果放在約定的通用寄存器中,返回主程序,主程序再從約定的寄存器中取出結(jié)果,我們一例子來說明問題:

例:將兩個給定的二進制數(shù)(8位和16位)轉(zhuǎn)換為ASCII碼字符串。

分析:主程序提供唄轉(zhuǎn)換的數(shù)據(jù)和轉(zhuǎn)化后的ASCII碼字符串的存儲區(qū)的首地址。子程序完成二進制的轉(zhuǎn)換。為了提高子程序的代碼轉(zhuǎn)換通用性,它可以完成8位或16位數(shù)的轉(zhuǎn)換。設(shè)調(diào)用子程序時,入口參數(shù)為:被轉(zhuǎn)換的數(shù)在DX中,若位數(shù)小于16,則從高到低存放,轉(zhuǎn)換后的ASCII碼的存放首地址在DI中。下面給出一種實現(xiàn)方法:

DATA    SEGMENT    
   BIN1    DB  35H    
   BIN2    DW  0AB48H    
   ASCBUF  DB  20H DUP  (?)    
DATA    ENDS    
STACK1  SEGMENT PARA    STACK    
   DW  20H DUP  (0)    
STACK1  ENDS    
CODE    SEGMENT    
ASSUME  CS:CODE, DS:DATA, SS:STACK1    
BEGIN:  MOV AX, DATA    
   MOV DS, AX    
   XOR DX, DX    
   LEA DI, ASCBUF      ;存放ASCII碼的單元首地址送DI    
   MOV DH, BIN1            ;待轉(zhuǎn)換的第一個數(shù)據(jù)送DH    
   MOV AX, 8           ;待轉(zhuǎn)換的二進制數(shù)的位數(shù)送AX    
   CALL    BINASC      
   MOV DX, BIN2    
   MOV AX, 16    
   LEA DI, ASCBUF    
   ADD DI, 8           ;設(shè)置下一個數(shù)的存放首地址    
   CALL    BINASC    
   MOV AH, 4CH    
   INT     21H    
BINASC  PROC    
   MOV CX, AX    
LOP:    ROL DX, 1           ;最高位移入最低位    
   MOV AL, DL    
   AND AL, 1           ;保留最低位,屏蔽其他位    
   ADD AL, 30H    
   MOV [DI], AL            ;存結(jié)果    
   INC DI          ;修改地址指針    
   LOOP    LOP    
   RET    
BINASC  ENDP    
CODE    ENDS    
   END BEGIN


2、用堆棧傳遞參數(shù)

這種方法是主程序先將入口參數(shù)壓入堆棧,子程序從堆棧中把參數(shù)讀出,進行加工處理。這里要注意從堆棧中讀取數(shù)據(jù)與從堆棧中彈出數(shù)據(jù)是有區(qū)別的,從堆棧中讀取數(shù)據(jù)并不改變堆棧的棧頂指針SP,而從堆棧中彈出的數(shù)據(jù),則需修改SP,在使用堆棧傳遞參數(shù)時,要保證堆棧狀態(tài)的正確。

我們還以上面的例子來說明下問題,這次采用堆棧傳遞參數(shù)

分析:如果使用堆棧,一般用包括:

a、在主程序中,將待轉(zhuǎn)換的數(shù)據(jù)、存放ASCII碼的首地址和轉(zhuǎn)換的位數(shù)壓入棧中

b、在子程序中保存信息

下面我們依然用程序說明問題,在程序的必要處我已經(jīng)做了注釋

DATA    SEGMENT    
   BIN1    DB  35H    
   BIN2    DW  0AB48H    
   ASCBUF  DB  20H DUP  (?)    
DATA    ENDS    
STACK1  SEGMENT PARA    STACK    
   DW  20H DUP  (0)    
STACK1  ENDS    
CODE    SEGMENT    
ASSUME  CS:CODE, DS:DATA, SS:STACK1    
BEGIN:  MOV AX, DATA    
   MOV DS, AX    
   MOV AH, BIN1    
   PUSH    AX              ;待轉(zhuǎn)換數(shù)據(jù)壓棧    
   MOV AX, 8    
   PUSH    AX              ;待轉(zhuǎn)換位數(shù)壓棧    
   LEA DI, ASCBUF    
   PUSH    DI          ;存放ASCII碼的首地址壓棧    
   CALL    BINASC              ;調(diào)用轉(zhuǎn)換子程序    
   MOV AX, BIN2    
   PUSH    AX    
   MOV AX, 10H    
   PUSH    AX    
   ADD DI, 8    
   PUSH    DI    
   CALL    BINASC    
   MOV AH, 4CH    
   INT     21H    
BINASC  PROC    
   PUSH    AX    
   PUSH    CX    
   PUSH    DX    
   PUSH    DI      
   MOV BP, SP    
   MOV DI, [BP+10]         ;從堆棧取出入口參數(shù)    
   MOV CX, [BP+12]    
   MOV DX, [BP+14]    
LOP:    ROL DX, 1    
   MOV AL, DL    
   AND AL, 1    
   ADD AL, 30H    
   MOV [DI], AL    
   INC DI    
   LOOP    LOP    
   POP DI    
   POP DX    
   POP CX      
   POP AX    
   RET 6           ;返回并從堆棧中彈出6個字節(jié)    
BINASC  ENDP    
CODE    ENDS    
   END BEGIN

3、用地址表傳遞參數(shù)

當(dāng)要傳送的參數(shù)較多時,可在主程序中建立一個地址表,在調(diào)用子程序前,把所有參數(shù)的地址依次存放在該地址表中,然后把地址表的首地址通過寄存器傳送到子程序中去,而在子程序中,按照地址表中給出的地址逐個取出參數(shù),用地址表傳遞參數(shù)的方法,在入口參數(shù)比較多時很方便,當(dāng)返回參數(shù)較多時,可用同樣的方法傳遞參數(shù),供主程序使用。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
久久中文在线| 欧美午夜激情在线| 午夜精品久久久久久久蜜桃app| 亚洲精品影视在线观看| 亚洲国产综合视频在线观看| 亚洲国产精品久久久久婷婷老年 | 亚洲香蕉伊综合在人在线视看| 亚洲人成在线播放网站岛国| 亚洲国产视频一区| 亚洲国产综合视频在线观看| 亚洲激情视频网| 亚洲精品在线免费| 亚洲免费av观看| 在线视频亚洲| 亚洲女同在线| 欧美一区二区三区四区视频| 久久动漫亚洲| 亚洲国产日韩精品| 亚洲毛片在线观看| 中文日韩欧美| 香蕉精品999视频一区二区| 性一交一乱一区二区洋洋av| 久久精品二区三区| 久久亚洲综合色| 欧美成人综合网站| 欧美日韩一区二区视频在线 | 亚洲福利电影| 亚洲另类在线视频| 亚洲天堂成人在线视频| 亚洲欧美日韩天堂| 久久激五月天综合精品| 亚洲精选中文字幕| 亚洲一级在线| 亚洲在线视频观看| 国产视频一区免费看| 黄色成人在线| 亚洲国内高清视频| 99精品欧美| 欧美一区二区三区四区在线观看地址| 久久成人精品视频| 亚洲伦理在线| 午夜精品网站| 蜜臀久久99精品久久久画质超高清 | 久久精品午夜| 欧美aⅴ99久久黑人专区| 欧美精品日韩| 国产精品嫩草久久久久| 很黄很黄激情成人| 亚洲精品午夜| 欧美一级电影久久| 亚洲九九精品| 久久av一区二区| 欧美高清视频| 亚洲欧美日韩成人| 久久久综合精品| 欧美岛国激情| 国产精品一区二区你懂得| 欧美天堂亚洲电影院在线播放| 久久女同互慰一区二区三区| 免费不卡在线观看| 欧美午夜视频网站| 国产在线欧美| 亚洲精品一区二区三区四区高清 | 国产亚洲成av人在线观看导航| 亚洲第一精品夜夜躁人人躁| 激情伊人五月天久久综合| 国产精品盗摄一区二区三区| 经典三级久久| 亚洲综合清纯丝袜自拍| 亚洲日韩第九十九页| 午夜伦理片一区| 欧美福利一区二区| 国产精品永久免费观看| 亚洲黄色影片| 欧美专区在线观看| 亚洲一区国产精品| 蜜桃av一区二区| 国产日产欧产精品推荐色| 亚洲日本aⅴ片在线观看香蕉| 性高湖久久久久久久久| 亚洲一级免费视频| 欧美极品影院| 在线欧美亚洲| 久久精品99国产精品日本| 亚洲欧美伊人| 欧美日韩在线不卡| 亚洲激情综合| 亚洲国产三级| 久久久久综合| 国产模特精品视频久久久久 | 中文精品视频一区二区在线观看| 亚洲激情视频在线播放| 久久精品99国产精品酒店日本| 欧美视频在线一区| 亚洲三级免费| 亚洲麻豆视频| 欧美大学生性色视频| 在线欧美小视频| 久久精品亚洲精品| 久久人体大胆视频| 在线亚洲免费| 亚洲国产视频一区| 久久精品久久综合| 久久精品人人做人人爽电影蜜月| 国产精品乱子久久久久| 中文精品视频| 亚洲网站啪啪| 欧美日韩1234| 亚洲伦理在线观看| av成人免费| 欧美女激情福利| 亚洲欧洲三级| 99re热这里只有精品视频 | 日韩一级成人av| 亚洲视频一区| 欧美三级电影精品| 在线亚洲欧美视频| 亚洲一区在线视频| 国产精品wwwwww| 亚洲永久精品国产| 欧美在线观看网站| 国产视频欧美视频| 久久精品一区| 蘑菇福利视频一区播放| 亚洲国产精品久久久久秋霞蜜臀| 91久久嫩草影院一区二区| 欧美第一黄色网| 亚洲精品国产精品乱码不99| 一区二区三区视频在线观看| 欧美性片在线观看| 亚洲尤物在线| 久久免费的精品国产v∧| 国产中文一区二区三区| 亚洲激情专区| 欧美日韩高清免费| 一二三区精品| 亚洲国产福利在线| 欧美 亚欧 日韩视频在线| 亚洲激情视频在线| 亚洲深夜av| 国产麻豆精品在线观看| 欧美在线视频导航| 媚黑女一区二区| 亚洲精品一区二| 午夜精品久久久| 国产亚洲精品久久飘花| 亚洲国产一区视频| 欧美精品九九| 亚洲香蕉视频| 久久字幕精品一区| 亚洲精品美女91| 亚洲综合首页| 国产亚洲一区在线播放| 亚洲精品123区| 国产精品夫妻自拍| 亚洲成色777777在线观看影院| 欧美不卡福利| 亚洲图片欧洲图片日韩av| 久久视频在线看| 日韩亚洲一区在线播放| 久久国产精品色婷婷| 136国产福利精品导航| 亚洲在线成人精品| 韩国视频理论视频久久| 夜夜嗨av色一区二区不卡| 国产农村妇女毛片精品久久莱园子 | 亚洲精品国产精品乱码不99| 欧美日韩成人免费| 午夜视频久久久| 欧美伦理视频网站| 亚洲欧美国产精品专区久久| 牛牛国产精品| 亚洲一区二区三区四区五区黄 | 欧美精品18| 性娇小13――14欧美| 免费亚洲电影在线| 亚洲一二区在线| 免费观看在线综合| 亚洲综合日本| 欧美日韩国产区| 欧美在线高清| 欧美午夜精彩| 亚洲乱码国产乱码精品精可以看 | 欧美在线视频一区二区| 欧美日韩精品二区第二页| 欧美一区二区精品| 欧美日韩精品免费观看| 久久成人精品| 国产精品一二三视频| a4yy欧美一区二区三区| 一色屋精品视频在线观看网站 | 久久久国产视频91| 一本综合久久| 欧美激情一区二区三区| 欧美一区二区三区在| 欧美三级第一页| 亚洲裸体在线观看| 国产一区二区三区久久久久久久久| 亚洲婷婷综合久久一本伊一区| 亚洲第一在线视频|