一、訪問(wèn)內(nèi)存中的數(shù)據(jù)
- 內(nèi)存地址的表示方式
方式1, 段地址(ds):[偏移地址]
方式2,[偏移地址], 這種寫法等價(jià)于 ds:[偏移地址]
- 將16進(jìn)制數(shù)據(jù)1122,移動(dòng)到通用寄存器 ax 當(dāng)中
mov ax,1122h
- 將16進(jìn)制數(shù)據(jù)3344,移動(dòng)到通用寄存器 bx 當(dāng)中
mov bx,3344h
- 將通用寄存器ax的低位數(shù)值(使用al表示)添加到通用寄存器的高位(bh)當(dāng)中
add bh,al
最終bx中的數(shù)值為結(jié)果為:bx = 5544H
- 將通用寄存器bx的低位數(shù)據(jù)添加到通用寄存器ax的高位
add ah , bl
最終結(jié)果為:ax = 5522H
注意在匯編語(yǔ)言中注釋不是寫 // 而是寫 ; (分號(hào)表示注釋)
二、DS 和 [address] ,內(nèi)存地址
說(shuō)明:
我們要往 寄存器 或者 內(nèi)存 中放值都是通過(guò)mov 指令來(lái)完成。
CPU 要讀寫一個(gè)內(nèi)存單元時(shí),必須要先給出這個(gè)內(nèi)存單元的地址,在8086 中,內(nèi)存單元的地址由 段地址和偏移地址組成。
8086 中有一個(gè)DS段寄存器,通常用來(lái)存放要訪問(wèn)數(shù)據(jù)的段地址(數(shù)據(jù)段地址data segment)
mov bx, 10000h
mov ds, bx
mov al,[0] // 表示將內(nèi)存中 數(shù)據(jù)段地址 ds:[0] 對(duì)應(yīng)的一個(gè)字節(jié)的數(shù)據(jù)寫入al 通用寄存器中。
(1)上面3條指令的作用是將10000H(1000:0) 中的內(nèi)存數(shù)據(jù)復(fù)制到al寄存器中.
(2)mov al, [address] 的意思將DS:address 中的內(nèi)存數(shù)據(jù)賦值到al寄存器中。
(3)由于al 是8位寄存器,所以是將一個(gè)字節(jié)的數(shù)據(jù)賦值給al寄存器
- 8086 不支持直接將數(shù)據(jù)寫入段寄存器,mov ds, 1000H 是錯(cuò)誤的。
二、訪問(wèn)內(nèi)存中的數(shù)據(jù)
內(nèi)存地址的表示: 段地址:[偏移地址],注意段地址不能直接寫數(shù)值而必須有段地址寄存器來(lái)提供。比如:
錯(cuò)誤寫法(一):
mov ax 1122h
mov 1000h:[0h] ,ax // 內(nèi)存地址不能直接使用數(shù)值(1000h:[0h])表示,需要由段地址寄存器來(lái)提供
錯(cuò)誤寫法(二):
mov ax, 1122h
mov ds, 1000h // 是不能直接將數(shù)據(jù)寫入段寄存器的
mov ds:[0], ax
正確寫法(一):
mov ax, 1122h
mov bx, 1000h // 現(xiàn)將內(nèi)存段地址寫書數(shù)據(jù)寄存器中
mov ds,bx // 將數(shù)據(jù)寄存器中的內(nèi)存段地址寫入 數(shù)據(jù)段寄存器中
mov ds:[0], ax // 將數(shù)據(jù)段寄存器中的數(shù)據(jù) 寫入內(nèi)存地址(ds:[0]) 中
正確寫法(二)
mov ax, 1122h
mov bx, 1000h
mov ds,bx
mov [0], ax // 在8086 匯編中默認(rèn)存內(nèi)存中讀取或?qū)懭鐢?shù)據(jù)時(shí) 段地址是數(shù)據(jù)段地址(ds -- data segment ),因此 數(shù)據(jù)段地址 ds: 可以不寫 和 ds: [xxxx] 表達(dá)的是一個(gè)意思。
三、練習(xí)
寫幾條指令,將al 中的數(shù)據(jù)寫入內(nèi)存單元 10000H中
寫法一:
mov bx, 1000h
mov ds, bx
mov ds:[0], ax
寫法二:
mov bx, 1000h
mov ds, bx
mov [0], ax
指令含義解釋說(shuō)明:
(1)mov bx, 1000h,表示將數(shù)值 1000h 寫入通用寄存器 bx中,
(2) mov ds, bx,表示將通用寄存器bx中的數(shù)值表示的數(shù)據(jù)寫入數(shù)據(jù)段寄存中ds中,讓段地址寄存器指向 bx數(shù)據(jù)表示的內(nèi)存地址
(3) mov ds:[0], ax , 表示將通用寄存器ax中的數(shù)值寫入 ds:[0] 指向的內(nèi)存地址
(4)mov [0], ax 等價(jià)于 mov ds:[0], ax
四、字型數(shù)據(jù)的傳遞(2個(gè)字節(jié))

五、大小端
大端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中(高低\底高) (Big Endian)
小端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,數(shù)據(jù)的低字節(jié)保存在內(nèi)存的地地址中(高高\(yùn)底底)(Little Endian)

六、add 和 sub 指令
add 和 sub指令同mov 指令一樣,都是兩個(gè)操作對(duì)象。他們也可以有以下幾種操作模式:
add 寄存器,數(shù)據(jù) //比如:add ax,8
add 寄存器,寄存器 //比如:add ax,bx
add 寄存器, 內(nèi)存單元 // add ax ,[0]
add 內(nèi)存單元,寄存器 // add [0], ax
sub 寄存器,數(shù)據(jù) // sub ax,8
sub 寄存器,寄存器 // sub ax,bx
sub 寄存器,內(nèi)存單元 // sub AX, [0]
sub 內(nèi)存單元,寄存器 // sub [0]
七、 訪問(wèn)數(shù)據(jù)的歧義
- 歧義一
mov ax, 1000h
mov ds,ax
mov [0],66h // 這樣寫不清楚寫入內(nèi)存中的數(shù)據(jù)時(shí)一個(gè)字節(jié)(66)呢還是2個(gè)字節(jié)(0066h)
因此在匯編中為了解決這種歧義我們這樣寫:表示一個(gè)字節(jié)
mov ax, 1000h
mov ds,ax
mov byte ptr [0],66h // 這樣寫明確寫入一個(gè)字節(jié)byte 表示一個(gè)字節(jié) ptr 是固定的格式寫法
因此在匯編中為了解決這種歧義我們這樣寫:表示一個(gè)字,兩個(gè)字節(jié)
mov ax, 1000h
mov ds,ax
mov word ptr [0],66h // 這樣寫明確寫入一個(gè)字一個(gè)字,兩個(gè)字節(jié)word 表示一個(gè)字 ptr 是固定的格式寫法