映射器
輸入所定義的映射語言編寫的源程式代碼,在映射器的映射下可以高效轉化為不同處理器上各自執行的彙編語言代碼,具體過程如圖1所示。
在語法方面,映射語言的語法形式類似於 C 語言,它的部分語句可借用高級語言中實現特定功能的函式形式表達。在語義方面,映射語言程式通過映射器的執行以生成各種不同處理器對應的程式指令。映射語言和 X86、ARM 和 MIPS 處理器上運行的彙編指令存在一種映射關係,形式上不同於一般的彙編指令,省去了複雜的助記符表示形式。映射語言借鑑高級語言命令的構建方法,建立了一套基本完整的映射語言詞法、語法規則,除了實現一些基本功能的命令外,還可以很容易的通過語句的組合和嵌套來實現較為複雜的功能,具備了一定的可擴展性和延展性。映射語言從設計之初便是為了實現平台無關性,以及從映射語句到各種不同處理器上彙編指令的映射,有效地避開了目標處理器指令系統的複雜細節,滿足了多平台使用的需求 。
映射語言的定址
一般的彙編指令均帶有一個或以上的運算元,那么就必須表明以什麼樣的方式來獲取運算元,獲得運算元的方式稱為運算元的定址方式。
運算元的來源主要有三種:指令中的立即數、暫存器中的暫存器運算元和記憶體中的存儲器運算元。對於存儲器運算元,一種可以通過給出的存儲器地址獲得其中的內容,地址可以間接由暫存器給出,或直接為物理地址,存儲器運算元可表示為“[暫存器名]”或“[物理地址]”;一種是直接由變數代表存儲器中的內容。映射語言的形式接近高級語言形式,所以,彙編語言指令中所特有的定址方式在映射語言中將以賦值語句的方式出現。賦值語句通過等號“=”連線,將等號右邊的運算元賦給等號左邊的運算元。針對以上運算元的三種來源,映射語言的賦值語句形式主要可分為以下五種:
第一種:直接將立即數的值賦給暫存器或存儲器,即對應於彙編指令的立即定址;
第二種:將暫存器的值賦給另一暫存器,即對應於彙編指令的暫存器定址;
第三種:存儲器與暫存器之間的數據傳送,當存儲器地址用暫存器內容給出時,即對應於彙編指令的暫存器間接定址;
第四種:以物理地址或暫存器的值與“變址”的值之和為地址,在存儲器中找到該地址中的值賦給暫存器,即對應於彙編指令的基址變址定址;
第五種:存儲器之間的數據傳送,形式上為變數之間相互賦值。
下面將詳細介紹五種賦值語句的格式並舉例加以說明。
a. 第一種
最簡單直接的方式給出運算元的方法,就是在賦值語句中將立即數的值直接賦給暫存器或存儲器,運算元可以是有符號數或無符號數。它的主要功能是給暫存器或者存儲單元賦初值,也可以用來與暫存器運算元或者存儲器運算元進行算術運算或邏輯運算,並且還要注意的是立即數不能在等號左邊的位置出現。例如:(1). R1= 1234H; (2). [2000H] =5; (3). X=0;意義:這三條賦值語句功能分別是:將 16 位立即數 1234H 傳送到 R1 暫存器中;將立即數 5 賦值給地址為 2000H 的存儲器中;將變數 X 初始化為 0。
b. 第二種
運算元均在 CPU 的暫存器中,等號左右兩側是暫存器的代號,進行暫存器之間的數據傳送。例如:R1= R2;意義:這裡的運算元 1(R1)、運算元 2(R2)均在暫存器中,功能是將暫存器 R2的值賦給暫存器 R1 中。
c. 第三種
運算元的內容在存儲器或暫存器中,用“[暫存器名]”表示從以暫存器內容為地址的存儲器中獲取運算元,用“[物理地址]”表示直接從存儲器物理地址中獲取運算元。例如:(1). R1= [R2] ; (2). R3=[2000H];(3). R4= x;意義:(1)中以 R2 暫存器里的值作為運算元的地址,以此地址在存儲器中找到運算元賦給暫存器 R1;(2)中將存儲器物理地址為 2000H 的內容賦值給 R3;(3)中直接將存儲器中的內容 x 賦值給暫存器 R4。說明:變數或表示地址的“[暫存器名]”、“[物理地址]”在等號左側時,表示將等號右側的暫存器運算元送至保存此變數或此地址的存儲器中。
d. 第四種
這種賦值方式是在第三種的基礎上擴展出來的,運算元的內容放在存儲器中,但運算元的地址不僅通過暫存器的內容或物理地址來獲得,還多了一項地址偏移量。以暫存器內容與或物理地址的值與偏移量的和作為運算元的總地址,通過這個地址在存儲器中取得運算元,用“偏移量[暫存器名]”或“偏移量[物理地址]”表示。偏移量可以由暫存器內容或立即數提供。例如:(1). R1=R3 [R2] ; (2). R4=2 [R5];(3). R6=08H [2001H]意義:(1)、(2)中,分別將 R2 和 R3 中的內容相加或 R5 中的內容與 2 相加得到運算元的地址,在存儲器中找到這個地址中存放的數據,將它賦給 R1 或 R4 暫存器。(3)中,從以 2009H(2001H+08H)為地址的存儲器中得到運算元賦給 R6。
e. 第五種
將存儲器某一地址單元中的內容賦值給另一地址單元的內容。運算元均存在於存儲器中,以變數的形式表達。例如:x = y;彙編語言中並沒有存儲器之間相互傳遞數據的指令,所以在彙編語言中,將映射語言變數之間的賦值用 2 條暫存器與存儲器之間的數據傳送指令表示。
映射語言的語句
映射語言語句概述
指令是讓計算機完成某種操作的命令,指令系統是指令的集合,不同系列的計算機有不同的指令。彙編語言的指令是將二進制代碼表示的機器指令用英文字母或者符號表示出來,增強指令的可讀性,並且彙編與機器指令一一對應。
定義的映射語言,在形式上接近高級語言,所以,類似於彙編的指令,映射語言有自己實現不同功能的命令語句,它用來向計算機發出該如何進行操作的命令。一個程式中包含若干條語句,理論上可以支持 X86、ARM 和 MIPS 處理器中所有的指令。它使用類似高級語言形式的語句運算符代替了各種複雜多樣難以記憶的彙編指令助記符,禁止了各種不同彙編指令集的複雜性,並且用映射語言將不同處理器的彙編指令統一起來,做到跨平台使用,增強指令的可移植性,也保證了良好的目標處理器擴展性。
對於映射語言的語句,本章從語句的類型和形式方面加以詳細的介紹,並給出映射語言的語句符號映射表。
映射語言的語句類型及形式
彙編語言的指令是由運算元和操作碼兩部分組成,而映射語言的語句只保留運算元部分,摒棄了複雜的操作碼,將其用簡單的運算符號代替,更簡潔明了。映射語言語句的運算元可以是兩個或者三個,運算元的類型可以是存儲器、暫存器或者變數,提供了運算元從哪裡得到、結果送到哪裡等信息。經過在第二章中對 X86、ARM 和 MIPS 處理器的指令集介紹,可以總結出映射語言的語句類型。映射語言共有 6 種類型,分別為:
1、賦值語句;
2、表達式語句;
3、函式調用語句;
4、控制語句;
5、複合語句;
6、其他語句。
下文將逐一對這六種語句進行討論。
a.賦值語句
實現 CPU 和存儲器、CPU 與外設之間、暫存器之間和存儲器之間的數據傳送.
b. 表達式語句
映射語言表達式語句包括算術運算表達式語句、邏輯運算表達式語句、關係表達式語句和移位表達式語句。
(1)算術運算表達式語句
提供加、減、乘、除這四種最基本的算術運算功能,並且可用於有符號數和無符號數的運算,有無符號在語句上並無區別,只在類型聲明中需要特別說明。運算元 1、2 的類型可以是暫存器或存儲器;運算元 3 的類型可以是暫存器、存儲器或立即數。形式:運算元 1 = 運算元 2 op 運算元 3;op 為運算符“+”、“-”、“*”或“/” 例如: R1=R2+[R3];R4=R4-X;R5=R6*R7;R8=R9/6;X=R10-1;功能:完成兩個運算元加、減、乘或除的操作,結果賦給運算元 1,運算元 2、3 的值不變。加減運算中,當運算元 1 與運算元 2 相等,且運算元 3 為常數 1 時,可完成運算元 1 自增或自減的功能;乘法運算中,運算元 2、3 的初始值位數相同且最大為 16 位。
(2)邏輯運算表達式語句
映射語言的邏輯運算表達式語句提供的是對二進制位的操作功能,可以直接對暫存器或存儲器中的位進行操作,通過按位邏輯運算操作,可以達到不同的目的。映射語言提供與、或、非、異或這四種邏輯運算。
i. 形式:運算元 1 = 運算元 2 op 運算元 3,op 為“&”、“|”、“^”。
例如:R1=R2&0FH;R3=R4|30H;R5=R6^R6;
功能:運算元 2 和運算元 3 做邏輯按位與(&)、或(|)、異或(^)操作,結果賦給運算元1,運算元 2、3 的值不變。需要說明的是:運算元 1、2 為暫存器,運算元 3 可以是暫存器,也可以為立即數;當作邏輯異或運算時,運算元 2 與運算元 3 相同,則可完成清零操作。
ii. 形式:運算元 1 = ~ 運算元 2.
例如:R1=~R2;X=~R3;
功能:將運算元 2 中的內容按位取反後,將結果賦給運算元 1,運算元 1、2 為暫存器或存儲器。
(3)關係表達式語句
映射語言的關係表達式語句是由!=、>、<、>=、<=、==這些關係運算符構成的語句。
形式:運算元 1 op 運算元 2;op 為“!=”、“>”、“<”、“>=”、“<=”、“==”
說明:關係表達式不用返回結果,一般作為條件選擇語句的判斷。運算元 1、2 為暫存器、變數或立即數。
(4)移位表達式語句
移位表達式語句包括算術移位和邏輯移位兩種。邏輯左移和算數左移用“<<”表示,邏輯和算數左移的效果相同,移動後最低位補 0;邏輯右移和算數右移用“>>”表示,邏輯右移移動後最高位補 0,算術右移最高位仍保留原來數據的最高位不變。
形式:運算元 1 = 運算元 2 op CNT,op 為 “<<”或“>>”
例如:R1=R2<<2;R2=R3>>3;
功能:將運算元 2 中所有位按規定向左或向右移動 CNT 位,CNT 為常數,範圍為0~225,之後將結果賦值給運算元 1。運算元 1,2 為暫存器。
說明:進行右移操作時,當運算元 2 中的數為有符號數時執行算術右移,無符號數時執行邏輯右移。
c. 函式調用語句
在映射語言中,函式調用的具體語句形式如下:函式名 (參數名列表);
例如:(1). R1=sum () ; (2). X=sum(R3,R4)+5;
功能:(1)中將 sum()函式返回值賦給 R1,參數名列表為空;(2)中將函式返回值與 5的和賦給 X,函式調用中 2 個參數分別為 R3 和 R4。
說明:在映射語言中,函式調用的方式一般以函式表達式的形式出現,稱為函式表達式語句,這要求函式帶回一個確定的值以參加表達式運算。參數名列表可以為空。
d. 控制語句
映射語言的控制語句是用來完成一定控制功能的語句,它主要分為四種:條件語句、循環語句、跳轉語句、從函式返回語句。
(1)條件語句
形式:if(關係表達式){語句列表;}else{語句列表;}
例如:if (R1! =0) {goto L1;}
功能:如果條件滿足括弧內的表達式,也就是說表達成立時,則執行“{}”內的語句,不滿足時,執行 else{}內的內容,有的程式中可以沒有 else{}。一般情況下,if 後會與 goto語句連用,表示條件成立,跳轉至子程式 L1 執行命令。
(2)循環語句
形式:for(init;cond;expr){語句列表;}
例如:for(R1=3;R1>0;R1-1)
功能:for()循環控制語句,init 表示初始值,cond 表示條件,expr 為算數運算表達式,說明值的變化情況。
(3)跳轉語句
形式:goto Label;
例如:goto L1;
功能:用來改變程式的執行順序,表示直接跳轉至指定程式段處,Label 可以是任一程式段處的標號名(L1)。映射語言的跳轉語句在形式上並不區分條件或非條件轉移,若是轉移需要附加條件,則用 if 條件語句+goto 語句配合完成。
(4)從函式返回語句
形式:ret 返回值;
功能:函式返回語句,一般在有返回值的函式中使用,表示調用子函式結束,將值返。
e. 複合語句
映射語言中,用“{}”將一些語句列表括起來成為複合語句。映射語言中還有 2 個函式命令語句,他們同樣在編程中起到必不可少的作用,以下給出這兩個函式並介紹其功能。