hackCpuExt - cccbook/sp GitHub Wiki
HackCPU 延伸指令集
基本運算延伸
D << AM // 左移
D >> AM // 右移
D * AM // 乘法
D / AM // 除法
D % AM // 餘數
D < AM // 小於
D <= AM // 小於或等於
D > AM // 大於
D >= AM // 大於或等於
D == AM // 等於
D != AM // 不等於
D ^ AM // xor
軟體中斷延伸
swi 是軟體中斷 Software Interrupt 的簡稱,swi 會根據暫存器 A 的內容決定要做甚麼動作。
舉例而言,swi 0 會印出暫存器 D 中的整數,意思是下列程式會印出 374
@374
D=A
@0
swi
HackCPU 的延伸指令集包含一組預先定義好的 swi,像是 swi 0 是印出整數, swi 16 是設定浮點數。
有了 swi ,我們可以定義一些巨集運算,以下是HackCPU 的延伸指令集所支援的預設巨集運算:
// 列印功能
iput = @0;swi // 印出整數
cput = @1;swi // 印出字元
sput = @%s;D=A;@3;swi // 印出字串
// 浮點數功能
巨集 = 展開內容
fput = @18;swi
fset t = @t;D=A;@16;swi // 將 t 位置的兩格記憶體設定給 f
fget t = @t;D=A;@16;swi // 取回 f 並放入 t 位置的兩格記憶體
fadd t = @t;D=A;@19;swi // f = f + t
fsub t = @t;D=A;@20;swi // f = f - t
fmul t = @t;D=A;@21;swi // f = f * t
fdiv t = @t;D=A;@22;swi // f = f / t
延伸版的 HackCPU 浮點數 f 被映射到位址 m[24577..24578],以 32 位元浮點數表示,緊接在鍵盤暫存器的後面。
所以我們可以用 @24577; D=M 取得 f 的前 16bit,然後用 @24578; D=M 取得 f 的後 16bit。(如果有需要的話!)