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