機器語言與匯編語言
機器語言能被計算機硬件直接識別並執行,它由二進制代碼組成。
機器語言中的每一條 稱為指令,計算機能夠識別的所有指令的集合稱為指令系統。
指令是計算機能夠執行的最小 功能單位,機器語言程序就是由一條條的指令按一定順序組織起來的指令序列。
計算機的 CPU 不同,指令系統也不同。INTEL 公司的 80X86 系列 CPU,因其硬件結構設計上的包容 性,指令系統具有兼容性,用 8088/8086CPU 的指令系統設計的程序可以在 80X86 系列的 CPU 上執行。8088/8086CPU 的指令系統常被稱為 80X86 系列 CPU 的基礎指令。
一條指令一般由操作碼和操作數兩部分組成。機器語言中操作碼和操作數都是二進制代碼,因而難於記憶、 書寫和輸入,即使對於計算機的設計者也一樣難於使用。因此,對指令中的操作碼和操作數 用便於記憶的符號代替,編程語言因而有了第一次發展。
匯編語言是一種符號語言。用匯編語言編制的程序稱為匯編語言源程序,計算機不能直 接識別執行,必須翻譯成機器語言程序。翻譯的過程稱為匯編,完成匯編工作的程序稱為匯 編程序。匯編程序屬於系統程序,是匯編語言的命令處理程序。
機器語言和匯編語言統稱為低級語言。
3.2 8086CPU 尋址方式
1. 立即尋址
操作數是立即數,可以是 8 位或 16 位的二進制數,也可以是字符常數。立即數作為操作數,這個操作數的尋址方式稱為立即尋址,其實它不用尋址。
MOV AX, 2000H ;2000H 是立即數操作數
注意:立即數操 作數只能作源操作數,不能作為目的操作數。
2. 直接尋址
操作數在內存中,指令中直接給出操作數所在的內存單元的偏移地址。可以是數值形式 的地址,也可以用符號表示。
MOV BL, [2000H]
MOV BX, [3200H] //將偏移地址為3200H為首地址的連續兩個內存單元的內容傳送給BX寄存器。
匯編語言中常常用一個符號代替數值,如 BUFF 代替 3200H.BUFF 稱為符號地址。BUFF 需要在程序開始處予以定義.
MOV BX, [BUFF] ;或寫為 MOV BX, BUFF
注意:,CPU 讀寫內存時使用段基址和段內偏移地址,上面指令中的[2000H]和[3200H],都是段內偏移地址。在通常情況 下,存儲器操作數的默認在數據段,段基址在 DS。
如果操作數的段基址不是 DS 段,指令要特別說明。例如在 ES 段,指令應書寫為:
MOV BL, ES:[2000H]
這種用法稱為段超越,邏輯地址為 ESX10H+2000H。
3. 寄存器尋址
操作數在 CPU 內部的寄存器中。
ADD AX, BX ;源和目的操作數的尋址方式都是寄存器尋址。
4. 寄存器間接尋址
操作數在內存中,內存單元的偏移地址存放在寄存器中。
MOV AX, [SI] ;操作數[SI]的尋址方式為寄存器間接尋址。取出連續兩個內存單元的數據傳送給AX
注意:8086CPU 中能夠作為寄存 器間接尋址方式使用的寄存器只有 4 個:BX、BP、SI、DI。。BP 在作為間址寄存器時, 段基址默認為 SS;其它 3 個的默認段基址為 DS。但都可以段超越。例:
MOV DX, ES:[DI]
5. 寄存器相對尋址
操作數在內存中,內存單元的偏移地址一部分由間接尋址寄存器提供,一部分是指令給 定的 8 位或 16 位地址位移量,二者相加形成操作數的有效地址。
MOV AX, [BX+DATA] ;將以BX+DATA為首地址的連續兩個內存單元的 數據傳送給 AX。
//書寫方式很靈活,下面都是正確的
MOV AX, [BX]+DATA
MOV AL, 20H [SI]
MOV CX, DATA [DI]
MOV DX, DATA+ [BP]
這種尋址方式可用於存取數據表中的數據,用間址寄存器存放數據表首地址,地址位移 量指明要存取表中的哪一個數據,可以方便地存取數據表中的任何數據。
6. 基址變址尋址
操作數在內存中,基址寄存器和變址寄存器相加作為操作數的偏移地址。
MOV AX, [BX][SI] ;將 BX+SI 為首地址的連續兩個內存單元的數據送給 AX。
注意:8086CPU 中寄存器 BX 和 BP 為基址寄存器, SI 和 DI 為變址寄存器。這種尋址方式中, 一個基址寄存器加一個變址寄存器構成操作數,操作數的形式只有 4 種:
[BX][SI]
[BX][DI]
[BP][SI]
[BP][DI]
基址變址尋址方式的主要用途是尋址存儲器數組中的元素。將數組的首地址裝入基址寄 存器,而把要存取的元素的序號存入變址寄存器中,通過修改變址寄存器的內容來訪問數組 中的各個元素,它比寄存器相對尋址更加靈活
7. 基址變址相對尋址
操作數在內存中,操作數的地址由基址寄存器加上變址寄存器再加上地址位移量構成。
MOV AX, DATA[BX][SI]
MOV AX, [BP][DI] DATA
指令也可以書寫為:
MOV AX, [DATA+BX+SI]
MOV AX, [DATA+BX][SI]
MOV AX, DATA[BX+SI]
這種尋址方式主要用於二維數組操作。地址位移量作為數組首地址,基址寄存器尋址行, 變址寄存器尋址列,可以很方便實現數據陣列檢索。
8. 隱含尋址
MUL BL ;AL 乘以 BL,結果存在 AX 中。
MOVSB ;把 DS:SI 指明的內存單元的數據傳送到 ES:DI 指明的內存單元