微機原理第三章

2023-01-03 19:18:05 字數 4525 閱讀 3149

第三章混合程式設計

混合程式語言介面有3個基本約定:命名約定、呼叫約定和引數傳遞約定。這三個約定是混合程式語言設計的核心,呼叫和被呼叫例程都必須遵守一致的約定。

1. 命名約定

命名約定是指編譯程式在把名字放入目標檔案之前,改變名字的一種約定,此約定是為多種語言對名字訪問而設定的,它體現在對目標名字長度的限制和大小寫的規定上。

c的命名約定與前者不同,它不會將名字字母轉換大小寫,而是將下劃線「_」插入到名字之前,c識別名字的前8個字元。在turbo c++下,彙編和c都採用c的命名約定。c呼叫彙編的過程中,在名字的前端應包含乙個下劃線。

例如,c呼叫乙個名字為minus的外部函式,而該函式由組合語言編寫,則與c共用的彙編過程時的名字為_minus。

2. 呼叫約定

呼叫和被呼叫例程間的引數傳送一般是通過堆疊進行的,呼叫約定一般有兩個方面的內容:

1) 呼叫者以何種次序把引數壓入堆疊以及被呼叫者以何種次序從

堆疊中取用引數

2) 從被呼叫例程返回時,是由被呼叫例程還是由呼叫例程釋放堆

棧中的引數區。

c的呼叫約定(即c呼叫彙編的約定)是以引數出現在源程式中,並以由右至左的次序把引數壓入堆疊中。被呼叫者以相反的次序從堆疊中取用引數。例如,c呼叫test(a,b)時,先把b壓進堆疊,再把a壓入,並約定被呼叫例程以ret指令返回c程式,返回後,由c立即釋放它傳給被呼叫例程的引數區,恢復堆疊。

引數和返回位址的進棧順序為:

ba返回位址bp(呼叫它的位址)。

3. 引數傳遞約定

引數傳送分為按值傳送(又稱值參傳送)和按引用傳送(又稱按位址傳送或變參傳送)兩大類,在microsoft中又把按引用傳送分為按近引用(近位址)和按遠引用(遠位址)。這樣傳送引數就有三種方法:

1) 按近引用傳送

傳送引數的近位址(位址為二個位元組的段內偏移量)。該方法使被呼叫例程直接訪問引數自身,被呼叫例程對引數的改變將反映到呼叫例程中。

2) 按遠引用傳送

傳送引數的遠位址(位址為四個位元組,二個位元組為段位址,另外二個位元組為段內偏移量)。該方法除了傳送較長的位址、速度較慢之外,類似按近引用傳送。

3) 按值傳送

傳送引數的值而不是位址。被呼叫的例程只知道引數的值,但不能訪問原來呼叫例程的變數,被呼叫歷程中對引數的改變不影響呼叫例程中的變數值。

引數傳遞約定是指呼叫和被呼叫間是按值還是按近引用或遠引用傳送引數,如果呼叫和被呼叫例程在引數傳遞約定上不一致,被呼叫例程將接收錯誤的資料,從而導致失敗。

各語言都有這三種方式,呼叫例程通常在介面語句(basic的declare語句,fortran的inte***ce語句,c與pascal的extern語句)中說明按什麼方式傳送引數,被呼叫例程通常是在自己的定義語句或變數(形式引數)說明中指出按什麼方式接收引數,如果不作說明,按預設值處理。各語言預設時傳送方法不同,如pascal按值傳送,basic按近引用傳送。要確保呼叫和被呼叫例程用同樣的方法傳送和接收每個引數(自變數),一般在各語言所用的引數傳送預設的基礎上作些調整,使之一致,各語言都有改變引數傳送和接收的方法。

例1:例子中c主模組從鍵盤上接收整數a和b,按值傳送被減數a和減數b給彙編過程minus,minus的返回值是兩數之差。

/* c源程式 */

/* 功能:輸入兩個整數,呼叫求二數之差的外部函式,並列印差值 */

/* 約定:採用c的命名、呼叫約定,引數傳遞約定預設,整數按值傳送 */

/* 模式:採用小模式編譯 */

extern 「c」 int minus (int,int)

main( )

; 彙編過程源程式

; 功能:接收兩個整形引數,求出兩數之差,將結果返回

; 約定:採用c的命名、呼叫約定,按值接收整數

; 模式:與c採用小模式對應,彙編採用小模式程式設計

.model small

.code

public _minus

_minus proc

push bp

mov bp, sp

mov ax, [bp+4]

mov cx, [bp+6]

sub ax, cx

pop bp

ret_minus endp

end;定義小模式

;**段開始

;說明為公共過程

;過程開始

;保留呼叫過程(主模組)的bp值

;建立本彙編過程的幀指標

;取第乙個引數被減數a

;取第二個引數減數b

;兩個引數相減

;恢復呼叫過程(主模組)的bp值

;返回;過程結束

命名約定:彙編採用了c的命名約定,雖然在c例程中外部函式名字為minus,經c編譯後放入目標檔案的函式名卻為_minus,所以彙編過程名也要為_minus。

