Hello World! Hello Jaja!

export hello
export msg

jump hello

msg:
db "Hello Hello!", '\n', 0

hello:
push msg
call system.outstr
ret

這是使用jaja指令集實作的一個HelloWorld程式,jaja指令集乍看下和x86指令集很相像,但其實並不相同。jaja是一個軟體虛擬機器,是一個Stack Machine類型的虛擬機器,也就是指令操作的對象都是置於堆疊中。

原始碼檔組譯過後,如果沒有任何錯誤發生則會輸出一個mod檔案。每一個原始碼檔,可以組譯成一個對應的mod檔。透過dump工具顯示組譯過後的mod檔內容,如下。

module 'test/hello.mod', version: 0.01
...names table
0 hello
1 msg
2 system
3 outstr
...exports table
0 hello 16
1 msg 3
...imports table
0 system.outstr
...code section
code size: 23 byte(s)

可以觀察到,mod檔是section導向的。可以看到import/export表,這和系統呼叫及symbol匯出相關。import/export表都是以字串型式儲存,所以還可看到一個名稱字串表。最後是一個程式碼區段,每一個程式碼區段的大小最大為64k。


使用dbg工具,可以以單步的方式去追踪程式的執行,以及作基本的除錯。在命令提示符號下輸入g指令直接執行程式,觀看結果。畫面輸出

Hello World!

在Hello程式裡面,export了二個symbol,hello及msg。hello指向一個函式的開始,而msg指向一串資料的開始。下面的範例import中,使用了這二個在hello程式裡export的symbol。

call hello.hello

push hello.msg
call system.outstr

ret

如同要輸出字串時,使用system模組export的outstr呼叫,要使用hello模組export的hello或msg,則使用hello.hello或hello.msg。import模組dump結果如下。

module 'test/import.mod', version: 0.01
...names table
0 hello
1 msg
2 system
3 outstr
...imports table
0 hello.hello
1 hello.msg
2 system.outstr
...code section
code size: 10 byte(s)

留言

這個網誌中的熱門文章

以lex/yacc實作算式計算機

猜數字遊戲 (電腦猜人)

KillSudoku 4顆星精彩數獨詳解 - 鍊技巧