2013-05-06 33 views
0

我正在閱讀「SPARC體系結構,彙編語言編程和C.第二版」一書。我在書的地方,在那裏我不明白或者我不能夠理解有一定的命令:請解釋m4嵌套在字符串中的定義

define(loc, 0) 
define(sto, 'loc: 44 $1 define('loc', eval(loc+2))') 

的事情是,我明白了第一道防線。但我真的不明白第二行的第二個參數。書中的解釋也沒有幫助。

從書:

在這裏,我們第一次定義的符號,在上述,對具有該符號將代表位置計數器的指令的存儲器地址被組裝的值是0。每個宏定義先被改變以打印loc的當前值,然後重新定義loc爲loc以及存儲指令所需的存儲器位置。

宏的參數是字符和字符串,而不是數字值。在重新定義loc的價值時,我們使用了另一個內置宏eval。 eval接受其字符串參數來表示算術表達式。 eval評估此表達式並以數字字符串的形式返回其值。

我知道上面的解釋可能聽起來很清楚,但對我而言並非如此。我正好不明白的是部分: 'LOC:$ 44定義第(' 祿 '的eval(LOC + 2))'

我不明白:

爲什麼這是一個字符串?

爲什麼loc必須在那裏?

爲什麼,確定44 $ 1日後,有另一種定義,「定義( '祿',的eval(LOC + 2))'?

回答

2

這聽起來像的任務是使使用m4宏彙編。預期結果將是這樣的:

0000: 44 xx 
0002: yy zz 
... 

也就是說,每一行前面加上地址,然後由機器代碼的字節

loc:在一開始將打印當前的地址給你, 44大概是操作碼sto指令,而$1是參數。最後一部分重新定義loc,以便它指向下一個可用位置。由於該指令佔用兩個字節,所以loc增加2.

請注意,m4使用反引號來啓動字符串。你可能從書中錯誤地複製了它。

鑑於此樣本輸入:

define(loc, 0) 
define(sto, `loc: 44 $1 define(`loc', eval(loc+2))') 
sto(01) 
sto(AA) 

輸出是:

0: 44 01 
2: 44 AA 
+0

好吧,我想現在我懂了,但爲什麼用'LOC:'在開始打印地址?這是相同的'loc:',我之前定義了一條線?或者它是一個實習生的命令? – RnBandCrunk 2013-05-07 16:37:39

+0

是的,它是'loc'。它從0開始(因爲它是如何定義的),那麼每個宏都會將指令的大小添加到它。在這個例子中,'sto'是一個2字節的指令,所以'loc'增加了2. – Jester 2013-05-07 16:49:11

+0

啊,好吧。他們希望你在書中已經知道這一點很有趣。無論如何,謝謝你的伴侶。 – RnBandCrunk 2013-05-07 19:36:22