NASM手冊(cè)摘要(略讀筆記) 你是否渴望回到那樣的時(shí)代,當(dāng)男人像男子漢并且能自己編寫驅(qū)動(dòng)程序? ---Linus
NASM手冊(cè):
NASM: 開源的,x86體系的,跨平臺(tái)的匯編器.
NASM和MASM的不同點(diǎn):
NASM大小寫敏感.
訪問一個(gè)內(nèi)存地址的內(nèi)容,在地址值上添加中括號(hào)
不存儲(chǔ)符號(hào)的變量類型,再指令中顯示的制定類型
不能自動(dòng)識(shí)別遠(yuǎn)調(diào)用還是近調(diào)用,必須顯式指定
優(yōu)秀設(shè)計(jì)無(wú)不化繁為簡(jiǎn),放下并自在.
NASM的匯編語(yǔ)言的語(yǔ)句
格式:lable: instruction operands ;commit
兩種指令: 預(yù)編譯指令或匯編指令
Directives和Instruction難道都翻譯程指令,真不好辦.
數(shù)據(jù)定義用到的偽指令
d*系列定義初始化的數(shù)據(jù)
res*系列定義未被初始化的數(shù)據(jù)
INCBIN可以導(dǎo)入外部文件中的數(shù)據(jù)
EQU定義常量
times重復(fù)指令.對(duì)數(shù)據(jù)定義和真實(shí)指令都可以使用.
道生一,一生二,二生三,三生萬(wàn)物.
萬(wàn)物歸三,三歸二,二歸一,一歸道.
有效地址
指定地址的時(shí)候可以使用各種表達(dá)式:段前綴,計(jì)算表達(dá)式
看來(lái)這些表達(dá)式必須由NASM計(jì)算,把結(jié)果寫到目標(biāo)代碼,而不是生成計(jì)算代碼.
常量
支持各種常用進(jìn)制的整數(shù)常量,十進(jìn)制,十六進(jìn)制,八進(jìn)制,二進(jìn)制
單引號(hào)定義字符常量,棧式存放
浮點(diǎn)數(shù)常量,也有各種不同的精度
表達(dá)式
特殊變量,$當(dāng)前地址,$$當(dāng)前段的地址
邏輯位計(jì)算,四則運(yùn)算等.
SEG操作符取段基地址
WRT = With Ref to, 得到一個(gè)符號(hào)相對(duì)于其他的段地址的偏移
關(guān)鍵字STRICT, 嚴(yán)格按照字符長(zhǎng)度操作,不做優(yōu)化
限制表達(dá)式
NASM使用兩次遍歷:第一遍計(jì)算長(zhǎng)度,第二遍產(chǎn)生代碼
兩次遍歷導(dǎo)致了限制,為了更好的描述這些限制,規(guī)定了一些指令只能使用限制表達(dá)式,
限制表達(dá)式的值,必須在第一遍遍歷中就能夠計(jì)算出來(lái).
本地標(biāo)簽(符號(hào))
以點(diǎn)開頭的標(biāo)簽為本地標(biāo)簽,和上一個(gè)非本地標(biāo)簽關(guān)聯(lián)
使用..@開頭的標(biāo)簽,在宏定義中使用,(我覺得應(yīng)該叫它,相對(duì)標(biāo)簽)。
實(shí)際上在宏中使用的是%%開頭的標(biāo)簽,被預(yù)處理器處理程..@開頭,
預(yù)處理,宏展開后保證每個(gè)這樣標(biāo)簽是全局唯一的
預(yù)處理器
代碼在宏定義層次上不過(guò)是數(shù)據(jù)。程序員的思維在不同的層次中跳躍.
當(dāng)在遞歸的多維空間游蕩時(shí),一個(gè)不成熟的程序員是會(huì)迷路的.
強(qiáng)大的宏預(yù)處理器: 條件組合,多級(jí)包含,多行或單行,上下文棧機(jī)構(gòu)
宏定義中可以帶參數(shù).
%define宏自在調(diào)用時(shí)展開,%xdefine宏在其他宏定義中也可以被展開.
宏連接符號(hào)"%+",把字符串加在一起.
%assign,使用數(shù)字計(jì)算的表達(dá)式來(lái)定義數(shù)字量.
含有函數(shù)性質(zhì)的宏,使用函數(shù)的運(yùn)算結(jié)果為宏的值,substr,strlen
使用貪婪(greedy)參數(shù)把多余參數(shù),拼接程逗號(hào)分隔的列表,可以被d*偽指令直接使用.
宏還支持默認(rèn)參數(shù)
類似shift調(diào)用的,%rotate和個(gè)數(shù)特殊遍歷%0, 似乎是給變參數(shù)個(gè)數(shù)的函數(shù)準(zhǔn)備
奇怪的條件參數(shù),是指令的一部分.,
條件組合,和C語(yǔ)言的編譯預(yù)處理相似.一大堆條件表達(dá)式的預(yù)處理指令
包含文件,而且像C語(yǔ)言一樣防止多次包含.
%rep循環(huán),多次調(diào)用多行的宏,
預(yù)處理中的上下問棧(比較獨(dú)特的一個(gè)東西.)
在多個(gè)宏定義中共享label,形成共通完成一個(gè)功能的復(fù)雜macro.
在棧中保存上下文環(huán)境,在上下文環(huán)境中定義label
能使用這東西在宏級(jí)別上實(shí)現(xiàn)各種控制流
NASM定義了許多標(biāo)準(zhǔn)宏,如果宏是函數(shù),那么這應(yīng)該就構(gòu)成的標(biāo)準(zhǔn)匯編函數(shù)庫(kù)
Assembler Directives
User Level Directive VS Primative Directive
Format-specific Directive
0x66, 0x67 prifix is use on diffecter bit instruction.
Extern 定義外部符號(hào), 這和C語(yǔ)言很像,這只有部分文件格式支持。
支持好多系統(tǒng)的各種各樣的格式,不同格式也有自己獨(dú)特的匯編指令
bin: Flat-Form Binary Output.
傳說(shuō)中的引導(dǎo)扇區(qū),就是把這種格式的文件寫到了磁盤的開頭的扇區(qū)里面.
obj: Microsoft OMF Object Files
win32: Microsoft Win32 Object Files
win64: Microsoft Win64 Object Files
微軟竟然敢宣稱他們的格式和coff兼容
coff: Common Object File Format
macho: Mach Object File Format
elf,elf32,elf64: Executable and Linkable Format Object Files
aout: lINUX 'a.out' object file,早期的linux使用
aoutb: BSD a.out Object files.
as86: Minix/Linux 'as86' Object Files
rdf : Relocatable Dynamic Object File Format
dbg: Debugging Format