呼叫約定:雙方都採用c的呼叫約定,c按源程式中由右至左出現的次序把引數壓入堆疊,即減數b先進棧,在堆疊的高位址處,被減數a後進棧,這裡c模組是用小的或緊湊模式編譯,返回位址為2位元組長,減數b和被減數a分別為bp+6和bp+4,如圖3-1。如果c模組用中、大或巨大的模式編譯,因為返回位址是4位元組長,則減數b和被減數a分別為bp+8和bp+6.

彙編返回時用簡單的ret指令返回c,由c呼叫程式釋放堆疊中的引數空間。

圖3-1 c按值傳整數至彙編堆疊結構圖

圖3-1中為什麼保留bp,而返回位址是bp+2,因為8086通過兩個暫存器來定址堆疊:乙個是堆疊段暫存器ss,另乙個是堆疊指標暫存器sp,ss存放的是段位址,sp是存放的偏移位址。

由於堆疊項總是16位字(2個位元組),故圖3-1中引數a存入bp+4後,b應放的位址是bp+6開始。

引數傳遞的約定:c中整數引數傳遞約定預設值為按值傳送,棧中bp+6和bp+4分別是減數b和被減數a的值而不是位址。

返回值:因為結果是2位元組整數,所以按約定放在ax中返回c。

以上例子假定c模組以小的模式編譯。不同模式將改變引數偏移位址和model偽指令所帶引數,根據c中對應的編譯模式從small、medium或large中選乙個。

在c中實數分單精度型(float)和雙精度型(double),二者表示方法相同,只是有效位數不同。float和double在使用中有個型別自動轉換問題,可歸結為以下幾點:

1) 所有實數運算都以double型進行。float型在運算前尾數要添0,延長為double型,即使運算時僅有float型,也要先進行轉換;

2) 在賦值給float變數時,double型要截去尾部,轉換為float型;

3) float型在使用時總要轉換為double型;

4) 當c函式被某模組呼叫時,不論是內部還是外部呼叫,其接收引數時,雖然源程式中引數定義為float型,然而實際上要求接收的卻是double型;

5) 當c呼叫其他外部函式,要傳送引數時,若c源程式中定義引數為float型,實際上傳送的仍是float型。但是c呼叫c內部函式時,傳送的卻是double型;

6) 當c函式接收返回值時,不論這函式是內部還是外部的,儘管源程式中函式定義為float型,然而實際上要求接收的卻是double型返回值。

例2:例子中c主模組從鍵盤上接收單精實數a和b,按值傳送被減數a和減數b給彙編過程minus,彙編送回的是雙精度的兩數之差。儘管c在extern語句中函式說明為float型別,因為c語言的單雙精度型別自動轉換要求函式接收的是double型返回值,這要求彙編過程將運算結果調整為雙精度後返回c。

另外,c傳引數給外部函式時,float型引數傳送的仍是float型,彙編過程接收的是單精度實數,經過8087指令運算,求出兩數之差並將結果調整為雙精度實數後送回。

/* c源程式 */

/*功能:輸入兩個單精度實數,呼叫求二數之差的外部函式,並列印差值*/

/* 約定:採用c的命名、呼叫約定,引數傳遞預設,實值按值傳遞 */

/* 模式:採用大模式編譯 */

extern 「c」 float minus (float , float);

main( )

; 彙編過程源程式

; 功能:接收兩個單精度實數,求出兩數之差,將結果返回

; 約定:採用c的命名、呼叫約定,實數按值接收

; 模式:與c採用大模式對應,彙編採用大模式程式設計

.model large

.code

public _minus

_minus proc

push bp

mov bp , sp

sub sp , 8

fld dword ptr [bp+6]

fsub dword ptr [bp+10]

fstp qword ptr ss:[bp-8]

mov dx , ss

lea ax , [bp-8]

mov sp , bp

pop bp

ret_minus endp

end;定義大模式

;**段開始

;說明為公共過程

;過程開始

;保留呼叫過程(主模組)的bp值

;建立本彙編過程的幀指標

;給返回值定義乙個區域性區間

;取第乙個引數a

;第乙個引數減去第二個引數

管理原理第三章

案例討論1 你認為中國家電業出路在 怎麼辦?答 我認為中國家電業的出路是提高市場占有率。具體措施有 1.提高企業自主生產能力 2.積極研發新產品,提高產品的技術含量 3.利用本國的資源優勢,降低家電生產成本,在激烈的市場競爭中以 取勝 4.企業強強聯合,建立中國的家電民族品牌,呼籲中國人支援國產。案...

第三章微機的交流訊號處理

第三章微機自動化系統的訊號處理基礎 3 1 交流引數的計算與處理 3 1.1 電力系統交流引數的計算 以往電力系統資料的採集多用變送器將交流訊號變成直流訊號。計算機技術的發展,高速a d的出現,使得我們可以採用某些演算法。對a d來的訊號進行處理後,由計算機直接計算出電力系統的電壓 電流 功率及功率...

第三章計畫

t 4 c類工作特徵是不迫切,後果影響小。f 5 既然時間客觀存在,時間就可以儲存。四 填空題 1 按計畫的約束程度劃分,計畫可分為 2 目標管理分為制定目標體系和三個階段。3 時間的特徵包括客觀性 和 4 計畫工作的核心問題是 5是管理職能中最基本的職能。五 名詞解釋題 1 計畫 2 目標管理 六...