複製鏈接
請複製以下鏈接發送給好友

O語言

鎖定
O語言是一款中間計算機語言(或稱套裝),它具有傳統彙編語言的基本特點,也有與它們諸多不同之處。窗口設計、界面描述語言、O中間語言已經能很好的整合在一起(1.0.2.2版),基本有VB的事件驅動和窗口設計功能(但還不能創建COM控件,自帶控件也很少)。
中文名
O語言
外文名
O language
所屬學科
計算機

O語言簡述

O語言是一款中文計算機語言(或稱套裝),各部分開發狀態:
O彙編語言(簡稱OASM,√)
O中間語言(簡稱OML,√)
O高級語言(簡稱OXX,×)
界面描述語言(簡稱OFL,√)
窗口設計(√)
窗口設計、界面描述語言、O中間語言已經能很好的整合在一起(1.0.2.2版),基本有VB的事件驅動和窗口設計功能(但還不能創建COM控件,自帶控件也很少)。

O語言O彙編語言

顧名思義O彙編語言也是一門彙編語言,它具有傳統彙編語言的基本特點,也有與它們諸多不同之處。O彙編語言一個最大顯著的特點是支持語言配置,使得它可以支持所有你想支持的語言,當然,O彙編語言的初衷是為了支持中文,所以它可以非常好的支持中文彙編。如果你已經習慣了其它英文的彙編模式,比如你喜歡用EAX、EBP類似這樣的方式來命名寄存器,不要緊,只需要修改一下語言配置文件,這可以輕鬆做到。O彙編語言另一個顯著的特點是指令使用非常直觀和人性化,在不缺失彙編語言靈活性的情況下,使彙編語句的語意可以很直觀地表現出來,這主要得益於用了一些象徵性的符號,使得彙編語句不再是千篇一律的 (指令 寄存器,內存操作數) 這樣的格式,而是更像 (寄存器 操作符 內存操作數)這樣的格式,不但容易理解,而且便於記憶,使彙編語言不再那麼枯燥,使人一團霧水。
當然,在這裏我還是着重介紹怎麼用中文來編寫程序,彙編語言通常是分段的,O彙編語言也是如此,下面是O彙編語言的基本格式:
.位模式 32 ∥指明是16位、32位還是64位的代碼
文本編寫方式 符號編寫方式
∥這裏包含一些頭文件和庫的引用
.包含文< 文件名 > 《 》
.引用庫< 庫文件 > 〈 〉
.數據段 ︻
{
} ︼
∥只讀段
.只讀段 ﹃
{
} ﹄
∥外部引用段
.引用段 ︽
{
} ︾
代碼段開始
.代碼段 ︷
{
∥開始函數定義
{
∥這裏添加代碼
}
} ∥代碼段結束 ︸
首先介紹註釋方式,O彙編語言使用行註釋與塊註釋方式,並分別支持兩種符號編寫方式。第一種支持C語言模式的註釋方式,即:以”//”雙左斜槓為行註釋符,以”/* */”作為塊註釋符。第二種方式是以‘∥’這個符號作為行註釋的開始,以”「 」”這兩個符號作為塊註釋符。在一行中只要遇到行註釋符,這行內以這個符號之後的文字都被忽略,在兩個註釋塊符號之間的所有文字也都被忽略。
// 這行內這之後的文字被忽略
/*
這些文字被忽略
*/
∥ 這行內這之後的文字被忽略
這些文字被忽略

O語言O中間語言

O中間語言可以説是彙編語言的抽象,它和彙編語言一樣,使用單句的語法,除了基本的條件句和函數調用外,基本的一條指令對應一條語句,因此,它比C語言在語法上更低級一些。這樣設計的目的是為了保持底層足夠大的靈活性,使前端代碼比較容易地映射到中間語言。C語言毋庸置疑是很強大,Pascal語言也非常強大,但是你很難將兩者代碼進行相互轉換,如果使用中間語言作為中間層,就能夠兼容兩者的語法。
O中間語言使用了掛載技術,使前端代碼的解析與後端代碼生成操作進行了分離,使用這一技術只須擴展相應的前端語法就能支持多種語法。所有掛載的接口都封裝在OMount.dll的動態鏈接庫中。
與O彙編語言相比之下的特色:
1.去除了彙編中段的概念(方便調用API,仍保留“引用段”)。
2.增加了控制枱和動態鏈接庫的創建。
3.增加數組支持。
4.增加for語句,格式:設(;;;){}
5.增加do...while語句,格式:執行{}當()
6.增進循環語句
7.增加"字符"變量。
8.去除了彙編語言中的寄存器概念。
9.增進了語法,“如果”也可以寫成“若”等。
10.支持英文語句,如“函數”可寫為function,如果寫為if,否則寫為else,.包含文寫為.include等等。
11.可以直接支持masm32宏定義
12.可以直接使用O彙編的函數,須在引用段進行調用,調用方式為API的調用方式。
13.增加了指針支持。

O語言語法基礎

O語言註釋文本

O中間語言的註釋與C語言註釋文本方式相同,行註釋為兩個英文右斜槓 // 塊註釋為 /* */
//這是行註釋
/*這是塊註釋
*/

O語言運算指令

中間語言共實現了下列格式的指令
變量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

O語言條件語句

下面介紹的條件語句中的<條件>可以是:
(變量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為止。

O語言標籤與跳轉

標籤 標籤A:
跳到 標籤A;
跳到語句與C語言的goto語言作用相同,在函數內直接跳轉到標籤所定義的位置執行。

O語言返回語句

函數可以有多個返回值,這必須在函數定:
有多個函數值時必須使用括號()
函數 函數名(整數32,整數32)=>(整數32,整數32,結構體名)
{
返回(0×1234,變量A,結構A);
}
要接收返回值
如果只有一個返回值可以用
變量A = 函數名(1,2); 或者 函數名(1,2)=>變量A;
如果有多個返回值則必須用下列格式:
函數名(1,2)=>(變量A,變量B);

O語言語言示例

O語言示例1

《*.\oasm32.oah》//包含頭文件
〈*.\user32.lib〉//引用系統API,user32.dll
︽ //引用段
∫信息框:MessageBoxA(雙字,雙字,雙字,雙字)//定義一個函數,MessageBoxA
︾ //引用段結束
︷ //代碼段
主函數()//定義程序入口
{
信息框(0,&"Hello world",&"你好世界",4) //使用API MessageBoxA
}
︸ //代碼段結束
//這段代碼雖然可以顯示信息框,但是必須手動結束進程。

O語言示例2

《*.\oasm32.oah》
〈*.\user32.lib〉
〈*.\kernel32.lib〉
∫信息框:MessageBoxA(雙字,雙字,雙字,雙字)
∫ExitProcess(雙字)
∏主函數()
{
信息框(0,&"Hello world",&"你好世界",4)
ExitProcess(0)
}
//這段代碼可以運行完畢後自動結束進程。

O語言窗口示例

.包含文<*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
}
.只讀段
{
字節 窗口類名.. = "Window"
字節 窗口標題.. = "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
}
}
//可以顯示一個窗口

O語言中間語言

Hello,World!示例
.包含文<*視窗32.omh>
入口 主函數()
{
MessageBox(0,&"Hello,World!",&"",0);
ExitProcess(0);
}