彙編語言基礎
基本語言元素
整數常量
整數常量(又稱爲整形常量)由一個可選前置符號、一個或多個數字、以及一個指明其基數的可選基數字符構成 : [ { + | - } ] digite [ radix]
注意: 以字母開頭的十六進制數必須加個前置0,以防彙編器將其解釋爲標識符
整形常量表達式
整形常量表達式是一種算術表達式,它包含了整數常量和算術運算符。每個表達式的計算結果必須是個整數,並可用32位來存放
實數常量
實數常量(又稱爲浮點數常量)用於表示十進制實數和編碼(十六進制)實數。
十進制實數包含一個可選符號,其後跟隨一個整數,一個十進制小數點,一個可選的表示小數部分的整數,和一個可選的指數
編碼實數表示的是十六進制實數,用IEEE浮點數格式來表示短實數
字符常量
字符常量是指,用單引號或雙引號包含的一個字符。彙編器在內存中保存的是該字符二進制ASCII碼的數值
字符串常量
字符串常量是用單引號或雙引號包含的一個字符(含空格符)序列
嵌套引號也是被允許的
和字符常量以整數形式一樣,字符串常量在內存中的保存形式爲整數字節數值序列
保留字
保留字有特殊意義並且只能在其正確的上下文中使用。默認情況下,保留字是沒有大小寫之分的。
保留字有以下的類型:
- 指令助記符,如mov、add和mul
- 寄存器名稱
- 僞指令,告訴彙編器如何彙編程序
- 屬性,提供變量與操作數的大小與使用信息。例如Byte和Word。
- 運算符,在常量表達式中使用
- 預定義符號,比如@data,它在彙編時返回常量的整數值
標識符
標識符是由程序員選擇的名稱,它用於標識變量、常數、子程序和代碼標籤
僞指令
僞指令是嵌入源代碼中的命令,由彙編器識別和執行
僞指令不在運行時執行,但是他們可以定義變量、宏和子程序;爲內存段分配名稱執行許多其他與彙編器相關的日常任務。
默認情況下,僞指令不區分大小寫
彙編器僞指令的一個重要功能是定義程序區段,也稱爲段,程序中的段具有不同的作用
指令
指令是一種語句,它在程序彙編編譯時變得可執行。彙編器講指令翻譯爲機器語言字節,並且在運行時由COU加載和執行
一條指令有四個部分:
- 標號(可選)
- 指令助記符(必需)
- 操作數(通常是必需的)
- 註釋(可選)
標號
標號是一種標識符,是指令和數據的位置標記。
標號位於指令的前端,表示指令的地址
同樣,標號位於變量的前端,表示變量的地址
標號有兩種類型:數據標號和代碼標號
數據標號標識變量的位置,它提供了一種方便的手段在代碼中引用該變量。
彙編器爲每個標號分配一個數字地址。可以在一個標號後面定義多個數據項。
程序代碼區(指令所在區段)的標號必須使用冒號(:)結束。代碼標號用作跳轉和循環指令的目標
指令助記符
指令助記符是標記一條指令的短單詞
操作數
操作數是指令輸入輸出的數值
操作數有固有順序。當指令有多個操作數時,通常第一個操作數被稱爲目的操作數,第二個操作數被稱爲源操作數。一般情況下,目的操作數的內容由指令修改注意:
IMUL有3個操作數,第一個是目的操作數,第二個和第三個是進行乘法的源操作數
註釋
註釋是程序編寫者與閱讀者交流程序設計信息的重要途徑。
NOP(空操作)指令
最安全(也是最無用)的指令是NOP(空操作),它在程序空間中佔有一個字節,但是不做任何操作
一個簡單的例子
; //AddTwo.asm - adds two 32-bit integers.
.386 ; // .386僞指令 表示這是一個32位程序,能訪問32位寄存器和地址
.model flat, stdcall; // 程序的內存模式 flat ,子程序的調用規範(stdcall)
.stack 4096;// 堆棧保留4096字節的存儲空間
ExitProcess proto, dwExitCode:dword;// 聲明函數原型 原型:函數名,proto,逗號,輸入參數列表
.code;// 標記一個程序代碼區的起點
main proc;// 標號main 標記程序開始執行的地址
mov eax, 5
add eax, 6
invoke ExitProcess, 0
main endp;// endp 標記一個過程的結束
end main; // end標識程序的入口(main)
列表文件
Microsoft (R) Macro Assembler Version 14.16.27034.0 03/14/20 16:48:17
AddTwo.asm Page 1 - 1
; //AddTwo.asm - adds two 32-bit integers.
.386 ; // .386僞指令 表示這是一個32位程序,能訪問32位寄存器和地址
.model flat, stdcall; // 程序的內存模式 flat ,子程序的調用規範(stdcall)
.stack 4096;// 堆棧保留4096字節的存儲空間
ExitProcess proto, dwExitCode:dword;// 聲明函數原型 原型:函數名,proto,逗號,輸入參數列表
00000000 .code;// 標記一個程序代碼區的起點
00000000 main proc;// 標號main 標記程序開始執行的地址
00000000 B8 00000005 mov eax, 5
00000005 83 C0 06 add eax, 6
invoke ExitProcess, 0
00000008 6A 00 * push +000000000h
0000000A E8 00000000 E * call ExitProcess
0000000F main endp;// endp 標記一個過程的結束
end main; // end標識程序的入口(main)
Microsoft (R) Macro Assembler Version 14.16.27034.0 03/14/20 16:48:17
AddTwo.asm Symbols 2 - 1
Segments and Groups:
N a m e Size Length Align Combine Class
FLAT . . . . . . . . . . . . . . GROUP
STACK . . . . . . . . . . . . . 32 Bit 00001000 DWord Stack 'STACK'
_DATA . . . . . . . . . . . . . 32 Bit 00000000 DWord Public 'DATA'
_TEXT . . . . . . . . . . . . . 32 Bit 0000000F DWord Public 'CODE'
Procedures, parameters, and locals:
N a m e Type Value Attr
ExitProcess . . . . . . . . . . P Near 00000000 FLAT Length= 00000000 External STDCALL
main . . . . . . . . . . . . . . P Near 00000000 _TEXT Length= 0000000F Public STDCALL
Symbols:
N a m e Type Value Attr
@CodeSize . . . . . . . . . . . Number 00000000h
@DataSize . . . . . . . . . . . Number 00000000h
@Interface . . . . . . . . . . . Number 00000003h
@Model . . . . . . . . . . . . . Number 00000007h
@code . . . . . . . . . . . . . Text _TEXT
@data . . . . . . . . . . . . . Text FLAT
@fardata? . . . . . . . . . . . Text FLAT
@fardata . . . . . . . . . . . . Text FLAT
@stack . . . . . . . . . . . . . Text FLAT
0 Warnings
0 Errors