汇编语言随笔(14)-直接定址表、检测点16和实验16
標(biāo)號(hào)
??????1,關(guān)于地址標(biāo)號(hào),a:,帶有冒號(hào)的形式,之前我們一直使用。這種標(biāo)號(hào)被用來(lái)標(biāo)記指令,數(shù)據(jù)的起始地址,表示內(nèi)存單元的起始地址。
??????后面帶有冒號(hào)的地址標(biāo)號(hào),只能在代碼段中使用,不能在其他段中使用。
??????例:將code段中a標(biāo)號(hào)處的8個(gè)字節(jié)數(shù)據(jù)累加到b標(biāo)號(hào)處的字中。
??????2,還有一種標(biāo)號(hào)我們稱(chēng)為數(shù)據(jù)標(biāo)號(hào),a,不帶冒號(hào)的形式。不但可以表示內(nèi)存單元的地址,還表示了內(nèi)存單元的長(zhǎng)度,即表示在此標(biāo)號(hào)處的單元是一個(gè)字節(jié)單元,還是字單元,還是雙字單元。
??????這種不帶冒號(hào)的標(biāo)號(hào),除了可以在代碼段中使用,更常被使用于數(shù)據(jù)段中。
??????例:同樣功能的代碼示例如下:
??????在 code 段中使用的標(biāo)號(hào):標(biāo)號(hào)a,描述了地址code:0,和從這個(gè)地址開(kāi)始,以后的內(nèi)存單元都是字節(jié)單元;而標(biāo)號(hào)b,描述了地址code:8,和從這個(gè)地址開(kāi)始,以后的內(nèi)存單元都是字單元。所以這種標(biāo)號(hào)在指令可以代表一個(gè)段中的內(nèi)存單元。單純的 b (相當(dāng)于 b[si],其中 si 為0)表示地址在 cs:[8] 處的一個(gè)字單元。類(lèi)似的,a[si] 表示在地址 cs:0[si] 處的一個(gè)字節(jié)單元中,標(biāo)號(hào)在哪個(gè)段中,那么標(biāo)號(hào)所表示的內(nèi)存單元的段地址就為相應(yīng)的段寄存器(如 cs,ds…)。括號(hào)內(nèi)的偏移量必須為 bx、si、di 和 bp中的一個(gè)。
檢測(cè)點(diǎn)16.1
??????將code段中a處的8個(gè)數(shù)據(jù)累加,結(jié)果存儲(chǔ)到b處的雙字中:
assume cs:codecode segmenta dw 1,2,3,4,5,6,7,8b dd 0start: mov si,0mov cx,8s: mov ax,a[si]add word ptr b[0],ax ;需要顯式指定運(yùn)算對(duì)象為字單元adc word ptr b[2],0add si,2loop smov ax,4c00hint 21hcode endsend start??????3,在其他段(數(shù)據(jù)段)中使用數(shù)據(jù)標(biāo)號(hào)的情況。簡(jiǎn)而言之,使用數(shù)據(jù)標(biāo)號(hào)時(shí)必須將它所在的段與某一個(gè)段寄存器相關(guān)聯(lián),并且在程序中需要用指令對(duì)該段寄存器進(jìn)行設(shè)置。
assume cs:code ds:data ;1,將ds和數(shù)據(jù)標(biāo)號(hào)所在段相關(guān)聯(lián)data segmenta db 1,2,3,4,5,6,7,8b dw 0data endscode segmentmov ax,data ;2,這兩句是將data段地址存放到ds中。mov ds,ax;下面就可以正常使用數(shù)據(jù)標(biāo)號(hào)了mov si,0mov cx,8s: mov al,a[si]mov ah,0add b,axinc siloop smov ax,4c00hint 21hcode endsend start??????使用數(shù)據(jù)標(biāo)號(hào)的特殊情況:
data segmenta db 1,2,3,4,5,6,7,8b dw 0c dw a,b ;等同于 c dw offset a,offset bd dd a,b ;等同于 d dw offset a,seg a,offset b,seg bdata ends??????在 c 標(biāo)號(hào)處存儲(chǔ)的兩個(gè)字型數(shù)據(jù)是 標(biāo)號(hào)a、b 的偏移地址。在 d 標(biāo)號(hào)處存儲(chǔ)的兩個(gè)雙字型數(shù)據(jù)為標(biāo)號(hào) a 的偏移地址、段地址和標(biāo)號(hào) b 的偏移地址、段地址。 seg 操作符為取得某一標(biāo)號(hào)的段地址。
直接定址表
??????編寫(xiě)一個(gè)子程序:計(jì)算 sin(x),其中 x ∈{0,30,60,90,120,150,180},單位為度。并將結(jié)果顯示在屏幕上。如 sin(90)=1,sin(30)=0.5。
??????思路:如果要具體計(jì)算某個(gè)角度的 sin 值時(shí),需要采用麥克勞林公式,計(jì)算非常費(fèi)時(shí)。對(duì)于這 7 個(gè)角度,我們可以直接計(jì)算出它們的 sin 值并存儲(chǔ)到一張表中,用空間來(lái)?yè)Q取時(shí)間,對(duì)于給定的一個(gè)角度,通過(guò)查表就可以得到它的 sin 值了。
??????子程序如下,其中 ax 來(lái)向子程序傳遞角度:
??????像這種可以通過(guò)依據(jù)數(shù)據(jù),直接計(jì)算出所要找的元素的位置的表,稱(chēng)其為直接定址表。
??????如果在直接定址表中存儲(chǔ)子程序的地址,這樣就可以方便地實(shí)現(xiàn)不同子程序的調(diào)用,這是直接定址表最常見(jiàn)的一種用法。下面通過(guò)實(shí)驗(yàn)16來(lái)具體說(shuō)明。
實(shí)驗(yàn)16
??????編寫(xiě)包含多個(gè)功能子程序的中斷例程:安裝一個(gè)新的 int 7ch 中斷例程,為顯示輸出提供如下功能子程序。
(1)清屏:
(2)設(shè)置前景色
(3)設(shè)置背景色
(4)向上滾動(dòng)一行
??????入口參數(shù)說(shuō)明:用 ah 寄存器傳遞功能號(hào):0表示清屏,1表示設(shè)置前景色,2表示設(shè)置背景色,3表示向上滾動(dòng)一行;??????對(duì)于1、2號(hào)功能,用al來(lái)傳送顏色值,(al)∈{0,1,2,3,4,5,6,7}。
總結(jié)
以上是生活随笔為你收集整理的汇编语言随笔(14)-直接定址表、检测点16和实验16的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汇编语言随笔(13)- 外中断(可屏蔽中
- 下一篇: 汇编语言随笔(15)- 对键盘输入进行处