子程式的設計

2022-04-06 18:09:20 字數 1554 閱讀 7908

子程式的呼叫

過程呼叫和過程返回指令屬於程式控制這一組,通常,過程呼叫指令用於主程式專線子程式,過程返回之日你個用於程式返回主程式

過程呼叫指令有段間呼叫和段內呼叫之分,與之相對應的,過程返回也有段內返回和段間返回

過程呼叫指令

過程呼叫分為四種

段內直接呼叫:格式 call 過程名

例如:call sub1

call toascii

該指令具體分解為sp   = sp -2,[sp] = ip ,ip = ip+disp

段內直接呼叫指令只把返回位址的偏移量壓入堆疊儲存,實際上轉移發生在同一段內,**段暫存器cs的內容不發生變化,然後把位址與子程式入口位址的差值加到指令指標ip上,使指令指標ip為目標位址發生偏移,從而達到轉移的目的

段內間接呼叫,格式如下:call oprd

oprd是16位通用暫存器或字儲存器運算元,該指令具體分解如下:sp = sp -2,[sp] = ip, ip = oprd

該指令只把返回位址的偏移量壓入堆疊儲存,如果oprd是16為通用暫存器,則把暫存器的內容送到ip,如果oprd是字儲存運算元,則把字儲存單元內的內容送到ip

段間直接呼叫 格式 call 過程名

指令首先把返回位址的段值壓入堆疊,再把返回位址的偏移量壓入堆疊,達到儲存位址的目的,過程呼叫的入口位址的段值和偏移量分別送給cs和ip,達到轉移的目的,該指令進行的具體操作分解如下 sp = sp -2,[sp] = cs,sp = sp -2,[sp] = ip,ip = 過程呼叫位址入口,cs = 過程入口位址的段值

call far ptr subro 如果先呼叫後定義,那麼為難呼叫成功必須在過程名前面加入 far ptr

段間間接呼叫 call oprd         oprd必須是雙字儲存單元,

該指令具體操作可分解如下: sp = sp -2,[sp] = cs ,sp  = sp-2,[sp] = ip,ip = oprd的低位元組,cs = oprd的高位元組

例如 call dword ptr [bx]

過程返回指令

段內返回指令ret,指令實際上執行的是ip = [sp],sp = sp +2

段間返回指令retf ip = [sp],sp = sp+2,cs = [sp],sp = sp +2

段內帶立即數返回指令  ret 表示式

例如ret 4

執行指令的時候,ip = sp ,sp = sp+2,sp =sp+4

如果執行前sp = b67eh,執行完之後sp =b68h

子程式說明資訊

為了能正確的使用子程式,再給出子程式**時候還需要給出子程式的說明資訊,子程式的說明資訊一般包括如下幾部分組成

子程式名

功能描述

入口和出口引數

所用的暫存器和儲存單元

使用的演算法和重要的效能指標

其他呼叫注意事項和說明資訊

呼叫例項

過程定義的語句

過程名 proc [near|far]

過程名 endp

過程名的段值和偏移是對應過程的入口(過程丁一開始偽指令語句後的指令的段值和偏移)過程名的型別就是過程的型別

子程式過載

子程式過載是指有一系列具有相同的子程式名稱,但有不同的型別和數目的引數的子程式,它們用於完成不同但相關的操作。在程式中呼叫某個過載的子程式時,編譯器將根據呼叫的子程式及其所使用的引數序列和數目來確定那個子程式將被執行。1.在編寫過載子程式時應注意各子程式的引數個數和引數型別的差異,否則編譯器將不能正...

perl 子程式的使用

在perl中可以自己建立子程式 subroutine 關鍵字sub,子程式名以及用花括號封閉起來的 塊。sub marine 子程式名與標量的命名空間是不同的兩個部分。子程式的返回值 最後一次運算的表示式即是預設的返回值。也可以用return來顯式的返回,這樣之後的語句不會執行。在標量上下文返回的會...

wordcount例子程式

hadoop 0.20.1裡的wordcount源 與0.19.2已經有較大的區別了。在新版本的hadoop中,org.apache.hadoop.mapred包被org.apache.hadoop.mapreduce所取代。不過為了保持相容性,org.apache.hadoop.mapred還是存...