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