llvm的識別符號以兩種基本的型別存在:全域性的和區域性的。全域性識別符號(函式,全域性變數)以
'@'字元開始。區域性識別符號(暫存器名字,型別)以『%』字元開始。另外,還有三種不同的識別符號格式,各有自己的用途:
1.指定的(即自己定義的)變數被表示為乙個字串加上他們的字首。例如,%foo,@divisionbyzero,%a.really.long.identifier。實際使用的正規表示式是『[%@][a-za-z$._][a-za-z$._0-9]』。一些特殊的字元,譬如xx對16進製制字元來說是ascii碼,使用時可以這樣用「\xx」。這樣,任意字元都可以在指定值中使用,甚至引用它們自己。
2.未命名的變數(我理解為ir中的臨時變數)被表示為乙個無符號數字加上字首。譬如:%12,@2,%44。
3.常數,後面會有介紹。
llvm要求所有的變數前面都以% 或@字首,原因有二:編譯器不需要擔心與llvm的保留字產生名字衝突,未來llvm可以對保留字集進行擴充套件。另外,未命名的識別符號允許編譯器迅速提出乙個臨時變數而不需要考慮避免符號表衝突。
llvm的保留字與其他語言的保留字相似。有針對不同操作碼的關鍵字('add','bitcast','ret',etc...),有針對原始型別名的關鍵字('void','i32',etc....)等等。這些保留字不會與變數名字衝突,因為這些保留字沒有乙個是以% 或@為開始。
下面有乙個llvm**例子,把整型變數'%x'乘以8:
簡單的方式:
%result=mul i32 %x,8
另一種方式:
%result=shl i32 %x,i8 3
困難的方式:
add i32 %x, %x ;yields{i32}:%0
add i32 %0, %0 ;yields{i32}:%1
%result=add i32 %1,%1
最後一把%x乘以8的方式說明了llvm的幾個很重要的詞法特徵:
1.注釋以';'開始,直到行尾。
2.當計算結果沒有被指定為乙個變數的值時,就會有臨時變數被建立。
3.臨時變數是數字有序的。
這也規定了我們後序文件的習慣。當要舉例說明指令的時候,我們將在指令後面帶上注釋(用來定義型別和產生變數的名字)。注釋以斜體字表示。
組合語言速查手冊
彙編指令大全 一 資料傳輸指令 add 加法.adc 帶進製加法.inc 加 1.aaa 加法的ascii碼調整.daa 加法的十進位制調整.sub 減法.sbb 帶借位減法.dec 減 1.nec 求反 以 0 減之 cmp 比較.兩運算元作減法,僅修改標誌位,不回送結果 aas 減法的ascii...
組合語言識別符號及其命名規則
識別符號 identifier 是由程式設計師選擇的名稱,它用於標識變數 常數 子程式和 標籤。識別符號的形成有一些規則 通常,在高階程式語言 中,識別符號使用描述性名稱是乙個好主意。儘管組合語言指令短且隱晦,但沒有理由使得識別符號也要變得難以理解。下面是一些命名良好的名稱 linecount fi...
OllyDbg之組合語言回顧
本文從使用 從零 零開 開始 始摘錄整理 o標誌 溢位標誌 高位溢位 反映有符號數 加減運算所得結果是否溢位。當指令的結果超出了它可能訪問的最大值,如果運算結果超過當前運算位數所能表示的範圍,則稱為溢位,of的值被置為1,否則,of的值被清為0。a標誌 輔助進製標誌 p標誌 奇偶標誌 當指令結果的二...