freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

masm手冊-資料下載頁

2025-06-29 07:24本頁面
  

【正文】 使用一個叫做臨界表達(dá)式的概念,以禁止上述的這些例子,臨界表達(dá)式 被定義為一個表達(dá)式,它所需要的值在第一遍匯編時都是可計算的,所以, 該表達(dá)式所依賴的符號都是之前已經(jīng)定義了的,39。TIMES39。前綴的參數(shù)就是一個 臨界表達(dá)式;同樣的原因,39。RESB39。類的偽指令的參數(shù)也是臨界表達(dá)式。 臨界表達(dá)式可能會出現(xiàn)下面這樣的情況: mov ax,symbol1 symbol1 equ symbol2 symbol2: 在第一遍的時候,NASM不能確定39。symbol139。的值,因為39。symbol139。被定義成等于 39。symbols239。,而這時,NASM還沒有看到symbol2。所以在第二遍的時候,當(dāng)它遇 上39。mov ax,symbol139。,它不能為它產(chǎn)生正確的代碼,因為它還沒有知道39。symbol139。 的值。當(dāng)?shù)竭_(dá)下一行的時候,它又看到了39。EQU39。,這時它可以確定symbol1的值 了,但這時已經(jīng)太晚了。 NASM為了避免此類問題,把39。EQU39。右側(cè)的表達(dá)式也定義為臨界表達(dá)式,所以, 39。symbol139。的定義在第一遍的時候就會被拒絕。 這里還有一個關(guān)于前向引用的問題:考慮下面的代碼段: mov eax,[ebx+offset] offset equ 10 NASM在第一遍的時候,必須在不知道39。offset39。值的情況下計算指令 39。mov eax,[ebx+offset]39。的尺寸大小。它沒有辦法知道39。offset39。足夠小,足以 放在一個字節(jié)的偏移域中,所以,它以產(chǎn)生一個短形式的有效地址編碼的方 式來解決這個問題;在第一遍中,它所知道的所有關(guān)于39。offset39。的情況是:它 可能是代碼段中的一個符號,而且,它可能需要四字節(jié)的形式。所以,它強(qiáng)制 這條指令的長度為適合四字節(jié)地址域的長度。在第二遍的時候,這個決定已經(jīng) 作出了,它保持使這條指令很長,所以,這種情況下產(chǎn)生的代碼沒有足夠的小, 這個問題可以通過先定義offset的辦法得到解決,或者強(qiáng)制有效地址的尺寸大 小,象這樣寫代碼: [byte ebx+offset] 本地Labels NASM對于那些以一個句點開始的符號會作特殊處理,一個以單個句點開始的 Label會被處理成本地label, 這意味著它會跟前面一個非本地label相關(guān)聯(lián). 比如: label1 。 some code .loop 。 some more code jne .loop ret label2 。 some code .loop 。 some more code jne .loop ret 上面的代碼片斷中,每一個39。JNE39。指令跳至離它較近的前面的一行上,因為39。.loop39。 的兩個定義通過與它們前面的非本地Label相關(guān)聯(lián)而被分離開來了。 對于本地Label的處理方式是從老的Amiga匯編器DevPac中借鑒過來的;盡管 如此,NASM提供了進(jìn)一步的性能,允許從另一段代碼中調(diào)用本地labels。這 是通過在本地label的前面加上非本地label前綴實現(xiàn)的: 定義為39。39。,而第二個符號被記作39。39。所以你確實需要 的話你可寫: label3 。 some more code 。 and some more jmp 有時,這是很有用的(比如在使用宏的時候),可以定義一個label,它可以 在任何地方被引用,但它不會對常規(guī)的本地label機(jī)制產(chǎn)生干擾。這樣的 label不能是非本地label,因為非本地label會對本地labels的重復(fù)定義與 引用產(chǎn)生干擾;也不能是本地的,因為這樣定義的宏就不能知道label的全 稱了。所以NASM引進(jìn)了第三類label,它只在宏定義中有用:如果一個label 以一個前綴39。..@39。開始,它不會對本地label產(chǎn)生干擾,所以,你可以寫: label1: 。 a nonlocal label .local: 。 this is really ..@foo: 。 this is a special symbol label2: 。 another nonlocal label .local: 。 this is really jmp ..@foo 。 this will jump three lines up NASM還能定義其他的特殊符號,比如以兩個句點開始的符號,比如 39。..start39。被用來指定39。.obj39。輸出文件的執(zhí)行入口。() 第四章 NASM預(yù)處理器 NASM擁有一個強(qiáng)大的宏處理器,它支持條件匯編,多級文件包含,兩種形式的 宏(單行的與多行的),還有為更強(qiáng)大的宏能力而設(shè)置的‘context stack39。機(jī)制 預(yù)處理指令都是以一個39。%39。打頭。 預(yù)處理器把所有以反斜杠(\)結(jié)尾的連續(xù)行合并為一行,比如: %define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \ THIS_value 、 會像是單獨一行那樣正常工作。 單行的宏。 最常用的方式: `%define39。 單行的宏是以預(yù)處理指令39。%define39。定義的。定義工作同C很相似,所以你可 以這樣做: %define ctrl 0x1F amp。 %define param(a,b) ((a)+(a)*(b)) mov byte [param(2,ebx)], ctrl 39。D39。 會被擴(kuò)展為: mov byte [(2)+(2)*(ebx)], 0x1F amp。 39。D39。 當(dāng)單行的宏被擴(kuò)展開后還含有其它的宏時,展開工作會在執(zhí)行時進(jìn)行,而不是 定義時,如下面的代碼: %define a(x) 1+b(x) %define b(x) 2*x mov ax,a(8) 會如預(yù)期的那樣被展開成39。mov ax, 1+2*839。, 盡管宏39。b39。并不是在定義宏a 的時候定義的。 用39。%define39。定義的宏是大小寫敏感的:在代碼39。%define foo bar39。之后,只有 39。foo39。會被擴(kuò)展成39。bar39。:39。Foo39。或者39。FOO39。都不會。用39。%idefine39。來代替39。%define39。 (i代表39。insensitive39。),你可以一次定義所有的大小寫不同的宏。所以 39。%idefine foo bar39。會導(dǎo)致39。foo39。,39。FOO39。,39。Foo39。等都會被擴(kuò)展成39。bar39。 當(dāng)一個嵌套定義(一個宏定義中含有它本身)的宏被展開時,有一個機(jī)制可以 檢測到,并保證不會進(jìn)入一個無限循環(huán)。如果有嵌套定義的宏,預(yù)處理器只 會展開第一層,因此,如果你這樣寫: %define a(x) 1+a(x) mov ax,a(3) 宏 `a(3)39。會被擴(kuò)展成39。1+a(3)39。,不會再被進(jìn)一步擴(kuò)展。這種行為是很有用的,有 。 你甚至可以重載單行宏:如果你這樣寫: %define foo(x) 1+x %define foo(x,y) 1+x*y 預(yù)處理器能夠處理這兩種宏調(diào)用,它是通過你傳遞的參數(shù)的個數(shù)來進(jìn)行區(qū)分的, 所以39。foo(3)39。會變成39。1+339。,而39。foo(ebx,2)39。會變成39。1+ebx*239。盡管如此,但如果 你定義了: %define foo bar 那么其他的對39。foo39。的定義都不會被接受了:一個不帶參數(shù)的宏定義不允許 對它進(jìn)行帶有參數(shù)進(jìn)行重定義。 但這并不能阻止單行宏被重定義:你可以像這樣定義,并且工作得很好: %define foo bar 然后在源代碼文件的稍后位置重定義它: %define foo baz 然后,在引用宏39。foo39。的所有地方,它都會被擴(kuò)展成最新定義的值。這在用 39。%assign39。定義宏時非常有用() 你可以在命令行中使用39。d39。選項來預(yù)定義宏。 %define的增強(qiáng)版: `%xdefine39。 與在調(diào)用宏時展開宏不同,如果想要調(diào)用一個嵌入有其他宏的宏時,使用 它在被定義的值,你需要39。%define39。不能提供的另外一種機(jī)制。解決的方案 是使用39。%xdefine39。,或者它的大小寫不敏感的形式39。%xidefine39。 假設(shè)你有下列的代碼: %define isTrue 1 %define isFalse isTrue %define isTrue 0 val1: db isFalse %define isTrue 1 val2: db isFalse 在這種情況下,39。val139。等于0,而39。val239。等于1。這是因為,當(dāng)一個單行宏用 39。%define39。定義時,它只在被調(diào)用時進(jìn)行展開。而39。isFalse39。是被展開成 39。isTrue39。,所以展開的是當(dāng)前的39。isTrue39。的值。第一次宏被調(diào)用時,39。isTrue39。 是0,而第二次是1。 如果你希望39。isFalse39。被展開成在39。isFalse39。被定義時嵌入的39。isTrue39。的值, 你必須改寫上面的代碼,使用39。%xdefine39。: %xdefine isTrue 1 %xdefine isFalse isTrue %xdefine isTrue 0 val1: db isFalse %xdefine isTrue 1 val2: db isFalse 現(xiàn)在每次39。isFalse39。被調(diào)用,它都會被展開成1,而這正是嵌入的宏39。isTrue39。 在39。isFalse39。被定義時的值。 : 連接單行宏的符號: `%+39。 一個單行宏中的單獨的記號可以被連接起來,組成一個更長的記號以 待稍后處理。這在很多處理相似的事情的相似的宏中非常有用。 舉個例子,考慮下面的代碼: %define BDASTART 400h 。 Start of BIOS data area struc tBIOSDA 。 its structure .COM1addr RESW 1 .COM2addr RESW 1 。 ..and so on endstruc 現(xiàn)在,我們需要存取tBIOSDA中的元素,我們可以這樣: mov ax,BDASTART + mov bx,BDASTART + 如果在很多地方都要用到,這會變得非常的繁瑣無趣,但使用下面 的宏會大大減小打字的量: 。 Macro to access BIOS variables by their names (from tBDA): %define BDA(x) BDASTART + tBIOSDA. %+ x 現(xiàn)在,我們可以象下面這樣寫代碼: mov ax,BDA(COM1addr) mov bx,BDA(COM2addr) 使用這個特性,我們可以簡單地引用大量的宏。(另外,還可以減少打 字錯誤)。 取消宏定義: `%undef39。 單行的宏可以使用39。%undef39。命令來取消。比如,下面的代碼: %define foo bar %undef foo mov eax, foo 會被
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1