匯編語(yǔ)言學(xué)習(xí)筆記(七)ds 寄存器

一、訪問(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ù)的傳遞(2個(gè)字節(jié)).png

五、大小端

  • 大端模式,是指數(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)

大小端.png

六、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 是固定的格式寫法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容