機器語言
每種類型的CPU都能理解它們自己的機器語言。機器語言里的指令是以字節(jié)形式在內(nèi)存中儲存的數(shù)字。每條指令有它唯一的數(shù)字碼稱為操作代碼,或簡稱為操作碼。80x86處理器的指令大小不同。操作碼通常是在指令的開始處。許多指令還包含指令使用的數(shù)據(jù)(例如:常量或地址)。
機器語言很難直接進行編程。解譯這些數(shù)字代碼指令的意思對人類來說是沉悶的。例如:執(zhí)行將EAX 和EBX 寄存器相加然后將結(jié)果送回到EAX的指令以十六進制碼編譯如下:
03 C3
這個很難理解。幸運的是,一個叫做匯編的程序可以為程序員做這個沉悶的工作。
匯編語言
一個匯編語言程序以文本格式儲存(正如一個高級語言程序)。每條匯編指令代表確切的一條機器指令。例如:上面描述的加法指令在匯編語言中將描述成:
add eax, ebx
這里指令的意思比在機器代碼表示得更清楚。代碼add是加法指令的助記符。一條匯編指令的通常格式為:
mnemonic(助記符) operand(s)(操作數(shù))
匯編程序是一個讀包含匯編指令的文本文件和將匯編語言轉(zhuǎn)換成機器代碼的程序。編譯器是為高級編程語言做同樣轉(zhuǎn)換的程序。一個匯編程序比一個編譯器要簡單。每條匯編語句接代表一個唯一的機器指令。高級語言更復雜而且可能要求更多的機器指令。
匯編和高級語言之間另一個更重要的區(qū)別是因為每種不同類型的CPU有它自己的機器代碼,所以它同樣有它自己的匯編語言。在不同的電腦構(gòu)造中移植匯編語言比高級語言要困難得多。
本教程使用了Netwide Assembler,或簡稱為NASM 。它在Internet上是免費提供的。更普遍的匯編程序是Microsoft As-sembler(MASM) 或Borland Assembler (TASM)。MASM/TASM和NASM之間有一些匯編語法區(qū)別。
指令操作數(shù)
機器代碼指令擁有個數(shù)和類型不同的操作數(shù);然而,通常每個指令有幾個固定的操作數(shù)(0到3個)。操作數(shù)可以有下面的類型:
寄存器: 這些操作數(shù)直接指向CPU寄存器里的內(nèi)容。
內(nèi)存: 這些操作數(shù)指向內(nèi)存里的數(shù)據(jù)。數(shù)據(jù)的地址可能是硬編碼到指令里的常量或可能直接使用寄存器的值計算得到。距離段的起始地址的偏移值即為此地址。
立即數(shù): 這些操作數(shù)是指令本身列出的固定的值。它們儲存在指令本身(在代碼段),而不在數(shù)據(jù)段。
暗指的操作數(shù): 這些操作數(shù)沒有明確顯示。例如:往寄存器或內(nèi)存增加1的加法指令。1是暗指的。
基本指令
最基本指令是MOV 指令。它將數(shù)據(jù)從一個地方移到另一個地方(像高級語言里面的賦值操作一樣)。它攜帶兩個操作數(shù):
mov dest (目的操作數(shù)), src(源操作數(shù))
src指定的數(shù)據(jù)拷貝到了dest。一個指令的兩個操作數(shù)不能同時是內(nèi)存操作數(shù)。這就指出了一個匯編古怪的地方。通常,對于各種各樣指令的使用都有某些強制性的規(guī)定。操作數(shù)必須是同樣的大小。AX里的值就不能儲存到BL 里去。
這兒有一個例子(分號表示注釋的開始):
更多建議: