第三章 操作內(nèi)存
在前面的章節(jié)中,我們已經(jīng)了解了寄存器的基本使用方法。而正如結(jié)尾提到的那樣,僅僅使用寄存器做一點(diǎn)運(yùn)算是沒(méi)有什么太大意義的,畢竟它們不能保存太多的數(shù)據(jù),因此,對(duì)編程人員而言,他肯定迫切地希望訪問(wèn)內(nèi)存,以保存更多的數(shù)據(jù)。
我將分別介紹如何在保護(hù)模式和實(shí)模式操作內(nèi)存,然而在此之前,我們先熟悉一下這兩種模式中內(nèi)存的結(jié)構(gòu)。
3.1 實(shí)模式
事實(shí)上,在實(shí)模式中,內(nèi)存比保護(hù)模式中的結(jié)構(gòu)更令人困惑。內(nèi)存被分割成段,并且,操作內(nèi)存時(shí),需要指定段和偏移量。不過(guò),理解這些概念是非常容易的事情。請(qǐng)看下面的圖:
段-寄存器這種格局是早期硬件電路限制留下的一個(gè)傷疤。地址總線在當(dāng)時(shí)有20-bit。
然而20-bit的地址不能放到16-bit的寄存器里,這意味著有4-bit必須放到別的地方。因此,為了訪問(wèn)所有的內(nèi)存,必須使用兩個(gè)16-bit寄存器。
這一設(shè)計(jì)上的折衷方案導(dǎo)致了今天的段-偏移量格局。最初的設(shè)計(jì)中,其中一個(gè)寄存器只有4-bit有效,然而為了簡(jiǎn)化程序,兩個(gè)寄存器都是16-bit有效,并在執(zhí)行時(shí)求出加權(quán)和來(lái)標(biāo)識(shí)20-bit地址。
偏移量是16-bit的,因此,一個(gè)段是64KB。下面的圖可以幫助你理解20-bit地址是如何形成的:
段-偏移量標(biāo)識(shí)的地址通常記做 段:偏移量 的形式。
由于這樣的結(jié)構(gòu),一個(gè)內(nèi)存有多個(gè)對(duì)應(yīng)的地址。例如,0000:0010和0001:0000指的是同一內(nèi)存地址。又如,
0000:1234 = 0123:0004 = 0120:0034 = 0100:0234
0001:1234 = 0124:0004 = 0120:0044 = 0100:0244
作為負(fù)面影響之一,在段上加1相當(dāng)于在偏移量上加16,而不是一個(gè)“全新”的段。反之,在偏移量上加16也和在段上加1等價(jià)。某些時(shí)候,據(jù)此認(rèn)為段的“粒度”是16字節(jié)。
練習(xí)題
嘗試一下將下面的地址轉(zhuǎn)化為20bit的地址:
2EA8:D678 26CF:8D5F 453A:CFAD 2933:31A6 5924:DCCF
694E:175A 2B3C:D218 728F:6578 68E1:A7DC 57EC:AEEA
稍高一些的要求是,寫一個(gè)程序?qū)⒍螢锳X、偏移量為BX的地址轉(zhuǎn)換為20bit的地址,并保存于EAX中。
[上面習(xí)題的答案]
我們現(xiàn)在可以寫一個(gè)真正的程序了。
經(jīng)典程序:Hello, world
;;; 應(yīng)該得到一個(gè)29字節(jié)的.com文件
.MODEL TINY
.CODE
CR equ 13
LF equ 10
TERMINATOR equ ’$’
ORG 100h
Main PROC
mov dx,offset sMessage
mov ah,9
int 21h
mov ax,4c00h
int 21h
Main ENDP
sMessage:
在前面的章節(jié)中,我們已經(jīng)了解了寄存器的基本使用方法。而正如結(jié)尾提到的那樣,僅僅使用寄存器做一點(diǎn)運(yùn)算是沒(méi)有什么太大意義的,畢竟它們不能保存太多的數(shù)據(jù),因此,對(duì)編程人員而言,他肯定迫切地希望訪問(wèn)內(nèi)存,以保存更多的數(shù)據(jù)。
我將分別介紹如何在保護(hù)模式和實(shí)模式操作內(nèi)存,然而在此之前,我們先熟悉一下這兩種模式中內(nèi)存的結(jié)構(gòu)。
3.1 實(shí)模式
事實(shí)上,在實(shí)模式中,內(nèi)存比保護(hù)模式中的結(jié)構(gòu)更令人困惑。內(nèi)存被分割成段,并且,操作內(nèi)存時(shí),需要指定段和偏移量。不過(guò),理解這些概念是非常容易的事情。請(qǐng)看下面的圖:
段-寄存器這種格局是早期硬件電路限制留下的一個(gè)傷疤。地址總線在當(dāng)時(shí)有20-bit。
然而20-bit的地址不能放到16-bit的寄存器里,這意味著有4-bit必須放到別的地方。因此,為了訪問(wèn)所有的內(nèi)存,必須使用兩個(gè)16-bit寄存器。
這一設(shè)計(jì)上的折衷方案導(dǎo)致了今天的段-偏移量格局。最初的設(shè)計(jì)中,其中一個(gè)寄存器只有4-bit有效,然而為了簡(jiǎn)化程序,兩個(gè)寄存器都是16-bit有效,并在執(zhí)行時(shí)求出加權(quán)和來(lái)標(biāo)識(shí)20-bit地址。
偏移量是16-bit的,因此,一個(gè)段是64KB。下面的圖可以幫助你理解20-bit地址是如何形成的:
段-偏移量標(biāo)識(shí)的地址通常記做 段:偏移量 的形式。
由于這樣的結(jié)構(gòu),一個(gè)內(nèi)存有多個(gè)對(duì)應(yīng)的地址。例如,0000:0010和0001:0000指的是同一內(nèi)存地址。又如,
0000:1234 = 0123:0004 = 0120:0034 = 0100:0234
0001:1234 = 0124:0004 = 0120:0044 = 0100:0244
作為負(fù)面影響之一,在段上加1相當(dāng)于在偏移量上加16,而不是一個(gè)“全新”的段。反之,在偏移量上加16也和在段上加1等價(jià)。某些時(shí)候,據(jù)此認(rèn)為段的“粒度”是16字節(jié)。
練習(xí)題
嘗試一下將下面的地址轉(zhuǎn)化為20bit的地址:
2EA8:D678 26CF:8D5F 453A:CFAD 2933:31A6 5924:DCCF
694E:175A 2B3C:D218 728F:6578 68E1:A7DC 57EC:AEEA
稍高一些的要求是,寫一個(gè)程序?qū)⒍螢锳X、偏移量為BX的地址轉(zhuǎn)換為20bit的地址,并保存于EAX中。
[上面習(xí)題的答案]
我們現(xiàn)在可以寫一個(gè)真正的程序了。
經(jīng)典程序:Hello, world
;;; 應(yīng)該得到一個(gè)29字節(jié)的.com文件
.MODEL TINY
.CODE
CR equ 13
LF equ 10
TERMINATOR equ ’$’
ORG 100h
Main PROC
mov dx,offset sMessage
mov ah,9
int 21h
mov ax,4c00h
int 21h
Main ENDP
sMessage: