版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、匯編語言課件第16章 直接定址表16.1 描述了單元長度的標(biāo)號16.2 在其他段中使用數(shù)據(jù)標(biāo)號16.3 直接定址表16.4 程序入口地址的直接定址表引言這一章,我們討論如何有效合理地組織數(shù)據(jù),以及相關(guān)的編程技術(shù)。16.1 描述了單元長度的標(biāo)號本章中,我們要用到這種標(biāo)號,先進(jìn)行如下介紹。前面的課程中,我們一直在代碼段中使用標(biāo)號來標(biāo)記指令、數(shù)據(jù)、段的起始地址。 16.1 描述了單元長度的標(biāo)號比如:下面的程序?qū)ode 段中的a 標(biāo)號處的8個數(shù)據(jù)累加,結(jié)果存儲到b標(biāo)號處的字中。 程序代碼16.1 描述了單元長度的標(biāo)號assume cs:codecode segment a : db 1,2,3,4,
2、5,6,7,8 b : dw 0start :mov si,offset a mov bx,offset b mov cx,8 s : mov al,cs:si mov ah,0 add cs:bx,ax inc si loop s mov ax,4c00h int 21hcode endsend start16.1 描述了單元長度的標(biāo)號程序中,code、a、b、start、s都是標(biāo)號。這些標(biāo)號僅僅表示了內(nèi)存單元的地址。但是,我們還可以使用一種標(biāo)號,這種標(biāo)號不但表示內(nèi)存單元的地址,還表示了內(nèi)存單元的長度,即表示在此標(biāo)號處的單元,是一個字節(jié)單元,還是字單元,還是雙字單元。上面的程序我們還可以寫成
3、這樣:程序16.1 描述了單元長度的標(biāo)號assume cs:codecode segment a db 1,2,3,4,5,6,7,8 b dw 0start : mov si,0 mov cx,8 s : mov al,asi mov ah,0 add b,ax inc si loop s mov ax,4c00h int 21hcode endsend start16.1 描述了單元長度的標(biāo)號我們在code 段中使用的標(biāo)號a、b后面沒有“:” ,它們是同時描述內(nèi)存地址和單元長度的標(biāo)號。標(biāo)號a,描述了地址code:0,和從這個地址開始,以后的內(nèi)存單元都是字節(jié)單元;而標(biāo)號b描述了地址code:
4、8,和從這個地址開始,以后的內(nèi)存單元都是字單元。 16.1 描述了單元長度的標(biāo)號因?yàn)檫@種標(biāo)號包含了對單元長度的描述,所以,在指令中,它可以代表一個段中的內(nèi)存單元。比如,對于程序中的b dw 0。指令:mov ax,b 相當(dāng)于:mov ax,cs:8指令:mov b,2 相當(dāng)于:mov word ptr cs:8,2指令:inc b 相當(dāng)于:inc word ptr cs:8在這些指令中,標(biāo)號b 代表了一個內(nèi)存單元,地址為code:8 ,長度為2 字節(jié)。 16.1 描述了單元長度的標(biāo)號下面的指令會引起編譯錯誤: mov al,b 因?yàn)閎代表的內(nèi)存單元是字單元,而al 是8 位寄存器。如果我們將程
5、序中的指令:add b,ax ,寫為add b,al,將出現(xiàn)同樣的編譯錯誤。 16.1 描述了單元長度的標(biāo)號對于程序中的a db 1,2,3,4,5,6,7,8 :指令:mov al,a si 相當(dāng)于:mov al,cs:0si指令:mov al,a3 相當(dāng)于:mov al,cs:03指令:mov al,abx+si+3 相當(dāng)于:mov al,cs:0bx+si+316.1 描述了單元長度的標(biāo)號可見,使用這種包含單元長度的標(biāo)號, 可以使我們以簡潔的形式訪問內(nèi)存中 的數(shù)據(jù)。以后,我們將這種標(biāo)號稱為數(shù)據(jù)標(biāo)號。它標(biāo)記了存儲數(shù)據(jù)的單元的地址和長度。它不同于僅僅表示地址的地址標(biāo)號。特別提示檢測點(diǎn)16.1
6、(page278)沒有通過此檢測點(diǎn),請不要向下進(jìn)行!16.2 在其他段中使用數(shù)據(jù)標(biāo)號一般來說,我們不在代碼段中定義數(shù)據(jù),而是將數(shù)據(jù)定義到其他段中。在其他段中,我們也可以使用數(shù)據(jù)標(biāo)號來描述存儲數(shù)據(jù)的單元的地址和長度。注意:在后面加有“:”的地址標(biāo)號,只能在代碼段中使用,不能在其他段中使用。16.2 在其他段中使用數(shù)據(jù)標(biāo)號右面的程序?qū)ata 段中 a標(biāo)號處的 8 個數(shù)據(jù)累加,結(jié)果存儲到 b標(biāo)號處的字中。assume cs:code,ds:datadata segment a db 1,2,3,4,5,6,7,8 b dw 0data endscode segmentstart: mov ax,d
7、ata mov ds,ax mov si,0 mov cx,8s: mov al,asi mov ah,0 add b,ax inc si loop s mov ax,4c00h int 21hcode endsend start16.2 在其他段中使用數(shù)據(jù)標(biāo)號注意,如果想在代碼段中,直接用數(shù)據(jù)標(biāo)號訪問數(shù)據(jù),則需要用偽指令assume 將標(biāo)號所在的段和一個段寄存器聯(lián)系起來。否則編譯器在編譯的時候,無法確定標(biāo)號的段地址在哪一個寄存器中。16.2 在其他段中使用數(shù)據(jù)標(biāo)號當(dāng)然,這種聯(lián)系是編譯器需要的,但絕對不是說,我們因?yàn)榫幾g器的工作需要,用 assume 指令將段寄存器和某個段相聯(lián)系,段寄存器中就
8、會真的存放該段的地址。我們在程序中還要使用指令對段寄存器進(jìn)行設(shè)置。 16.2 在其他段中使用數(shù)據(jù)標(biāo)號比如:在上面的程序中,我們要在代碼段code中用 data段中的數(shù)據(jù)標(biāo)號 a、b 訪問數(shù)據(jù),則必須用 assume 將一個寄存器和data 段相聯(lián)。 在程序中,我們用 ds寄存器和 data 段相聯(lián),則編譯器對相關(guān)指令的編譯如下:指令:mov al,asi 編譯為:mov al,si+0指令:add b,ax 編譯為:add 8,ax 16.2 在其他段中使用數(shù)據(jù)標(biāo)號因?yàn)檫@些實(shí)際編譯出的指令,都默認(rèn)所訪問單元的段地址在ds中,而實(shí)際要訪問的段為data,所以,若要訪問正確,在這些指令執(zhí)行前,ds
9、 中必須為 data 段的段地址。則,我們在程序中使用指令: mov ax,data mov ds,ax 設(shè)置ds指向data段。16.2 在其他段中使用數(shù)據(jù)標(biāo)號我們可以將標(biāo)號當(dāng)作數(shù)據(jù)來定義,此時,編譯器將標(biāo)號所表示的地址當(dāng)作數(shù)據(jù)的值。比如: data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dw a,b data ends 數(shù)據(jù)標(biāo)號c處存儲的兩個字型數(shù)據(jù)為標(biāo)號a、b 的偏移地址。16.2 在其他段中使用數(shù)據(jù)標(biāo)號相當(dāng)于: data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dw offset a, offset b data
10、 ends16.2 在其他段中使用數(shù)據(jù)標(biāo)號再比如: data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dd a,b data ends 數(shù)據(jù)標(biāo)號c處存儲的兩個雙字型數(shù)據(jù)為標(biāo)號a的偏移地址和段地址、標(biāo)號b 的偏移地址和段地址。16.2 在其他段中使用數(shù)據(jù)標(biāo)號相當(dāng)于: data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dw offset a, seg a, offset b, seg b data ends seg操作符,功能為取得某一標(biāo)號的段地址。特別提示檢測點(diǎn)16.2(page280)沒有通過此檢測點(diǎn),請不要向下進(jìn)行!16
11、.3 直接定址表現(xiàn)在,我們討論用查表的方法編寫相關(guān)程序的技巧。編寫子程序,以十六進(jìn)制的形式在屏幕中間顯示給定的byte 型數(shù)據(jù)。 分析16.3 直接定址表分析:一個字節(jié)需要用兩個十六進(jìn)制數(shù)碼來表示,所以,子程序需要在屏幕上顯示兩個ASCII 字符。我們當(dāng)然要用“0”、“1”、“2”、“3”、“4”、“5” 、“6” 、“7” 、“8” 、“9” 、“A”、“B”、“C”、“D”、“E”、“F”這16個字符來顯示十六進(jìn)制數(shù)碼。16.3 直接定址表我們可以將一個byte的高4位和低4 位分開,分別用它們的值得到對應(yīng)的數(shù)碼字符。 比如 2Bh ,我們可以得到高4 位的值為2,低4 位的值為11。那么
12、我們?nèi)绾斡眠@兩個數(shù)值得到對應(yīng)的數(shù)碼字符“2”和“B”呢?16.3 直接定址表最簡單的辦法就是一個一個地比較,如下:如果數(shù)值為 0,則顯示“0”;如果數(shù)值為 1,則顯示“1”; :如果數(shù)值為11,則顯示“B”; : 我們可以看出,這樣做,程序中要使用多條比較、轉(zhuǎn)移指令。 程序?qū)⒈容^長,混亂。 16.3 直接定址表顯然,我們希望能夠在數(shù)值015和字符“0”“F”之間找到一種映射關(guān)系。這樣我們用015間的任何數(shù)值,都可以通過這種映射關(guān)系直接得到“0”“F”中對應(yīng)的字符。16.3 直接定址表數(shù)值09和字符“0”“9”之間的映射關(guān)系是很明顯的,即: 數(shù)值+30h=對應(yīng)字符的ASCII值: 0+30h=“
13、0”的ASCII值 1+30h=“1”的ASCII值 2+30h=“2”的ASCII值 :16.3 直接定址表但是,1015和“A”“F”之間的映射關(guān)系是: 數(shù)值+37h=對應(yīng)字符的ASCII值: 10+37h=“A”的ASCII值 11+37h=“B”的ASCII值 12+37h=“C”的ASCII值 :16.3 直接定址表可見,我們可以利用數(shù)值和字符之間的這種原本存在的映射關(guān)系,通過高 4 位和低4 位值得到對應(yīng)的字符碼。但是由于映射關(guān)系的不同,我們在程序中必須進(jìn)行一些比較,對于大于 9 的數(shù)值,我們要用不同的計(jì)算方法。16.3 直接定址表這樣做,雖然使程序得到了簡化。但是,如果我們希望用
14、更簡捷的算法,就要考慮用同一種映射關(guān)系從數(shù)值得到字符碼。所以,我們就不能利用09和“0”“9” 之間與 1015 和 “A” “F ” 之間原有的映射關(guān)系。16.3 直接定址表因?yàn)閿?shù)值015 和字符“0”“F ”之間沒有一致的映射關(guān)系存在,所以,我們應(yīng)該在它們之間建立新的映射關(guān)系。具體的做法是,我們建立一張表,表中依次存儲字符“0”“F”,我們可以通過數(shù)值015直接查找到對應(yīng)的字符。子程序代碼16.3 直接定址表可以看出,在子程序中,我們在數(shù)值015和字符“0”“F ” 之間建立的映射關(guān)系為: 以數(shù)值N為table 表中的偏移,可以找到對應(yīng)的字符。16.3 直接定址表利用表,在兩個數(shù)據(jù)集合之間
15、建立一種映射關(guān)系,使我們可以用查表的方法根據(jù)給出的數(shù)據(jù)得到其在另一集合中的對應(yīng)數(shù)據(jù)。這樣做的目的一般來說有三個: (1)為了算法的清晰和簡潔。(2)為了加快運(yùn)算速度。(3)為了使程序易于擴(kuò)充。16.3 直接定址表在上面的子程序中,我們更多的是為了算法的清晰和簡潔,而采用了查表的方法。下面我們來看一下,為了加快運(yùn)算速度而采用查表的方法的情況。 16.3 直接定址表編寫一個子程序,計(jì)算sin(x),x0,30,60,90,120,150,180,并在屏幕中間顯示計(jì)算結(jié)果。 比如sin(30)的結(jié)果顯示為“0.5”。16.3 直接定址表我們可以利用麥克勞林公式來計(jì)算sin(x)。 x 為角度,麥克勞
16、林公式中需要代入弧度,則: y=x/180*3.141592616.3 直接定址表可以看出,計(jì)算sin(x)需要進(jìn)行多次乘法和除法。乘除是非常費(fèi)時的運(yùn)算,它們的執(zhí)行時間大約是加法、比較等指令的5倍。如何才能夠不做乘除而計(jì)算sin(x)呢?我們看一下需要計(jì)算的sin(x)的結(jié)果16.3 直接定址表需要計(jì)算的sin(x)的結(jié)果: sin(0)=0 sin(30)=0.5 sin(60)=0.866 sin(90)=1 sin(120)=0.866 sin(150)=0.5 sin(180)=016.3 直接定址表我們可以看出,其實(shí)用不著計(jì)算,可以占用一些內(nèi)存空間來換取運(yùn)算的速度。 將所要計(jì)算的si
17、n(x) 的結(jié)果都存儲到一張表中;然后用角度值來查表,找到對應(yīng)的sin(x)的值。我們用ax向子程序傳遞角度 程序代碼16.3 直接定址表在上面的子程序中,我們在角度值x和表示 sin(x) 的字符串集合table 之間建立的映射關(guān)系為: 以 角度值/30 為table 表中的偏移,可以找到對應(yīng)的字符串的首地址。16.3 直接定址表編程的時候要注意程序的容錯性,即對于錯誤的輸入要有處理能力。在上面的子程序中,我們還應(yīng)該在加上對提供的角度值是否超范圍的檢測。16.3 直接定址表如果提供的角度值不在合法的集合中,程序?qū)⒍ㄎ徊坏秸_的字符串,出現(xiàn)錯誤。對于角度值的檢測,請讀者自行完成。 16.3 直
18、接定址表上面的兩個子程序中,我們將通過給出的數(shù)據(jù)進(jìn)行計(jì)算或比較而得到結(jié)果的問題,轉(zhuǎn)化為用給出的數(shù)據(jù)作為查表的依據(jù),通過查表得到結(jié)果的問題。具體的查表方法 ,是用查表的依據(jù)數(shù)據(jù) ,直接計(jì)算出所要查找的元素在表中的位置。16.3 直接定址表像這種可以通過依據(jù)數(shù)據(jù),直接計(jì)算出所要找的元素的位置的表,我們稱其為: 直接定址表。我們可以在直接定址表中存儲子程序的地址,從而方便地實(shí)現(xiàn)不同子程序的調(diào)用。16.4 程序入口地址的直接定址表我們看下面的問題:實(shí)現(xiàn)一個子程序setscreen ,為顯示輸出提供如下功能:(1)清屏。(2)設(shè)置前景色。(3)設(shè)置背景色。(4)向上滾動一行入口參數(shù)說明16.4 程序入口地址的直接定址表入口參數(shù)說明:(1)用ah 寄存器傳遞功能號:0 表示清屏,1表示設(shè)置前景色,2 表示設(shè)置背景色,3 表示向上滾動一行;(2)對于2、3號功能,用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度個人應(yīng)急資金公對私借款合同3篇
- 二零二五年度企業(yè)公務(wù)車使用及安全保障合同3篇
- 2025年度廢化學(xué)品回收與無害化處理合同樣板3篇
- 二零二五年度養(yǎng)豬場養(yǎng)殖廢棄物無害化處理合同3篇
- 2025年度年度甲級寫字樓辦公室租賃合同樣本3篇
- 二零二五年度木工次結(jié)構(gòu)工程監(jiān)理與施工合同2篇
- 二零二五年度英法德留學(xué)一站式服務(wù)合同3篇
- 2025年度農(nóng)村土地承包經(jīng)營權(quán)入股農(nóng)業(yè)合作社合同2篇
- 二零二五年度農(nóng)村荒山荒地生態(tài)旅游項(xiàng)目投資承包合同
- 2025年度水電設(shè)備安裝合同分包售后服務(wù)合同3篇
- 保潔人員院感培訓(xùn)完整版課件
- 醫(yī)院發(fā)熱門診工作考核表
- 基于PLC的燃油鍋爐控制系統(tǒng)設(shè)計(jì)
- DB13T 2974-2019 信息系統(tǒng)集成服務(wù)資費(fèi)評估指南
- 春節(jié)期間施工現(xiàn)場安全方案
- 黑龍江省建筑工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)DB23-2017
- 自貢鴻鶴化工股份有限公司20萬噸離子膜燒堿等量搬遷升級改造項(xiàng)目
- 醫(yī)院關(guān)于成立安全生產(chǎn)領(lǐng)導(dǎo)小組的通知
- 【施工方案】空調(diào)百葉施工方案
- ppt模板熱烈歡迎領(lǐng)導(dǎo)蒞臨指導(dǎo)模板課件(15頁P(yáng)PT)
- 領(lǐng)域驅(qū)動設(shè)計(jì)1
評論
0/150
提交評論