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