2010-05-25 107 views
5

在大學的最後一個學期,我的計算機語言課的老師教給我們一個深奧的語言Whitespace。爲了以非常繁忙的時間表(midterms)更好地學習語言,我在Python中寫了interpreterassembler。一個assembly language被設計爲便於編寫程序,並且sample program是用給定程序集mnemonics編寫的。你對這些彙編助記符有什麼建議嗎?

現在是夏天,一個新的項目已經開始,目標是重寫Whitespace 0.3的解釋器和彙編器,隨後會有進一步的發展。由於在設計過程中需要比以前多得多的時間,因此您將在這裏給出一個提供彙編語言修訂後的助記符集的大綱。這篇文章被標記爲wiki供他們討論。

過去你有過使用匯編語言的經驗嗎?有沒有一些你認爲應該改名爲不同的指令?你是否發現自己在盒子外面思考,並採用與助記符命名不同的範式?如果您對這些問題中的任何一個都能回答「是」,那麼您非常歡迎您。主觀答案表示讚賞!


棧操作(IMP:[空間])

堆棧操作是比較常見的操作中的一個,所述IMP [空間]的因此短促。有四個堆棧指令。

hold N  Push the number onto the stack 
copy   Duplicate the top item on the stack 
copy N  Copy the nth item on the stack (given by the argument) onto the top of the stack 
swap   Swap the top two items on the stack 
drop   Discard the top item on the stack 
drop N  Slide n items off the stack, keeping the top item 

算術(IMP:[索引] [空間])

算術命令等的堆棧頂部的兩個項目進行操作,並且與操作的結果替換它們。推送的第一個項目被認爲是操作員的剩餘部分。

add   Addition 
sub   Subtraction 
mul   Multiplication 
div   Integer Division 
mod   Modulo 

堆存取(IMP:[索引] [Tab]鍵)

堆訪問命令看堆棧找到物品的地址被存儲或檢索。要存儲項目,請按地址,然後按值並運行存儲命令。要檢索一個項目,請按住該地址並運行retrieve命令,該命令會將存儲在該位置的值置於堆棧頂部。

save   Store 
load   Retrieve 

流控制(IMP:[LF])

流量控制操作也很常見。子例程由標籤標記,以及有條件跳轉和無條件跳轉的目標,通過它們可以實現循環。程序必須通過[LF] [LF] [LF]結束,以便解釋器可以乾淨地退出。

L:   Mark a location in the program 
call L  Call a subroutine 
goto L  Jump unconditionally to a label 
if=0 L  Jump to a label if the top of the stack is zero 
if<0 L  Jump to a label if the top of the stack is negative 
return  End a subroutine and transfer control back to the caller 
halt   End the program 

I/O(IMP:[Tab]鍵[LF])

最後,我們需要能夠與用戶交互。有讀寫數字和單個字符的IO指令。通過這些,可以編寫字符串操作例程。讀取指令採用堆棧地址來存儲堆棧頂部的結果。

print chr Output the character at the top of the stack 
print int Output the number at the top of the stack 
input chr Read a character and place it in the location given by the top of the stack 
input int Read a number and place it in the location given by the top of the stack 

問:你將如何重新設計,重寫或重命名之前的助記符是爲了什麼原因?

+5

聖潔的廢話,一個空白的彙編?我相信你的極客米就上升到了十一點! – Martin 2010-05-25 00:43:22

回答

2
  • 推#N,使之清楚,n是立竿見影的。
  • 「swap」有時是「exc」或「exch」我認爲。
  • 「保存」 通常 「ST」(存儲)
  • 「負載」 通常 「LD」
  • 「呼叫」 也可以是 「JSR」 或 「BL」。
  • 「GOTO」 通常 「的jmp」 或 「胸罩」
  • 「IF = 0」 通常是 「BEQ」
  • 「如果< 0」 通常是 「BLT」
  • 「返回」 通常「 ret「或」blr「
  • 」exit「通常在CPU的上下文中是」halt「/」hlt「。
  • 「print chr」和「print int」可以是「print.c」和「print.i」。指定指令變體有許多方法,但通常不在操作數中。

編輯:

如果你不介意的話混爲一談操作碼和尋址方式,使用CISCy語法,

  • 「推(SP)」,而不是 「複製」
  • 「推N(sp)」而不是「copy N」(模乘以字大小)
  • 「push *(sp)」,而不是「load」(除非它在推入加載的值之前彈出)
  • 「彈出* 1(SP)」,而不是「推」(除了它實際上彈出兩次)

在另一方面,基於堆棧的代碼通常對待壓入和彈出爲隱含的。在這種情況下,「imm」(即時)而不是「推」。然後所有堆棧操作都是純粹的堆棧操作,這很好,一致。

我不知道我會怎麼寫「drop N」 - 描述使它聽起來像「drop 1」不等於「drop」,這看起來很奇怪。

+0

謝謝!保持指令是原始推送,並且放棄指令最初是離開的。 Pop被認爲是可以的,但是推動和流行都不能很好地描述操作(儘管它們是標準的)。你關於改變退出停止的建議是有道理的。 「print chr」是一條指令:它沒有操作數。也許學習4D正在接近我。奇怪的是,他們在指示中允許空格。 :) – 2010-05-26 04:16:39

+0

這取決於您使用的是哪種範例。 x87具有「fstp」,意思是「浮點存儲和彈出」,即存儲與彈出正交(許多x87指令具有「和彈出」變體)。添加一個編輯... – 2010-05-26 10:55:27

+0

來自Wapedia:'在Unix中halt是關閉計算機的命令。在x86彙編語言中,HLT是一種指令,它會暫停CPU,直到下一個外部中斷被觸發爲止。「當Whitespace被開發爲更高版本時,稍後可能會派上用場。將中斷系統編程爲語言將是一次很好的學習體驗。 – 2010-05-26 22:07:05

4

我認爲我建議的第一個更改是分別更改保持和下降推送和彈出。

然後,也許我會將副本重命名爲dup(我認爲這是面向堆棧的語言中此操作最常見的名稱)。

我有點困惑爲什麼你經常有短的一個詞的解釋是不同以助記符。例如助記符是Save,解釋是Store。助記符是加載,解釋是檢索。順便提一下,這些是沒有向我充分解釋的兩個助記符。保存在哪裏?從哪裏加載什麼? (編輯該問題後來被編輯,使這些含義清晰)

感謝您的有趣的職位。

+0

解釋來自於這裏找到的教程:http://compsoc.dur.ac.uk/whitespace/tutorial.php – 2010-05-25 01:19:17

1

我不確定我完全理解你的問題,所以如果我脫離基地,原諒我。

除了你的籌碼,我可能會添加一個包含了各種不同的標誌的「狀態寄存器」(如隨身攜帶,溢出,和零)是由arithmatic運營商設置。

然後,我會添加「if」表單來測試這些標誌。

我會添加位移和旋轉(左右兩個)指令,以及對位進行操作的AND/OR/XOR/NOT操作。

您很可能希望有某種形式的內存訪問,除非你想讓你的I/O指令處理內存值的好醇流」老式圖靈機的感覺。

+0

因爲我沒有編寫該語言,並打算目前只是重寫該語言版本0.3的解釋器,改變它的選項是有限的。如果一切順利的話,我可以自由地對指令集進行小的修改,並主要關注該語言的擴展版本0.4的彙編代碼。接下來,版本0.5將可能集中在指令上,並涉及對Whitespace組件進行更大範圍的修改。另外,將語言從使用三個空白字符移動到全部六個空白字符是另一個小目標。 – 2010-05-25 11:49:27