Intel汇编语言程序设计学习-第三章 汇编语言基础-上
匯編語言基礎(chǔ)
3.1 ?匯編語言的基本元素
有人說匯編難,有人說匯編簡單,我個(gè)人不做評價(jià),下面是一個(gè)簡單的實(shí)例(部分代碼):
main PROC
mov ?eax,5 ?;5送EAX寄存器
add ?eax,6 ??;EAX寄存器加6
call ?WriteInt ;顯示EAX中的值
exit
????main ENDP
這里通過調(diào)用 writeInt 庫例程使情況稍微簡化了一些,WriteInt本身也包含了相當(dāng)數(shù)量的代碼。通常來說,如果你樂于編程寫實(shí)際上并不做什么的的小程序的話,匯編語言并不難學(xué)(額...那請問作者,我學(xué)匯編干啥)。還有就是,匯編一定要注意細(xì)節(jié)。細(xì)節(jié)。
3.1.1 ?整數(shù)常量
????整數(shù)常量由符號(可選)開頭,后跟一個(gè)活多個(gè)數(shù)字(digit)以及一個(gè)表示
基數(shù)(radix)的字符后綴。
[{+|-}]數(shù)字[基數(shù)]
Radix(基數(shù)后綴)可以是一下之一(大小寫均可):
??h ??十六進(jìn)制 ??????????r 編碼實(shí)數(shù)
??q/o 八進(jìn)制 ????????????t 十進(jìn)制(可選)
???d ?十進(jìn)制 ????????????y 二進(jìn)制 (可選)
???b ?二進(jìn)制
如果整數(shù)常量后面沒有后綴,就默認(rèn)是十進(jìn)制數(shù)。下面是一些例子:
26 ??????十進(jìn)制數(shù) ???????42o ?八進(jìn)制數(shù)
26d ?????十進(jìn)制數(shù) ???????1Ah ?十六進(jìn)制數(shù)
1010011b 二進(jìn)制數(shù) ???????0A3h 十六進(jìn)制數(shù)
42q ?????八進(jìn)制數(shù)
以字母開頭的十六進(jìn)制數(shù)常量前面必須加一個(gè)0,以防止匯編器將其解釋為標(biāo)示符。
3.1.2 ?整數(shù)表達(dá)式
整數(shù)表達(dá)式是包含整數(shù)值和算術(shù)運(yùn)算的數(shù)學(xué)表達(dá)式。整數(shù)表達(dá)式計(jì)算的結(jié)果是能夠以32個(gè)數(shù)據(jù)位存儲的整數(shù)。下圖是優(yōu)先級:
?
?有兩種類型的實(shí)數(shù)常量:十進(jìn)制實(shí)數(shù)和編碼(十六進(jìn)制)實(shí)數(shù)。十進(jìn)制實(shí)數(shù)常量由符號(sign)、整數(shù)(integer)部分、小數(shù)點(diǎn)、表示小數(shù)的整數(shù)和指數(shù)(exponent)部分組成。
{sign} integer.[integert][exponent]
Sign {+,-}
Exponent E[{+,-}]integer
下面是例子:2. ??+3.0 ??-44.2E+05 ?26.E5
3.1.4 ?字符常量
字符常量是以單引號或者雙引號括起來的單個(gè)字符。匯編器將其轉(zhuǎn)換為與字符對應(yīng)的二進(jìn)制數(shù)ASCII碼,例如:
‘A’?“d”
3.1.5 ?字符串常量
字符串常量是以單引號或者雙引號括起來的一串字符:
??‘ABC’
??‘X’
??“Goodnight, Asd”
??‘4096’
按下面例子的方式使用嵌套的引號也是可以的:
????“This isn’t a test”
????‘Say “Goodnight,”?Asd’
?
3.1.6 ?保留字
MASM中有一些有特殊含義的保留字,保留字只能用于合適的上下文環(huán)境中,有如下不同的類別的保留字:
1.指令助記符,如MOV、ADD和MUL等。
2.偽指令,用于告訴MASM如何編譯程序。
3.屬性,用于為變量和操作數(shù)提供有關(guān)尺寸以及使用方式的信息,如BYTE和WORD。
4.運(yùn)算符,用在常量表達(dá)式中。
5.預(yù)定義符號,如@data,在編譯時(shí)返回整數(shù)常量值。
3.1.7 ?標(biāo)示符
標(biāo)示符是程序員選擇的名字,用來標(biāo)示變量、常量、過程或代碼標(biāo)號。創(chuàng)建標(biāo)示符時(shí)要注意一下幾點(diǎn):
1.標(biāo)示符可以包含1-247個(gè)字符。
2.標(biāo)示符大小寫不敏感(MASM默認(rèn))。
3.標(biāo)示符第一個(gè)字符必須是字母下劃線或者@、?或$,后續(xù)字符可以是數(shù)字。
4.標(biāo)示符不能與匯編器的保留字符相同。
運(yùn)行匯編器時(shí),在命令行上使用-Cp選項(xiàng)可以使所有的關(guān)鍵字和標(biāo)示符大小寫敏感。
匯編器大量使用@符號作為預(yù)定義符號的前綴,因此應(yīng)盡量避免在自己等一的標(biāo)示符中使用@符號作為數(shù)字符。盡量使用標(biāo)示符的名字局域描述性并且易于理解,下面是一些有效的標(biāo)示符:
var1 ????Conut ???&first
_main ?????MAX ????open_file
@@myfile ?xVal ?????_12345
????
3.1.8 ?偽指令
偽指令是內(nèi)嵌在程序源碼中,由匯編器識別并執(zhí)行響應(yīng)動(dòng)作的命令。與真正的指令不同,偽指令在程序運(yùn)行時(shí)并不執(zhí)行。偽指令可以用于定義變量、宏以及過程,可用于命名段以及執(zhí)行許多其他與匯編器相關(guān)的簿記任務(wù)。MASM中偽指令大小寫不敏感,如.data,.DATA和。Data是等價(jià)的。
下面的例子有助于說明偽指令在運(yùn)行時(shí)并不執(zhí)行。DWORD偽指令告知匯編器要在程序中給一個(gè)雙字節(jié)變量保留空間。MOV指令在運(yùn)行時(shí)真正執(zhí)行,把myVar的內(nèi)容復(fù)制到EAX寄存器:
??myVar ?DWORD 26 ?;DWORD 偽指令
??Mov ???eax,myVar ?;MOV指令
??每個(gè)匯編器都有一套不同的偽指令。例如,TASM(Borland)以及NASM和MASM的偽指令有一個(gè)公共的交集子集,而GNU匯編器與MASM的偽指令幾乎完全不同。
定義段:匯編偽指令的一個(gè)重要功能就是定義程序的節(jié)(section)或者段(segment)。
.DATA偽指令標(biāo)識了程序中包含變量的區(qū)域: ????.data
.CODE偽指令標(biāo)識了程序中包含質(zhì)量你開個(gè)的區(qū)域 .code
.STACK偽指令標(biāo)識了程序中包含運(yùn)行時(shí)棧的區(qū)域,并設(shè)定了運(yùn)行時(shí)棧的大小:
.stack 100h
3.1.9 ?指令
匯編語言中的指令是一條匯編語句,在程序被匯編后就變成可執(zhí)行的機(jī)器指令了。匯編器把匯編指令翻譯成機(jī)器語言字節(jié)碼,在運(yùn)行時(shí)可以加載至內(nèi)存由處理器執(zhí)行。一條匯編指令包含4個(gè)基本部分:
1.標(biāo)號(可選)
2.指令助記符(必須)
3.操作數(shù)(通常是必須的)
4.注釋(可選)
基本格式如下:
?
?
標(biāo)號:
數(shù)據(jù)標(biāo)號:數(shù)據(jù)標(biāo)號標(biāo)識了變量的地址,為在代碼中應(yīng)用蓋變量提供了方便。例如下例就定義了一個(gè)名為countde 變量:
Count DWORD 100
匯編為每個(gè)標(biāo)號分配一個(gè)數(shù)字地址。在一個(gè)標(biāo)號后定義多個(gè)數(shù)據(jù)項(xiàng)是可以的。在下面的例子中,array標(biāo)示了第一個(gè)數(shù)字(1024)的位置,其他在內(nèi)存中相鄰數(shù)字緊接其后:
Array DWORD 1024 ,2048
?????DWORD 4096,8192
?????代碼標(biāo)號:程序代碼區(qū)(存放指令的地方)中的標(biāo)號必須以冒號(:)結(jié)尾。代碼標(biāo)號通常用做跳轉(zhuǎn)和循環(huán)指令的目標(biāo)地址。例如,下面的JMP(跳轉(zhuǎn))指令將控制權(quán)轉(zhuǎn)到標(biāo)號target標(biāo)示的位置,從而構(gòu)成了一個(gè)循環(huán):
Target :
Mov ?ax,bx
...
Jmp ?target
??代碼標(biāo)號可以和指令在同一行,也可以獨(dú)立成行:
??L1: mov ?ax,bx
??L2:
??數(shù)據(jù)標(biāo)號不能以冒號結(jié)尾,標(biāo)號命名遵循3.1.7節(jié)中討論的標(biāo)示符名的規(guī)則。
?
指令助記符:
指令助記符(instruction mnemonic)是一個(gè)簡單的單詞,用于表示一條指令。在英文中,mnemonic是輔助記憶的方法的意思。與此非常相似,匯編語言指令助記符如mov,add何sub等給出了關(guān)于指令要執(zhí)行何種類型操作的提示:
mov ?將一個(gè)值移動(dòng)(賦值)到另外一個(gè)中
add ??兩個(gè)值相加
sub ??從一個(gè)值中減去另外一個(gè)值
mul ??兩個(gè)值相乘
?????Jmp ??跳轉(zhuǎn)到一個(gè)新位置
?????call ???調(diào)用一個(gè)過程
操作數(shù):
?????一條匯編語言指令可以有0~3個(gè)操作數(shù),每個(gè)操作數(shù)都可能是寄存器、內(nèi)存操作數(shù)、常量表達(dá)式或I/O端口。在第2章中討論過寄存器的名字;在3.1.2節(jié)中,討論了常量表達(dá)式。內(nèi)存操作數(shù)由變量的名字或包含變量地址的一個(gè)活多個(gè)寄存器制定,變量名字表明了變量的地址,并且指示計(jì)算機(jī)引用給定內(nèi)存地址的內(nèi)容。下表包含了幾個(gè)實(shí)例操作數(shù)。
?
下面是一些帶不同數(shù)目操作數(shù)的匯編語言指令的例子。例如,STC指令沒有操作數(shù):
?STC ?;設(shè)置進(jìn)位標(biāo)志
?INC指令有一個(gè)操作數(shù):
?Inc ??eax ??; eax 加1
?????MOV指令有兩個(gè)操作數(shù):
?????mov count,ebx ;EBX送變量count
?????在有兩個(gè)操作數(shù)的指令中,第一個(gè)操作數(shù)稱為目的(標(biāo))操作數(shù),第二個(gè)操作數(shù)稱為源操作數(shù)。通常,指令會修改目的操作數(shù)的內(nèi)容。例如,在mov指令中,源操作數(shù)中的數(shù)據(jù)被復(fù)制到目標(biāo)操作數(shù)中。
注釋:
注釋是程序作者同程序源代碼的閱讀者交流有關(guān)程序如何工作的信息的一條重要途徑,程序清單頂部通常包含如下典型的信息:
1.程序功能的描述。
2.程序創(chuàng)建者/修改者的名字。
3.程序創(chuàng)建/修改的日期。
4.程序?qū)崿F(xiàn)的技術(shù)注解。
注釋可以用下面兩種方法制定:
單行注釋: 以分號(;)字符開始
塊注釋:以COMMENT偽指令以及一個(gè)用戶定義的符號開始,編譯器忽略后面所有的文本行,直到另一個(gè)相同的用戶定義符號出現(xiàn)。例如:
COMMENT ?!
???????Dasdads
???????Asdasd asdas das asd
!
也可使用任何其他符號:
COMMENT ?$
???????Dasdads
???????Asdasd asdas das asd
$
3.1.10 ?NOP(空操作)指令
最安全的指令時(shí)NOP(no operation),一條NOP指令占用一個(gè)字節(jié)的存儲,什么也不做。有事編譯器或匯編器使用NOP指令把代碼對齊到偶數(shù)地址邊界。在下面的例子中,第一個(gè)MOV指令生成三個(gè)機(jī)器字節(jié)碼,NOP指令將第三條指令的地址對齊到雙字節(jié)(4的倍數(shù))邊界上。
00000000 mov ax,bx
00000003 nop ???????;對齊下一條指令
00000004 mov edx,ecx
總結(jié)
以上是生活随笔為你收集整理的Intel汇编语言程序设计学习-第三章 汇编语言基础-上的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel汇编语言程序设计学习-第二章
- 下一篇: Intel汇编语言程序设计学习-第三章