2013-03-30 63 views
2

我無法寫一個生成奇數交替的跡象從1開始OAM彙編語言澄清

我寫了一個程序,但它不工作,我不知道爲什麼一個序列的OAM方案。因爲這是一種罕見的語言,如果任何人都可以幫助和解釋我做錯了什麼,那將會很棒。

X,NOOP 
Y,NOOP 
LDA stdin 
loop, SET 1 
LDA Y 
STA 0 
LDA X 
DEC 
STA X #X = X - 1 
LDA X #ACC = X 
+0

這個問題很不清楚。序列應該有多久?什麼是'X'和'Y'應該用於(我猜''X'是一個循環計數器,'Y'是當前的序列元素,但是這在任何地方都沒有解釋過)?生成一個序列意味着使用循環,那麼爲什麼代碼中沒有分支指令? 「SET」後面緊跟着一個「LDA」是什麼意思? 'STA X'緊跟着'LDA X'後面是什麼意思? – Michael

回答

0

注其他讀者想知道到底這是怎麼一回事:
一個基於Web的One Address Machine編譯/彙編/仿真器稱爲OAMulator is here。您需要OAM program that generates a sequence of odd numbers with alternating signs starting with 1(不指定最大值)。
我會解釋你想要以下輸出:1, -3, 5, -7, 9, -11, 13, -15 etc...

我假設你的LDA stdin是要求最大值,但你似乎並沒有與STA存儲它。此外,在初始化變量xy後,您還沒有從「程序塊」分支(BR)開始。我還沒有真正看到你的代碼是如何將備用標誌...

我先寫OAMPL代碼被騙:

n = 1      #Init number n as 1 
PRINT "enter max number:" #Ask for max number 
READ i      #Read that number from input, storing it as i 
LOOP (/ i 2)    #Calculate number of iterations, passing that to LOOP 
    IF t      #If t (toggle) 
    t = 0     #Toggle falsy 
    PRINT (- 0 n)   #Print 0-counter 
    ELSE 
    t = 1     #Toggle truthy 
    PRINT n     #Print counter 
    ENDIF 
    n = (+ n 2)    #Increase counter by 2 
END 
EXIT      #Exit program 

,將編譯以下OAM Assembly

# Emitted by the OAMPL compiler 
1. BR 5 # branch to program block 
# Variable storage allocation block 
2. n, NOOP # variable n 
3. i, NOOP # variable i 
4. t, NOOP # variable t 
# Begin OAM program block 
# OAMPL: n = 1 
5. SET 1 
6. STA n 
# OAMPL: PRINT "enter max number:" 
7. SET "enter max number:" 
8. STA stdout 
# OAMPL: READ i 
9. LDA stdin 
10. STA i 
# OAMPL: LOOP (/ i 2) 
11. SET 2 
12. STA 14 
13. BR 15 
14. NOOP # intermediate value 
15. LDA i 
16. DIV 14 
17. BR L18 
18. NOOP # loop counter 
# OAMPL: IF t 
19. LDA t 
20. BRZ I20 
# OAMPL: t = 0 
21. SET 0 
22. STA t 
# OAMPL: PRINT (- 0 n) 
23. LDA n 
24. STA 26 
25. BR 27 
26. NOOP # intermediate value 
27. SET 0 
28. SUB 26 
29. STA stdout 
# OAMPL: ELSE 
30. BR I30 
31. I20, NOOP 
# OAMPL: t = 1 
32. SET 1 
33. STA t 
# OAMPL: PRINT n 
34. LDA n 
35. STA stdout 
# OAMPL: ENDIF 
36. I30, NOOP 
# OAMPL: n = (+ n 2) 
37. SET 2 
38. STA 40 
39. BR 41 
40. NOOP # intermediate value 
41. LDA n 
42. ADD 40 
43. STA n 
# OAMPL: END 
44. LDA 18 
45. DEC 
46. L18, STA 18 
47. BRP 19 
# OAMPL: EXIT 
48. HLT 

注意:您也可以省略註釋(# comment)和主要(行)編號。 (!編譯後)

如果我在input已場內輸入50(回答最大值問題)和命中execute,我得到以下結果output

enter max number: 
1 
-3 
5 
-7 
9 
-11 
13 
-15 
17 
-19 
21 
-23 
25 
-27 
29 

希望這有助於!