O語言是一款中間計算機語言(或稱套裝),它具有傳統彙編語言的基本特點,也有與它們諸多不同之處。目前視窗設計、界面描述語言、O中間語言已經能很好的整合在一起(1.0.2.2版),基本有VB的事件驅動和視窗設計功能(但還不能創建COM控制項,自帶控制項也很少)。
基本介紹
- 中文名:O語言
- 外文名:O language
- 類型:計算機語言
- 屬於:語言
簡述,O彙編語言,O中間語言,語法基礎,注釋文本,運算指令,條件語句,標籤與跳轉,返回語句,語言示例,示例1:,示例2:,視窗示例,中間語言,
簡述
O語言是一款中文計算機語言(或稱套裝),各部分開發狀態:
O彙編語言(簡稱OASM,√)
O中間語言(簡稱OML,√)
O高級語言(簡稱OXX,×)
界面描述語言(簡稱OFL,√)
視窗設計(√)
目前視窗設計、界面描述語言、O中間語言已經能很好的整合在一起(1.0.2.2版),基本有VB的事件驅動和視窗設計功能(但還不能創建COM控制項,自帶控制項也很少)。
O彙編語言
顧名思義O彙編語言也是一門彙編語言,它具有傳統彙編語言的基本特點,也有與它們諸多不同之處。O彙編語言一個最大顯著的特點是支持語言配置,使得它可以支持所有你想支持的語言,當然,O彙編語言的初衷是為了支持中文,所以它可以非常好的支持中文彙編。如果你已經習慣了其它英文的彙編模式,比如你喜歡用EAX、EBP類似這樣的方式來命名暫存器,不要緊,只需要修改一下語言配置檔案,這可以輕鬆做到。O彙編語言另一個顯著的特點是指令使用非常直觀和人性化,在不缺失彙編語言靈活性的情況下,使彙編語句的語意可以很直觀地表現出來,這主要得益於用了一些象徵性的符號,使得彙編語句不再是千篇一律的 (指令 暫存器,記憶體運算元) 這樣的格式,而是更像 (暫存器 操作符 記憶體運算元)這樣的格式,不但容易理解,而且便於記憶,使彙編語言不再那么枯燥,使人一團霧水。
當然,在這裡我還是著重介紹怎么用中文來編寫程式,彙編語言通常是分段的,O彙編語言也是如此,下面是O彙編語言的基本格式:
.位模式 32 ∥指明是16位、32位還是64位的代碼
文本編寫方式 符號編寫方式
∥這裡包含一些頭檔案和庫的引用
.包含文< 檔案名稱 > 《 》
.引用庫< 庫檔案 > 〈 〉
∥數據段
.數據段 ︻
{
} ︼
∥唯讀段
.唯讀段 ﹃
{
} ﹄
∥外部引用段
.引用段 ︽
{
} ︾
∥代碼段開始
.代碼段 ︷
{
∥開始函式定義
∏主函式()
{
∥這裡添加代碼
}
} ∥代碼段結束 ︸
首先介紹注釋方式,O彙編語言使用行注釋與塊注釋方式,並分別支持兩種符號編寫方式。第一種支持C語言模式的注釋方式,即:以”//”雙左斜槓為行注釋符,以”/* */”作為塊注釋符。第二種方式是以‘∥’這個符號作為行注釋的開始,以”「 」”這兩個符號作為塊注釋符。在一行中只要遇到行注釋符,這行內以這個符號之後的文字都被忽略,在兩個注釋塊符號之間的所有文字也都被忽略。
// 這行內這之後的文字被忽略
/*
這些文字被忽略
*/
∥ 這行內這之後的文字被忽略
「
這些文字被忽略
」
O中間語言
O中間語言可以說是彙編語言的抽象,它和彙編語言一樣,使用單句的語法,除了基本的條件句和函式調用外,基本的一條指令對應一條語句,因此,它比C語言在語法上更低級一些。這樣設計的目的是為了保持底層足夠大的靈活性,使前端代碼比較容易地映射到中間語言。C語言毋庸置疑是很強大,Pascal語言也非常強大,但是你很難將兩者代碼進行相互轉換,如果使用中間語言作為中間層,就能夠兼容兩者的語法。
與O彙編語言相比之下的特色:
1.去除了彙編中段的概念(方便調用API,仍保留“引用段”)。
2.增加了控制台和動態程式庫的創建。
3.增加數組支持。
4.增加for語句,格式:設(;;;){}
5.增加do...while語句,格式:執行{}當()
6.增進循環語句。
7.增加"字元"變數。
8.去除了彙編語言中的暫存器概念。
9.增進了語法,“如果”也可以寫成“若”等。
10.支持英文語句,如“函式”可寫為function,如果寫為if,否則寫為else,.包含文寫為.include等等。
12.可以直接使用O彙編的函式,須在引用段進行調用,調用方式為API的調用方式。
13.增加了指針支持。
語法基礎
注釋文本
O中間語言的注釋與C語言注釋文本方式相同,行注釋為兩個英文右斜槓 // 塊注釋為 /* */
//這是行注釋
/*這是塊注釋
…
*/
運算指令
目前中間語言共實現了下列格式的指令
變數A = 變數B 賦值指令
變數A += 變數B 加法指令
變數A ++ 自加1指令
變數A -= 變數B 減法指令
變數A -- 自減1指令
變數A *= 變數B 乘法指令
變數A /= 變數B 除法指令
變數A %= 變數B 求模指令
變數A &= 變數B 與操作指令
變數A |= 變數B 或操作指令
變數A ^= 變數B 異或操作指令
變數A @= 變數B 取地址指令
變數A >>= 變數B 位右移指令
變數A <<= 變數B 位左移指令
變數A~ 求反指令
變數A <=> 變數B 互換指令
其中:
變數A可以是8位、16位和32位數據變數
變數B既可以是8位、16位和32位數據變數,也可以用立即數代替(除互換指令外),比如:
變數A += 0×1234
條件語句
下面介紹的條件語句中的<條件>可以是:
(變數A == 變數B)
(變數A != 變數B)
(變數A > 變數B)
(變數A < 變數B)
(變數A >= 變數B)
(變數A <= 變數B)
(變數A !> 變數B)
(變數A !< 變數B)
多個條件可以用 或者符號|| 並且符號&& 進行聯接,比如:
(((變數A == 變數B) || (變數C > 變數D)) && (變數E <= 變數F))
如果語句如果(<條件>)
{
//語句塊
}
類似C/C++的if語句。
如果條件成立就執行語句塊,也可以寫成:
若(<條件>)
{
//語句塊
}
否則如果語句否則如果(<條件>)
{
//語句塊
}
類似C/C++的else if語句。
如果條件成立就執行語句塊,必須與前一個語句為“如果”語句或“否則如果”語句匹配使用,也可以寫成:
又若(<條件>)
{
//語句塊
}
否則語句否則
{
//語句塊
}
類似C/C++的else語句。
必須與前一個語句為如果語句或否則如果語句匹配使用,也可以寫
成:
則
{
//語句塊
}
循環語句循環(<條件>)
{
//語句塊
跳出; //break
繼續; //continue
}
類似C/C++的while語句。
如果條件成立則執行{}中的代碼,再判斷條件,滿足則繼續執行語句塊,直到不滿足才跳出。循環中可以在任何地方使用“跳出;”來跳出循環(不管是否滿足)。也可以使用“繼續;”語句直接進入下一次條件判斷。
執行…當語句執行
{
//語句塊
跳出; //break
繼續; //continue
}當(<條件>)
類似C/C++的do…while語句。
與循環語句相似,只是判斷條件在語句塊之後,也就是說語句塊至少會被執行一次。
設語句設(語句1;<條件>;語句3)
{
//語句塊
跳出; //break
繼續; //continue
}
類似C/C++的for循環。
整數 i,j=0;
設(i=0;i<=100;i++)
{
j++;
}
i和j將循環100次
先執行語句1,再判斷條件語句,滿足,執行語句3,再執行{}中的語句,再判斷(注意不再執行語句1),滿足,繼續……如此循環,直到不滿足語句2為止。
標籤與跳轉
標籤 標籤A:
跳到 標籤A;
跳到語句與C語言的goto語言作用相同,在函式內直接跳轉到標籤所定義的位置執行。
返回語句
函式可以有多個返回值,這必須在函式定:
有多個函式值時必須使用括弧()
函式 函式名(整數32,整數32)=>(整數32,整數32,結構體名)
{
//函式體
返回(0×1234,變數A,結構A);
}
要接收返回值
如果只有一個返回值可以用
變數A = 函式名(1,2); 或者 函式名(1,2)=>變數A;
如果有多個返回值則必須用下列格式:
函式名(1,2)=>(變數A,變數B);
語言示例
示例1:
《*.\oasm32.oah》//包含頭檔案
〈*.\user32.lib〉//引用系統API,user32.dll
︽ //引用段
∫信息框:MessageBoxA(雙字,雙字,雙字,雙字)//定義一個函式,MessageBoxA
︾ //引用段結束
︷ //代碼段
∏主函式()//定義程式入口
{
信息框(0,&"Hello world",&"你好世界",4) //使用API MessageBoxA
}
︸ //代碼段結束
//這段代碼雖然可以顯示信息框,但是必須手動結束進程。
示例2:
《*.\oasm32.oah》
〈*.\user32.lib〉
〈*.\kernel32.lib〉
︽
∫信息框:MessageBoxA(雙字,雙字,雙字,雙字)
∫ExitProcess(雙字)
︾
︷
∏主函式()
{
信息框(0,&"Hello world",&"你好世界",4)
ExitProcess(0)
}
︸
//這段代碼可以運行完畢後自動結束進程。
視窗示例
.包含文<*oasm32.oah>
.引用庫<*Kernel32.lib>
.引用庫<*user32.lib>
結構 窗體結構
{
雙字 結構大小
雙字 視窗風格
雙字 視窗過程
雙字 類名附加空間
雙字 視窗附加空間
雙字 實例句柄
雙字 圖示句柄
雙字 游標句柄
雙字 背景顏色
雙字 選單指針
雙字 類名指針
雙字 附加圖示
}
結構 坐標
{
雙字 X軸
雙字 Y軸
}
結構 訊息結構
{
雙字 視窗句柄
雙字 訊息標識
雙字 參數一
雙字 參數二
雙字 時間
坐標 位置
}
宏定義
{
垂直重繪 0x1
水平重繪 0x2
背景色 0x6
圖示形狀 32512
滑鼠形狀 32512
框線樣式 0x76c66
標題欄 0x0C00000
系統選單 0x80000
邊界粗細 0x40000
最小化 0x20000
最大化 0x10000
默認坐標X 250
默認坐標Y 394
默認寬度 320
默認高度 185
顯示方式 10
關閉訊息 0x2
}
.唯讀段
{
位元組 視窗標題.. = "This are OASM Window"
位元組 提醒內容.. = "主視窗創建失敗"
位元組 提醒標題.. = "警告"
}
.引用段
{
函式 獲取模組句柄:GetModuleHandleA(雙字)
函式 載入圖示:LoadIconA(雙字,雙字)
函式 載入游標:LoadCursorA(雙字,雙字)
函式 註冊視窗類:RegisterClassExA(雙字)
函式 創建視窗:CreateWindowExA(雙字,雙字,雙字,雙字,雙字,雙字,雙字,雙字,雙字,雙字,雙字,雙字)
函式 信息視窗:MessageBoxA(雙字,雙字,雙字,雙字)
函式 顯示視窗:ShowWindow(雙字,雙字)
函式 更新視窗:UpdateWindow(雙字)
函式 獲取訊息:GetMessageA(雙字,雙字,雙字,雙字)
函式 訊息翻譯:TranslateMessage(雙字)
函式 訊息調度:DispatchMessageA(雙字)
函式 郵送結束訊息:PostQuitMessage(雙字)
函式 默認視窗過程:DefWindowProcA(雙字,雙字,雙字,雙字)
函式 退出進程:ExitProcess(雙字)
}
.代碼段
{
入口 主函式()
{
主視窗()
退出進程(0)
}
函式 主視窗()
{
雙字 模組句柄
獲取模組句柄(0)
模組句柄 = 累加32
窗體結構 我的視窗類
我的視窗類.結構大小 = 取大小 我的視窗類
我的視窗類.視窗風格 = 垂直重繪 | 水平重繪
我的視窗類.視窗過程 = 訊息處理程式
我的視窗類.類名附加空間 = 0
我的視窗類.視窗附加空間 = 0
壓棧 模組句柄
出棧 我的視窗類.實例句柄
我的視窗類.背景顏色 = 背景色
我的視窗類.選單指針 = 0
我的視窗類.類名指針 = 取地址 視窗類名
載入圖示(0,圖示形狀)
我的視窗類.圖示句柄 = 累加32
我的視窗類.附加圖示 = 累加32
載入游標(0,滑鼠形狀)
我的視窗類.游標句柄 = 累加32
累加32 @= 我的視窗類
註冊視窗類(累加32)
雙字 主視窗句柄
累加32 = 框線樣式 | 標題欄 | 系統選單 | 邊界粗細 | 最小化 | 最大化
創建視窗(0,取地址 視窗類名,取地址 視窗標題,累加32,默認坐標X,默認坐標Y,默認寬度,默認高度,0,0,模組句柄,0)
主視窗句柄 = 累加32
如果(主視窗句柄 == 0)
{
信息視窗(0,取地址 提醒內容,取地址 提醒標題,16)
返回 0
}
顯示視窗(主視窗句柄,顯示方式)
更新視窗(主視窗句柄)
訊息結構 訊息
循環(真)
{
累加32 @= 訊息
獲取訊息(累加32,0,0,0)
如果(累加32==0)
{
跳出
}
累加32 @= 訊息
訊息翻譯(累加32)
累加32 @= 訊息
訊息調度(累加32)
}
}
函式 訊息處理程式(雙字 句柄,雙字 訊息,雙字 訊息參數一,雙字 訊息參數二)
{<基數32,基址32,源址32>
累加32 = 訊息
如果(累加32 == 關閉訊息)
{
郵送結束訊息(0)
}
否則
{
默認視窗過程(句柄,訊息,訊息參數一,訊息參數二)
返回
}
累加32^=累加32
}
}
//可以顯示一個視窗
中間語言
Hello,World!示例
.包含文<*視窗32.omh>
入口 主函式()
{
MessageBox(0,&"Hello,World!",&"",0);
ExitProcess(0);
}