計(jì)算機(jī)匯編語言和指令操作

2018-10-26 09:40 更新

機(jī)器語言

每種類型的CPU都能理解它們自己的機(jī)器語言。機(jī)器語言里的指令是以字節(jié)形式在內(nèi)存中儲(chǔ)存的數(shù)字。每條指令有它唯一的數(shù)字碼稱為操作代碼,或簡稱為操作碼。80x86處理器的指令大小不同。操作碼通常是在指令的開始處。許多指令還包含指令使用的數(shù)據(jù)(例如:常量或地址)。

機(jī)器語言很難直接進(jìn)行編程。解譯這些數(shù)字代碼指令的意思對(duì)人類來說是沉悶的。例如:執(zhí)行將EAX 和EBX 寄存器相加然后將結(jié)果送回到EAX的指令以十六進(jìn)制碼編譯如下:

03 C3

這個(gè)很難理解。幸運(yùn)的是,一個(gè)叫做匯編的程序可以為程序員做這個(gè)沉悶的工作。

匯編語言

一個(gè)匯編語言程序以文本格式儲(chǔ)存(正如一個(gè)高級(jí)語言程序)。每條匯編指令代表確切的一條機(jī)器指令。例如:上面描述的加法指令在匯編語言中將描述成:

add eax, ebx

這里指令的意思比在機(jī)器代碼表示得更清楚。代碼add是加法指令的助記符。一條匯編指令的通常格式為:

mnemonic(助記符) operand(s)(操作數(shù))

匯編程序是一個(gè)讀包含匯編指令的文本文件和將匯編語言轉(zhuǎn)換成機(jī)器代碼的程序。編譯器是為高級(jí)編程語言做同樣轉(zhuǎn)換的程序。一個(gè)匯編程序比一個(gè)編譯器要簡單。每條匯編語句接代表一個(gè)唯一的機(jī)器指令。高級(jí)語言更復(fù)雜而且可能要求更多的機(jī)器指令。

匯編和高級(jí)語言之間另一個(gè)更重要的區(qū)別是因?yàn)槊糠N不同類型的CPU有它自己的機(jī)器代碼,所以它同樣有它自己的匯編語言。在不同的電腦構(gòu)造中移植匯編語言比高級(jí)語言要困難得多。

本教程使用了Netwide Assembler,或簡稱為NASM 。它在Internet上是免費(fèi)提供的。更普遍的匯編程序是Microsoft As-sembler(MASM) 或Borland Assembler (TASM)。MASM/TASM和NASM之間有一些匯編語法區(qū)別。

指令操作數(shù)

機(jī)器代碼指令擁有個(gè)數(shù)和類型不同的操作數(shù);然而,通常每個(gè)指令有幾個(gè)固定的操作數(shù)(0到3個(gè))。操作數(shù)可以有下面的類型:

寄存器: 這些操作數(shù)直接指向CPU寄存器里的內(nèi)容。

內(nèi)存: 這些操作數(shù)指向內(nèi)存里的數(shù)據(jù)。數(shù)據(jù)的地址可能是硬編碼到指令里的常量或可能直接使用寄存器的值計(jì)算得到。距離段的起始地址的偏移值即為此地址。

立即數(shù): 這些操作數(shù)是指令本身列出的固定的值。它們儲(chǔ)存在指令本身(在代碼段),而不在數(shù)據(jù)段。

暗指的操作數(shù): 這些操作數(shù)沒有明確顯示。例如:往寄存器或內(nèi)存增加1的加法指令。1是暗指的。

基本指令

最基本指令是MOV 指令。它將數(shù)據(jù)從一個(gè)地方移到另一個(gè)地方(像高級(jí)語言里面的賦值操作一樣)。它攜帶兩個(gè)操作數(shù):

mov dest (目的操作數(shù)), src(源操作數(shù))

src指定的數(shù)據(jù)拷貝到了dest。一個(gè)指令的兩個(gè)操作數(shù)不能同時(shí)是內(nèi)存操作數(shù)。這就指出了一個(gè)匯編古怪的地方。通常,對(duì)于各種各樣指令的使用都有某些強(qiáng)制性的規(guī)定。操作數(shù)必須是同樣的大小。AX里的值就不能儲(chǔ)存到BL 里去。

這兒有一個(gè)例子(分號(hào)表示注釋的開始):

基本指令

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)