汇编语言指令详解
指令(instruction)是一種語句,它在程序匯編編譯時變得可執行。匯編器將指令翻譯為機器語言字節,并且在…
指令(instruction)是一種語句,它在程序匯編編譯時變得可執行。匯編器將指令翻譯為機器語言字節,并且在運行時由 CPU 加載和執行。
?
一條指令有四個組成部分:
- 標號(可選)
- 指令助記符(必需)
- 操作數(通常是必需的)
- 注釋(可選)
不同部分的位置安排如下所示:
[label: ] mnemonic [operands] [;comment]
現在分別了解每個部分,先從標號字段開始。
1) 標號
標號(label)是一種標識符,是指令和數據的位置標記。標號位于指令的前端,表示指令的地址。同樣,標號也位于變量的前端,表示變量的地址。標號有兩種類型:數據標號和代碼標號。
數據標號標識變量的位置,它提供了一種方便的手段在代碼中引用該變量。比如,下面定義了一個名為 count 的變量:
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 :標號命名規則要求,只要每個標號在其封閉子程序頁中是唯一的,那么就可以多次使用相同的標號。
2) 指令助記符
指令助記符(instruction mnemonic)是標記一條指令的短單詞。在英語中,助記符是幫助記憶的方法。相似地,匯編語言指令助記符,如 mov, add 和 sub,給出了指令執行操作類型的線索。下面是一些指令助記符的例子:
| MOV | 傳送(分配)數值 | MUL | 兩個數值相乘 |
| ADD | 兩個數值相加 | JMP | 跳轉到一個新位置 |
| SUB | 從一個數值中減去另一個數值 | CALL | 調用一個子程序 |
3) 操作數
操作數是指令輸入輸出的數值。匯編語言指令操作數的個數范圍是 0?3 個,每個操作數可以是寄存器、內存操作數、整數表達式和輸入輸岀端口。
生成內存操作數有不同的方法,比如,使用變量名、帶方括號的寄存器等。變量名暗示了變量地址,并指示計算機使用給定地址的內存內容。下表列出了一些操作數示例:
| 96? | 整數常量 | eax | 寄存器 |
| 2+4 | 整數表達式 | count | 內存 |
現在來考慮一些包含不同個數操作數的匯編語言指令示例。比如,STC 指令沒有操作數:
stc ;進位標志位置 1INC 指令有一個操作數:
inc eax ;EAX 加 1MOV 指令有兩個操作數:
mov count, ebx ;將 EBX 傳送給變量 count操作數有固有順序。當指令有多個操作數時,通常第一個操作數被稱為目的操作數,第二個操作數被稱為源操作數(source operand)。
一般情況下,目的操作數的內容由指令修改。比如,在 mov 指令中,數據就是從源操作數復制到目的操作數。
IMUL 指令有三個操作數,第一個是目的操作數,第二個和第三個是進行乘法的源操作數:
imul eax,ebx,5在上例中,EBX 與 5 相乘,結果存放在 EAX 寄存器中。
4) 注釋
注釋是程序編寫者與閱讀者交流程序設計信息的重要途徑。程序清單的開始部分通常包含如下信息:
- 程序目標的說明
- 程序創建者或修改者的名單
- 程序創建和修改的日期
- 程序實現技術的說明
注釋有兩種指定方法:
- 單行注釋,用分號(;)開始。匯編器將忽略在同一行上分號之后的所有字符。
- 塊注釋,用 COMMENT 偽指令和一個用戶定義的符號開始。匯編器將忽略其后所有的文本行,直到相同的用戶定義符號出現為止。
示例如下:
COMMENT ! This line is a comment. This line is also a comment. !其他符號也可以使用,只要該符號不出現在注釋行中:
COMMENT & This line is a comment. This line is also a comment. &當然,程序員應該在整個程序中提供注釋,尤其是代碼意圖不太明顯的地方。
5) NOP(空操作)指令
最安全(也是最無用)的指令是 NOP(空操作)。它在程序空間中占有一個字節,但是不做任何操作。它有時被編譯器和匯編器用于將代碼對齊到有效的地址邊界。
在下面的例子中,第一條指令 MOV 生成了 3 字節的機器代碼。NOP 指令就把第三條指令的地址對齊到雙字邊界(4 的偶數倍):
00000000 66 8B C3 mov ax,bx 00000003 90 nop ;對齊下條指令 00000004 8B D1 mov edx,ecxx86 處理器被設計為從雙字的偶數倍地址處加載代碼和數據,這使得加載速度更快。
下一篇:匯編語言整數加減法示例
強力推薦閱讀文章
年薪40+W的大數據開發【教程】,都在這兒!
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 钉钉上手体会:阿里实用主义的野望
- 下一篇: php将图片导入,php中图片文件的导入