8086彙編基礎 02 定址方式和MOV指令

2022-05-03 06:45:13 字數 3926 閱讀 3757

8086組合語言初學者教程(第二部分)

定址方式

我們可以通過下面的四個暫存器來定址bx, si, di, bp.

通過計算符號中的值,我們可以訪問到不同記憶體單元的值。具體組合

請看下表:

[bx + si]

[bx + di]

[bp + si]

[bp + di]

[si]

[di]

d16 (variable offset only)

[bx]

[bx + si] + d8

[bx + di] + d8

[bp + si] + d8

[bp + di] + d8

[si] + d8

[di] + d8

[bp] + d8

[bx] + d8

[bx + si] + d16

[bx + di] + d16

[bp + si] + d16

[bp + di] + d16

[si] + d16

[di] + d16

[bp] + d16

[bx] + d16

d8- 表示8位偏移量

d16- 表示16位偏移量

偏移量可以是乙個立即數或者是乙個變數的偏移,或者二者兼備。

這取決於編譯器如何計算單獨的立即數。

偏移量可以在[]符號裡面或者外面,這不影響編譯器生成相同的

機器碼。

偏移量是乙個有符號數,可以是正數或者負數。

一般說來,8位或者16位,對於編譯後的結果是有影響的。

例如,假定ds = 100,bx = 30,si = 70。

如下定址方式[bx + si] + 25計算實體地址為

100 * 16 + 30 + 70 + 25 = 1725

預設下,ds暫存器應用在除了bp暫存器之外的所有物理

位址計算中,暫存器是和ss暫存器一起工作的。

用過下面的表,你可以和輕鬆記住誰和誰是關聯在一起使用的。

上表中,你可以從每一列中選擇乙個或者忽略任意乙個列。比如,

可以看到,bxbp始終不會選到一起。sidi不會選到一起。

這是乙個計算位址模式[bx+5]

段暫存器(cs, ds, ss, es) 中數值被稱作 "段偏移" 。

目的暫存器(bx, si, di, bp) 中數值被稱作"偏移量"

比如,ds中數值為1234h,si中數值為7890h,可以記作

1234:7890實體地址為 1234h * 10h + 7890h = 19bd0h

在編譯過程中使用如下宣告資料型別

byte ptr- 表示位元組

word ptr- 表示字(2個位元組)

例如:byte ptr [bx] ;按位元組訪問

orword ptr [bx] ;按字訪問

emu8086 容許使用如下更簡潔的字首

b. - 等價於上面的byte ptr

w. - 等價於上面的 word ptr

有時,編譯器可以自動計算出資料型別,但是如果乙個參與運算

的數是立即數,這種方法就不可靠了。

mov

指令

操作型別如下:

mov reg, memory

mov memory, reg

mov reg, reg

mov memory, immediate

mov reg, immediate

reg:ax, bx, cx, dx, ah, al, bl, bh, ch, cl, dh, dl, di, si, bp, sp.

memory: [bx], [bx+si+7],變數, 等等

immediate: 5, -24, 3fh, 10001101b, 等等.

mov指令只支援如下段暫存器:

mov sreg, memory

mov memory, sreg

mov reg, sreg

mov sreg, reg

sreg: ds, es, ss, 注意 cs 只能作操作源

reg:ax, bx, cx, dx, ah, al, bl, bh, ch, cl, dh, dl, di, si, bp, sp.

memory: [bx], [bx+si+7], variable, 等等

mov指令不能用來設定csip暫存器的值。

下面是乙個使用mov指令的例子:

#make_com#          ;  表示,這個是乙個com程式

org 100h              ;com 程式必須的

mov ax, 0b800h      ; 將ax設定為 b800h.

mov ds, ax           ; 

將 ax 值拷貝到 ds.

mov cl, 'a'           ; 

將ascii 碼 'a'的值傳送到cl,這個值是 41h.

mov ch, 01011111b   ; 

將ch設定為二進位制的01011111b

mov bx, 15eh         ; 

將 bx 設定成 15eh.

mov [bx], cx        ; 

將 cx 放到 bx 指出的記憶體單元 b800:015e

ret                     ; 

返回作業系統

你可以將上面的程式貼入emu8086**編輯器,接下來按下

[complie and emulate] (或者按f5)

模擬視窗將顯示這個程式已經調入,點選[single step]觀察

暫存器數值變化。

你可以猜到 ";" 表示注釋,編譯器忽略在";"後面的一切

程式結束後,你可以看到如下視窗

事實上,上面程式是將字元直接寫入顯示記憶體。

通過上面的例子,你可以發現mov指令是非常有用的。

<<< 上一部分 <<<【8086彙編基礎】01--組合語言簡要介紹

>>> 下一部分 >>>【8086彙編基礎】03--變數、陣列和常量的處理

8086彙編定址方式總結

1.運算元可以存在什麼地方?運算元存在於指令 中,處理器解碼時就立即獲得了這個運算元,這就是立即 數 定址方式。彙編指令中,這個立即數 運算元 以常量形式出現。運算元存在於處理器內部暫存器中,處理器從暫存器中獲得這個運算元,這就是暫存器定址方式。彙編指令中,這個暫存器運算元以暫存器名形式出現。運算元...

8086定址方式

8086定址 8086為16位機,所能表示的位址為0 65535 64k 而8086cpu提供了20條位址線所能發出的位址資訊範圍0 fffffh 1m 所以8086採用 段位址 16 偏移位址 的方式進行定址 cs ip 0c2ch 0010h 得到的最終實體地址為 0c2ch 16 0010h ...

8086定址方式

在8086 8088中,運算元在記憶體中的有效位址是段的偏移位址。8位暫存器 ah al bh bl ch cl dh dl 16位暫存器 ax bx cx dx si di bp sp 4個段暫存器 cs ds ss es 有效位址由基址暫存器 bx或bp 的內容加上變址暫存器 si或di 的內容...