2012-10-12 63 views
2

我想在MASM中編寫一些宏來處理大數字(即數值大於可存儲在寄存器中的數值)。但是,我遇到了在彙編時從常量創建元素的問題。看起來MASM對數值常量的大小有限制。我希望能夠做的是這樣的:在MASM中使用常量初始化大數字

DECLARE_BIGINT example, 19292109310024103209481293008 

但我得到這個錯誤:

 
error A2071: initializer magnitude too large for specified size 

我假設意味着該常數大於MASM可以處理。我想我也許能雜牌圍繞我的方式通過聲明常數文本:

DECLARE_BIGINT example, <19292109310024103209481293008> 

,然後解析出的數字,但我一直無法弄清楚如何(或者即使是可能)在MASM中操作文本常量。

任何幫助將不勝感激。另外,爲了好玩,我嘗試着學習裝配和MASM,所以我寧願不只是使用一個爲我做這件事的庫(從中獲得所有的樂趣)。

+0

你正在試圖在程序集中編寫一個bignum庫嗎? – Mysticial

+0

呵呵,不錯。我知道這是不實際的,但它大大增加了我對裝配和MASM宏的理解。 –

回答

2

整數常量不適合64位,這是目前x86/64彙編程序可能支持的最大整數。

專門針對MASM,查閱官方文檔,閱讀this page。它列出了MASM支持的數據聲明類型。其中最大的整數的類型有:

QWORD = 8字節(或64位)和
TWORD = 10個字節(或80位)。

你的整數常數需要登錄(19292109310024103209481293008)≈94個比特或12個字節。這只是不適合TWORD

現在,您可以訪問作爲宏參數的字符串的各個字符。爲此,請使用FORC/IRPC

這將字符串參數轉換成字節的申報,分別代表各自的字符的ASCII碼:

FORC value, <> 
DB '0' + value 
ENDM 

這相當於

DB '0' 
DB '1' 
DB '2' 
DB '3' 
DB '4' 
DB '5' 

但僅僅是不會幫助很大。

您可能可以使用macro functions和字符串操縱宏(CATSTRINSTR,SUBSTR)做一些有用的操作。一些循環或遞歸也是必要的,以及將表示十進制整數的字符串轉換爲具有相同整數的二進制表示的字節序列。目前這似乎並不容易,我不完全確定這是可能的。

+0

這是完美的工作。謝謝。我會張貼一些代碼,但它相當長和令人討厭 –

+0

我有一種感覺,那就是那種代碼。 :) –