參照之前提到的編碼格式,其對應的指令流為0x02 0x02 0x01 0x00 0x00000001 0x00000001一共12位元組.
下面,我們用opcode表示操作碼.op1表示操作數1,op2表示操作數2,GLOBAL表示接受堆數據數據類型,LOCAL表示接受棧數據數據類型,REG表示接受寄存器數據類型,int,float,string,memory分別表示接受整形,浮點型,字元串型和數據流型常量.num表示接受一個數字,即可是是浮點類型也可是整數類型.
當然,操作數1必須是一個寄存器或者是堆棧中的元數據,因為常量不能被賦值,操作數2可以是一個寄存器或者堆棧中的元數據或者一個數字常量都可.
相比於可能修改元數據需要小心翼翼管理內存的指令,條件跳轉指令的實現可就簡單的多了,唯一需要注意的是,如何確定跳轉的位置,在x86指令集中,跳轉指令的設計就複雜的多了,有近跳轉,遠跳轉,相對跳轉和絕對跳轉,但是在StoryVM中,跳轉指令並不需要設計的那麼複雜,所有的跳轉指令都為絕對跳轉.
這麼設計當然沒有一點問題,但是我們不可能在編寫程序時,手工去計算我們要跳轉的位置,那麼問題就是如何確定跳轉的地址了,幸運的是,每條指令的長度都可以很方便的進行計算,我們只需要設計一個標誌,就可以很容易計算出標誌所在的地址了
需要注意的一點是,如果一個彙編程序從開始編譯到結束,那麼,標號必須在JMP指令之前,也就是說JMP必須是向前跳轉的,這顯然不符合一個跳轉指令應該具有的功能,要解決這一個問題實際也並不複雜,在彙編指令的編譯期間,對源代碼進行兩次掃描,第一次掃描確定所有的標號對應的位置,第二次掃描才將JMP指令」連接」到對應的標號中實現跳轉,