匯編語(yǔ)言基礎(chǔ)ASM_第1頁(yè)
匯編語(yǔ)言基礎(chǔ)ASM_第2頁(yè)
匯編語(yǔ)言基礎(chǔ)ASM_第3頁(yè)
匯編語(yǔ)言基礎(chǔ)ASM_第4頁(yè)
匯編語(yǔ)言基礎(chǔ)ASM_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、32位微機(jī)原理與接口技術(shù)實(shí)驗(yàn)教程 啟東計(jì)算機(jī)廠有限公司第一部分 匯編語(yǔ)言基礎(chǔ)實(shí)驗(yàn) 一、說(shuō)明 1下面的實(shí)驗(yàn)例程都是匯編語(yǔ)言程序設(shè)計(jì)方面的基礎(chǔ)實(shí)驗(yàn),實(shí)驗(yàn)時(shí)只需pc微機(jī)一臺(tái)。 2所有的實(shí)驗(yàn)例程均可以在dvcc32jhp集成軟件環(huán)境下運(yùn)行和調(diào)試。 3在實(shí)驗(yàn)前必須先仔細(xì)閱讀隨機(jī)配備的用戶手冊(cè),以便對(duì)整個(gè)系統(tǒng)的硬件結(jié)構(gòu)和設(shè)計(jì)思想有所了解,特別要仔細(xì)閱讀軟件安裝使用部分,以便了解dvcc32jhp集成軟件運(yùn)行環(huán)境和操作方法,為后面順利進(jìn)行編程實(shí)驗(yàn)做好充分準(zhǔn)備。二、實(shí)驗(yàn)程序目錄1顯示程序?qū)嶒?yàn) dva1.asm 2. 數(shù)據(jù)傳送實(shí)驗(yàn) dva2.asm 3. 數(shù)制轉(zhuǎn)換實(shí)驗(yàn) dva31.asm ascii 碼表示的十

2、進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)4. 數(shù)制轉(zhuǎn)換實(shí)驗(yàn) dva32.asm 十進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為bcd碼 5. 數(shù)制轉(zhuǎn)換實(shí)驗(yàn) dva33.asm 十六進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為十進(jìn)制數(shù)6. 數(shù)制轉(zhuǎn)換實(shí)驗(yàn) dva34.asm bcd碼轉(zhuǎn)換為二進(jìn)制碼7. 運(yùn)算實(shí)驗(yàn) dva41.asm 二進(jìn)制雙精度加法運(yùn)算8. 運(yùn)算實(shí)驗(yàn) dva42.asm 十進(jìn)制數(shù)的bcd 碼減法運(yùn)算9. 運(yùn)算實(shí)驗(yàn) dva43.asm 乘法運(yùn)算實(shí)驗(yàn)10. 運(yùn)算實(shí)驗(yàn) dva44.asm 用減奇數(shù)開(kāi)平方運(yùn)算實(shí)驗(yàn)11. 分支程序設(shè)計(jì)實(shí)驗(yàn) dva5.asm 12. 循環(huán)程序設(shè)計(jì)實(shí)驗(yàn) dva6.asm 13. 子程序?qū)嶒?yàn) dva71.asm 數(shù)

3、據(jù)移動(dòng)實(shí)驗(yàn)14. 子程序?qū)嶒?yàn) dva72.asm 數(shù)碼轉(zhuǎn)換及顯示實(shí)驗(yàn)15. 綜合程序設(shè)計(jì)實(shí)驗(yàn) dva81.asm 排序?qū)嶒?yàn)16. 綜合程序設(shè)計(jì)實(shí)驗(yàn) dva82.asm 用32 位寄存器、指令、擴(kuò)展尋址方式實(shí)現(xiàn)數(shù)碼轉(zhuǎn)換及顯示三、匯編語(yǔ)言程序的基本結(jié)構(gòu) 3.1 偽指令 1指令集選擇偽指令 在缺省情況下,masm 和tasm 只識(shí)別8086/8088 的指令,為了讓編譯器可以識(shí)別80386 及其以上微處理器的新增指令或功能增強(qiáng)的指令,必須在程序中使用提示處理器類型的偽指令。 在一個(gè)源程序中,可以根據(jù)需要安排多條說(shuō)明處理器類型的偽指令。對(duì)tasm 來(lái)說(shuō),該類偽指令可安排在源程序中任何位置,但對(duì)masm

4、 ,該類偽指令只能安排在段外。通常,表示處理器類型的偽指令有如下幾條: .8086 選擇8086/8088 指令集,可省略 .386 選擇80386 指令集 .386p 選擇80386 指令集,包括特權(quán)指令 .486 選擇80486 指令集 .486p 選擇80486 指令集,包括特權(quán)指令 2 段定義偽指令segment/ends 在實(shí)模式下,32 位處理器為了保持向上兼容,所以段的最大長(zhǎng)度仍然為64k,這樣的段稱為16 位段,但在保護(hù)模式下,段長(zhǎng)度可以達(dá)到4gb ,這樣的段稱為32 位段。為了兼容,保護(hù)模式下也可以使用16 位段。一般一個(gè)完整的段定義格式如下: segment 定位類型組合類

5、型類別屬性類型 ;段內(nèi)容 ends 表2-1 定位類型說(shuō)明定位類型含義byte用下一個(gè)可用字節(jié)地址word用下一個(gè)可用字地址dword用下一個(gè)可用雙字地址para用下一個(gè)可用節(jié)地址(16 字節(jié)為節(jié)邊界)page用下一個(gè)可用頁(yè)地址(256 字節(jié)為頁(yè)邊界) (1) 定位類型規(guī)定段的起始位置類型,有五種方式:byte ,word ,dword ,para ,page ,如表2-1 所示。 (2) 組合類型規(guī)定本段與其他段的關(guān)系:public ,common,stack,memory ,at , private。組合類型的使用,為的是更有效的使用存儲(chǔ)器。它通知連接器如何把不同模塊內(nèi)段名相同的段組合到一

6、起。 (3) 類別用于表示段的分類。如data,code,連接器總是使類型相同的段相鄰,由用戶指定。 (4) 屬性類型規(guī)定16 位段或32 位段。use16 表示16 位段,use32 表示 32 位段。3 數(shù)據(jù)定義偽指令 數(shù)據(jù)定義偽指令功能是為操作數(shù)分配存儲(chǔ)單元,并用變量與存儲(chǔ)單元相聯(lián)系。其一般格式為:變量助記符操作數(shù) 其中助記符可以是: db :一個(gè)操作數(shù)占用一個(gè)字節(jié)單元,定義的變量為字節(jié)變量; dw :一個(gè)操作數(shù)占用一個(gè)字單元,定義的變量為字變量; dd :一個(gè)操作數(shù)占用一個(gè)雙字單元,定義的變量為雙字變量; df :一個(gè)操作數(shù)占用一個(gè)三字單元,定義的變量為三字變量,該助記符僅用于386

7、以上的cpu,定義的變量作為指針使用,其低4 字節(jié)存放偏移地址,高2 字節(jié)存放段地址; dq :一個(gè)操作數(shù)占用一個(gè)四字單元,定義的變量為四字變量; dt :一個(gè)操作數(shù)占用十個(gè)字節(jié)單元,定義的變量為十字節(jié)變量,使用該助記符時(shí),對(duì)于十進(jìn)制操作數(shù),必須給出后綴d ,沒(méi)有后綴的默認(rèn)為壓縮bcd 碼。 4 段說(shuō)明偽指令assume 段說(shuō)明偽指令的一般格式如下: assume : , :段名 , assume :nothing可以用來(lái)取消段性質(zhì)的規(guī)定。 5 符號(hào)定義偽指令 (1) 等值偽指令equ ,其一般格式為: equ (2) 等號(hào)偽指令“=” 的格式與功能和equ 類似。不同的是,在同一個(gè)程序中,“

8、=”可以對(duì)一個(gè)符號(hào)重復(fù)定義,equ 卻不能對(duì)同一個(gè)符號(hào)重復(fù)定義。 (3) 解除定義偽指令purge的功能是解除指定符號(hào)的定義,解除符號(hào)定義后,可用equ 重新定義,其一般格式為: purge6 過(guò)程定義偽指令proc/endp 過(guò)程定義偽指令proc/endp 格式如下: proc 屬性 ret endp 過(guò)程名也是一種標(biāo)號(hào),其屬性由屬性字段表明。過(guò)程屬性可以是near(默認(rèn)類型,可省 略)或far ,調(diào)用過(guò)程指令和被調(diào)用過(guò)程在同一邏輯段,過(guò)程則可定義為near ,否則定義為far。根據(jù)過(guò)程的屬性,ret 指令自動(dòng)匯編成近過(guò)程返回指令或遠(yuǎn)過(guò)程返回指令。 另外,若調(diào)用過(guò)程指令和被調(diào)用過(guò)程不在同一

9、程序模塊中(即調(diào)用程序和被調(diào)用過(guò)程分屬兩個(gè)文件),則在調(diào)用程序中用extrn 偽指令將被調(diào)用過(guò)程說(shuō)明成外部的,而在過(guò)程程序中用 public 偽指令說(shuō)明成公用的。 7 標(biāo)號(hào)定義偽指令label 標(biāo)號(hào)定義偽指令label 是定義標(biāo)號(hào)為指定的屬性,其一般格式為: 標(biāo)號(hào) label 屬性 3.2 語(yǔ)句格式 1標(biāo)號(hào) 標(biāo)號(hào)用來(lái)代表一條指令,代表一條指令所在單元的地址,在代碼段中使用。標(biāo)號(hào)與其所代表的指令之間用冒號(hào)分開(kāi)。如果一條指令作為轉(zhuǎn)移的目標(biāo)或作為程序中的第 1 條指令語(yǔ)句,前面應(yīng)該加標(biāo)號(hào),否則沒(méi)有必要加標(biāo)號(hào)。其格式為:“標(biāo)號(hào):指令語(yǔ)句”。標(biāo)號(hào)有三個(gè)屬性:段屬性、偏移屬性和類型屬性。 段屬性:標(biāo)號(hào)所代

10、表指令單元的段地址,即代碼段的段地址。 偏移屬性:標(biāo)號(hào)所代表指令單元的段內(nèi)偏移地址。 類型屬性:用來(lái)指明標(biāo)號(hào)是段內(nèi)引用(類型為near ,轉(zhuǎn)移源和轉(zhuǎn)移目標(biāo)在同一個(gè)代碼段中),還是段間引用(類型為far ,轉(zhuǎn)移源和轉(zhuǎn)移目標(biāo)在不同的代碼段中)。 2 變量 變量用來(lái)代表數(shù)據(jù)所在單元的地址,在數(shù)據(jù)段、附加段、堆棧段中使用。變量與其所代表的數(shù)據(jù)之間用空格分開(kāi)。變量也有三個(gè)屬性:段屬性、偏移屬性和類型屬性。 段屬性:變量所代表數(shù)據(jù)單元的段地址(ds 值、es 值或ss 值)。 偏移屬性:變量所代表數(shù)據(jù)單元的段內(nèi)偏移地址。 類型屬性:用來(lái)指明變量所代表數(shù)據(jù)單元的字節(jié)數(shù),db、dw、dd、df、dq、dt所定

11、義變量的類型值分別為1、2、4、6、8、10。 在同一個(gè)程序中,一個(gè)標(biāo)號(hào)或變量只能定義一次,不能重復(fù)定義。 3 操作碼操作碼用來(lái)指明操作的性質(zhì)或功能。指令中的助記符都是操作碼。操作碼與操作數(shù)之間用空格分開(kāi)。 4 操作數(shù) 指令中的操作數(shù)用來(lái)指定參與操作的數(shù)據(jù)。對(duì)于一般指令,可以有一或兩個(gè)操作數(shù),也可以沒(méi)有操作數(shù);對(duì)于偽指令和宏指令,可以有多個(gè)操作數(shù)。操作數(shù)多于一個(gè)時(shí),操作數(shù)之間用逗號(hào)分開(kāi)。操作數(shù)可以是常數(shù)或表達(dá)式。 5 注釋項(xiàng) 注釋是語(yǔ)句的說(shuō)明部分,用來(lái)說(shuō)明一條指令或一段程序的功能,由分號(hào)“;”開(kāi)始。匯編源程序時(shí),注釋部分不產(chǎn)生機(jī)器代碼。 6 續(xù)行符 一條語(yǔ)句可以寫(xiě)在多行上,續(xù)行符為。 7 重復(fù)

12、操作符dup 重復(fù)定義多個(gè)相同單元的數(shù)據(jù)時(shí)采用。如 a db 3 dup (?)相當(dāng)于a db ?,?,? 8 保留符號(hào)? 根據(jù)數(shù)據(jù)定義偽指令的類型,保留相應(yīng)單位的內(nèi)存空間,不賦初值。 9 當(dāng)前地址指針$ 在匯編程序?qū)R編語(yǔ)言源程序進(jìn)行匯編的過(guò)程中,當(dāng)前正在匯編的指令的地址用當(dāng)前地址指針$指示。對(duì)分配內(nèi)存空間的數(shù)據(jù)定義偽指令,當(dāng)前數(shù)據(jù)分配的位置用$指針指示。即當(dāng)前地址指針總是指向待分配的內(nèi)存單元的地址。用戶可以直接引用當(dāng)前地址指針的值。如: a db “hello” len equ $-a 3.3 dos 系統(tǒng)功能調(diào)用 dos 系統(tǒng)功能調(diào)用是匯編程序通過(guò)int 21h 軟件中斷來(lái)調(diào)用dos 內(nèi)

13、部的子程序而進(jìn)行某種操作的一個(gè)方法,dos 系統(tǒng)功能調(diào)用在實(shí)模式下的編程中應(yīng)用很廣泛,大致有上百種功能,這些功能的具體含義和參數(shù)設(shè)置可查閱手冊(cè),而功能調(diào)用的基本格式如下: mov ah ,功能號(hào) ;準(zhǔn)備入口參數(shù) int 21h 下面列出匯編語(yǔ)言程序設(shè)計(jì)中經(jīng)常使用的兩種功能調(diào)用及其說(shuō)明。109h 號(hào)功能調(diào)用 將數(shù)據(jù)段(ds)中以字符結(jié)尾的一個(gè)字符串輸出到屏幕上。 入口參數(shù):dx 寄存器存放該字符串的首地址(有效地址部分) 出口參數(shù):無(wú) 注意: 9 號(hào)系統(tǒng)功能調(diào)用破壞al 寄存器內(nèi)容,應(yīng)注意保存。 格式: lea dx ,字符串變量名 mov ah ,9 int 21h 2 程序正常返回dos 系

14、統(tǒng)的方法 (1) 調(diào)用 4ch 號(hào)系統(tǒng)功能 功能:返回系統(tǒng) 入口參數(shù): al=終止代碼或無(wú) 格式: mov ah ,4ch int 21h 或: mov ax ,4c00h int 21h (2) 使用語(yǔ)句 int 20h 功能:返回系統(tǒng) 入口參數(shù):cs 指向程序段前綴 實(shí)驗(yàn)一 顯示程序?qū)嶒?yàn)一、實(shí)驗(yàn)?zāi)康?(1) 掌握在pc 機(jī)上以十六進(jìn)制形式顯示數(shù)據(jù)的方法。 (2) 掌握部分dos 功能調(diào)用使用方法。 (3) 熟悉dvcc32jhp集成軟件調(diào)試環(huán)境。 二、實(shí)驗(yàn)內(nèi)容及說(shuō)明 一般來(lái)說(shuō),有很多程序需要顯示輸出提示運(yùn)行的狀況和結(jié)果,有的還需要將數(shù)據(jù)區(qū)中的內(nèi)容顯示在屏幕上。本實(shí)驗(yàn)要求將指定數(shù)據(jù)區(qū)的字符以

15、十六進(jìn)制數(shù)形式顯示在屏幕上,并通過(guò)dos功能調(diào)用完成一些提示信息的顯示。實(shí)驗(yàn)中可使用dos 功能調(diào)用(int 21h)。本實(shí)驗(yàn)顯示第一行“show a as hex:”,第二行“”,是字符“a”的十進(jìn)制數(shù)(61)。 (1) 顯示單個(gè)字符輸出 入口:ah=02h 調(diào)用參數(shù):dl=輸出字符 (2) 顯示字符串 入口:ah=09h 調(diào)用參數(shù):ds:dx= 串地址,$為結(jié)束字符 (3) 鍵盤(pán)輸入并回顯 入口:ah=01h 返回參數(shù):al=輸出字符 (4) 返回dos 系統(tǒng) 入口:ah=4ch 調(diào)用參數(shù):al=返回碼三、實(shí)驗(yàn)步驟 (1) 運(yùn)行dvcc32jhp軟件,選擇編輯edit 菜單,根據(jù)實(shí)驗(yàn)內(nèi)容的

16、描述編寫(xiě)實(shí)驗(yàn)程序或選擇open菜單打開(kāi)程序。(2) 使用“asm編譯”菜單中“編譯+連接+運(yùn)行”選項(xiàng),對(duì)實(shí)驗(yàn)程序進(jìn)行匯編、連接。匯編、連接無(wú)誤的話,就直接運(yùn)行程序。觀察運(yùn)行結(jié)果。 (3) 或使用動(dòng)態(tài)調(diào)試,進(jìn)入調(diào)試環(huán)境,觀察調(diào)試過(guò)程中,指令執(zhí)行情況,包括各寄存器及數(shù)據(jù)區(qū)內(nèi)容的變化等。 (4) 更改數(shù)據(jù)區(qū)中的數(shù)據(jù),考察程序的正確性。 四、參考流程圖 ynny取字節(jié)的高4位數(shù)據(jù)是否=a? esc? 開(kāi)始是a-f,加7h轉(zhuǎn)換成ascii碼送屏幕顯示取字節(jié)的低4位數(shù)據(jù)是否=a? esc?是a-f,加7h轉(zhuǎn)換成ascii碼送屏幕顯示 圖1-1 顯示程序?qū)嶒?yàn)流程圖 五、參考程序參考實(shí)驗(yàn)程序文件名dva1.a

17、sm(在文件夾“asm_匯編例程”中)實(shí)驗(yàn)程序清單如下: stack1 segment stack dw 256 dup(?)stack1 endsdatasegmentuse16mes db show a as hex:,0ah,0dh,$sd db adataendscodesegmentuse16assumecs:code,ds:datastart:mov ax,datamovds,ax mov dx,offset mesmovah,09hint 21hmovsi,offset sdmoval,ds:siandal,0f0hshral,4cmpal,0ahjbc2addal,07hc2:

18、addal,30hmovdl,almovah,02hint21hmoval,ds:siandal,0fhcmpal,0ahjbc3add al,07hc3:addal,30hmovdl,almovah,02hint21hstart0: mov ah,06hmov dl,0ffhint 21hje start0movax,4c00hint21hcodeendsendstart實(shí)驗(yàn)二 數(shù)據(jù)傳送實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?(1) 熟悉dvcc32jhp 調(diào)試運(yùn)行環(huán)境。 (2) 掌握與數(shù)據(jù)有關(guān)的不同尋址方式。 二、實(shí)驗(yàn)內(nèi)容 本實(shí)驗(yàn)要求將數(shù)據(jù)段中的一個(gè)字符串傳送到附加段中,并輸出附加段中的目標(biāo)字符串到屏幕上顯示。

19、 三、實(shí)驗(yàn)步驟 (1) 運(yùn)行dvcc32jhp軟件,選擇編輯edit 菜單編寫(xiě)實(shí)驗(yàn)程序或選擇open菜單打開(kāi)程序。 (2) 使用“asm編譯”菜單中“編譯+連接+運(yùn)行”選項(xiàng),對(duì)實(shí)驗(yàn)程序進(jìn)行匯編、連接。匯編、連接無(wú)誤的話,就直接運(yùn)行程序。觀察運(yùn)行結(jié)果。(3) 或使用動(dòng)態(tài)調(diào)試,進(jìn)入調(diào)試環(huán)境,觀察調(diào)試過(guò)程中,指令執(zhí)行情況,包括各寄存器及數(shù)據(jù)區(qū)內(nèi)容的變化等。 (4) 更改數(shù)據(jù)區(qū)中的數(shù)據(jù),考察程序的正確性。 四、參考程序參考實(shí)驗(yàn)程序文件名dva2.asm(在文件夾“asm_匯編例程”中)實(shí)驗(yàn)程序清單如下: ddata segment ;定義源數(shù)據(jù)段 msr db hello,world!$ len eq

20、u $- msr ddata ends exda segment ;定義附加數(shù)據(jù)段 msd db len dup(?) exda ends mystack segment stack ;定義堆棧段 dw 20 dup(?) mystack ends code segment ;定義代碼段 assume cs:code,ds:ddata,es:exda start: mov ax,ddata mov ds,ax ;裝載數(shù)據(jù)段寄存器 mov ax,exda mov es,ax ;裝載附加數(shù)據(jù)段寄存器 mov si,offset msr ;設(shè)置si mov di,offset msd ;設(shè)置di m

21、ov cx,len next: mov al,si ;開(kāi)始傳輸數(shù)據(jù) mov es:di,al inc si inc di dec cx jnz next push es pop ds ;將附加段寄存器指向的段值賦給數(shù)據(jù)段寄存器 mov dx,offset msd mov ah,9 int 21h start0: mov ah,06h ;判斷是否有鍵按下 mov dl,0ffh int 21h je start0 ;若沒(méi)有轉(zhuǎn)start0 mov ax,4c00h ;有鍵返回dos int 21hcode ends end start 如果將程序主體部分的寄存器間接尋址方式改為相對(duì)尋址方式,則如下

22、所示: mov bx,0 mov cx,len next: mov al,msrbx mov es:msdbx,al inc bx loop next實(shí)驗(yàn)三 數(shù)碼轉(zhuǎn)換程序?qū)嶒?yàn)一、實(shí)驗(yàn)?zāi)康?掌握不同進(jìn)制數(shù)及編碼相互轉(zhuǎn)換的程序設(shè)計(jì)方法。 二、實(shí)驗(yàn)內(nèi)容及說(shuō)明 計(jì)算機(jī)輸入設(shè)備輸入的信息一般是由ascii 碼或bcd 碼表示的數(shù)據(jù)或字符,cpu 一般均 用二進(jìn)制數(shù)進(jìn)行計(jì)算或其他信息處理,處理結(jié)果的輸出又必須依照外設(shè)的要求變?yōu)閍scii 碼、bcd 碼或七段顯示碼等。因此,在應(yīng)用軟件中,各類數(shù)制的轉(zhuǎn)換和代碼的轉(zhuǎn)換是必不可少的。計(jì)算機(jī)與外設(shè)間的數(shù)碼轉(zhuǎn)換關(guān)系如圖3-1 所示。數(shù)碼轉(zhuǎn)換對(duì)應(yīng)關(guān)系表3-1。 表3-

23、1 數(shù)碼轉(zhuǎn)換對(duì)應(yīng)關(guān)系表十六進(jìn)制數(shù)bcd 碼二進(jìn)制機(jī)器碼asc碼七段碼共陽(yáng)共陰00000000030h40h3fh10001000131h79h06h20010001032h24h5bh30011001133h30h4fh40100010034h19h66h50101010135h12h6dh60110011036h12h7dh70111011137h78h07h81000100038h00h7fh91001100139h18h67ha101041h08h77hb101142h03h7chc110043h46h39hd110144h21h5ehe111045h06h79hf111146h0eh7

24、1h 1將ascii 碼表示的十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù) 十進(jìn)制數(shù)可以表示為:dn 10n +dn-1 10n-1+d0 100 =di10i 中di代表十進(jìn)制數(shù) 1、2、3 . 9、0。 上式可以轉(zhuǎn)換為:di10i =(dn 10+dn-1 )10)+ dn-2)10+di ) 10+d0 由上式可歸納十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制的方法:從十進(jìn)制數(shù)的最高位d 開(kāi)始作乘10 加次位的操作,依次類推,則可求出二進(jìn)制數(shù)結(jié)果。二進(jìn)制位碼段碼二進(jìn)制bcd碼ascii碼ascii碼鍵盤(pán)、光機(jī)電撥碼開(kāi)關(guān)主 機(jī)數(shù)據(jù)開(kāi)關(guān)crt顯示、打印機(jī)多段顯示位顯示圖3-1 計(jì)算機(jī)與外設(shè)間的數(shù)碼轉(zhuǎn)換關(guān)系 本實(shí)驗(yàn)要求將緩沖區(qū)中的一個(gè)五位

25、十進(jìn)制數(shù)00012 的ascii 碼轉(zhuǎn)換成二進(jìn)制數(shù),并將轉(zhuǎn)換結(jié)果按位顯示在屏幕上。轉(zhuǎn)換過(guò)程的參考流程如圖3-2 所示。 yn開(kāi)始取第一位ascii碼確定轉(zhuǎn)換數(shù)的位數(shù)n減30hcx = n-1乘以10加下一位ascii碼減30h轉(zhuǎn)換完否?送屏幕顯示 圖3-2 十進(jìn)制ascii 轉(zhuǎn)換為二進(jìn)制數(shù)參考流程2 將十進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為bcd碼 本實(shí)驗(yàn)要求將鍵盤(pán)輸入的一個(gè)五位十進(jìn)制數(shù) 54321的asc 碼存放在數(shù)據(jù)區(qū)中,轉(zhuǎn)換為bcd碼后 ,將轉(zhuǎn)換結(jié)果按位分別顯示于屏幕上。若輸入的不是十進(jìn)制數(shù)的asc碼,則輸 出“ff”。提示:一字節(jié)asc碼取其低四位即變?yōu)閎cd 碼。轉(zhuǎn)換部分的實(shí)驗(yàn)流程參見(jiàn)3-3

26、。ynyn開(kāi)始bl = 0ffh確定轉(zhuǎn)換數(shù)的位數(shù)n取數(shù)cx = n保存bl到相應(yīng)單元bl = ascii-30h轉(zhuǎn)換完否?送屏幕顯示是否0-9的ascii嗎?圖3-3 十進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為bcd碼參考流程3 將十六進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為十進(jìn)制數(shù) 十六位二進(jìn)制數(shù)值域0-65535,最大可轉(zhuǎn)換為五位十進(jìn)制數(shù)。五位十進(jìn)制數(shù)可表示為: nd = d4104 + d3103 + d2102 + d1101 +d0 因此,將十六位的二進(jìn)制數(shù)轉(zhuǎn)換為5位ascii 碼表示的十進(jìn)制數(shù),就是求d1 - d4 ,并將它們轉(zhuǎn)化為ascii碼供顯示。本實(shí)驗(yàn)要求將緩沖區(qū)中存放的000ch的ascii碼轉(zhuǎn)換

27、為十進(jìn)制數(shù),并將轉(zhuǎn)換結(jié)果顯示在屏幕上。其實(shí)驗(yàn)流程圖見(jiàn)圖3-4。yn開(kāi)始si = si-1取出轉(zhuǎn)換數(shù)ax = 轉(zhuǎn)換數(shù)si指向存儲(chǔ)單元的尾地址ax除以10,ax = 商,dx = 余數(shù)將余數(shù)轉(zhuǎn)化為ascii碼并保存商為0?送屏幕顯示將余下位填充為0圖3-4 將十六進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為十進(jìn)制數(shù)參考流程4bcd碼轉(zhuǎn)換為二進(jìn)制碼本實(shí)驗(yàn)要求將四個(gè)二進(jìn)制的bcd碼存放在某一單元中,轉(zhuǎn)換出的二進(jìn)制數(shù)碼存入其后的內(nèi)存單元中,轉(zhuǎn)換結(jié)束送屏幕顯示。參考流程圖見(jiàn)圖3-5。yn開(kāi)始乘以10cx = 轉(zhuǎn)換的個(gè)數(shù)取保存到相應(yīng)單元取數(shù)的個(gè)位取數(shù)的十位,與個(gè)位相加將指針指向下一個(gè)數(shù)商為0?送屏幕顯示 圖3-5 bcd

28、碼轉(zhuǎn)換為二進(jìn)制碼參考流程三、實(shí)驗(yàn)步驟 (1) 運(yùn)行dvccjh32p 軟件,選擇編輯edit 菜單,根據(jù)實(shí)驗(yàn)內(nèi)容描述的數(shù)碼轉(zhuǎn)換內(nèi)容分別編寫(xiě)實(shí)驗(yàn)程序。 (2) 使用“asm編譯”菜單中“編譯+連接+運(yùn)行”選項(xiàng),對(duì)實(shí)驗(yàn)程序進(jìn)行匯編、連接。匯編、連接無(wú)誤的話,就直接運(yùn)行程序。觀察運(yùn)行結(jié)果。 (3) 或使用動(dòng)態(tài)調(diào)試,進(jìn)入調(diào)試環(huán)境,觀察調(diào)試過(guò)程中,指令執(zhí)行情況,包括各寄存器及數(shù)據(jù)區(qū)內(nèi)容的變化等。 (4) 更改數(shù)據(jù)區(qū)中的數(shù)據(jù),考察程序的正確性。四、參考程序1將ascii 碼表示的十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)實(shí)驗(yàn)源文件名dva3_1.asm(在文件夾“asm_匯編例程”中)實(shí)驗(yàn)程序清單如下:stack1 segm

29、ent stack dw 256 dup(?)stack1 endsddatasegmentmes db the ascii code of decimal code are:$buf db 30h,30h,30h,31h,32h db 10h dup(0)ddataendscode segmentassume cs:code,ds:ddatastart: mov ax,ddata mov ds,ax mov si,offset buf mov bx,000ah mov cx,0004h mov ah,00h mov al,si sub al,30ha1: imul bx add al,si+

30、01 sub al,30h inc si loop a1 mov si,ax mov dx,offset mes mov ah,09h int 21h inc si ;顯示高字節(jié) call show dec si ;顯示低字節(jié) call showstart0: mov ah,06h ;判斷是否有鍵按下mov dl,0ffhint 21hje start0;若沒(méi)有轉(zhuǎn)start0mov ax,4c00h ;有鍵返回dosint 21h show proc near mov al,ds:si and al,0f0h ;取高4位 shr al,4 cmp al,0ah ;是否是a以上的數(shù) jb c2

31、add al,07h c2: add al,30h mov dl,al ;顯示字符 mov ah,02h int 21h mov al,ds:si and al,0fh ;取低4位 cmp al,0ah jb c3 add al,07hc3: add al,30h mov dl,al ;顯示字符 mov ah,02h int 21h ret endpcode ends end start2 十進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為bcd碼實(shí)驗(yàn)源文件名dva3_2(在文件夾“asm_匯編例程”中) 實(shí)驗(yàn)程序清單如下:stack1 segment stack dw 256 dup(?)stack1 ends

32、ddatasegmentmesdbthe bcd code of decimal are:$bufdb31h,32h,33h,34h,35hdb10h dup(0)ddataendscode segmentassume cs:code,ds:ddatastart:movax,ddatamovds,axmov cx,0005hmov di,offset bufa1:movbl,0ffhmoval,dicmpal,3ah;比較al中的數(shù)是否是0-9的ascii碼 jnb a2sub al,30hjb a2mov bl,ala2:mov al,blmov di+05h,alinc diloop a1

33、movsi,dimovcx,05hmovdx,offset mesmovah,09hint 21ha3:call showmovdl,20hmovah,02hint21hincsiloop a3start0: mov ah,06h ;判斷是否有鍵按下mov dl,0ffhint 21hje start0 ;若沒(méi)有轉(zhuǎn)start0 mov ax,4c00h ;有鍵返回dosint 21hshowprocnearmoval,ds:siandal,0f0h;取高4位shral,4cmpal,0ah;是否是a以上的數(shù)jbc2addal,07hc2:addal,30hmovdl,al;顯示字符 movah

34、,02hint21hmoval,ds:siandal,0fh;取低4位cmpal,0ajbc3add al,07hc3:addal,30hmovdl,al;顯示字符movah,02hint21hretendpcode ends end start3 十六進(jìn)制數(shù)的ascii 碼轉(zhuǎn)換為十進(jìn)制數(shù)實(shí)驗(yàn)源文件名dva3_3.asm(在文件夾“asm_匯編例程”中)實(shí)驗(yàn)程序清單如下:stack1 segment stack dw 256 dup(?)stack1 endsddatasegmentmesdbthe ascii code of hex are:$bufdb0ch,00hdb10h dup(0)

35、ddataendscode segmentassume cs:code,ds:ddatastart:movax,ddatamovds,axmovsi,offset bufmov dx,simovbx,siaddbx,2addsi,7a1:dec simov ax,dxmov dx,0000hmov cx,000ahdiv cxxchg ax,dxadd al,30hmov si,alcmp dx,0000hjne a1a2:cmp si,bxjz a3dec simov al,30hmov si,al jmp a2a3:movcx,5movsi,offset bufaddsi,2movdx,o

36、ffset mesmovah,09hint21ha4:call showmovdl,20hmovah,02hint21hincsiloop a4start0: mov ah,06h;判斷是否有鍵按下mov dl,0ffhint 21hje start0;若沒(méi)有轉(zhuǎn)start0 mov ax,4c00h ;有鍵返回dosint 21hshowprocnearmoval,ds:siandal,0f0h;取高4位shral,4cmpal,0ah;是否是a以上的數(shù)jbc2addal,07hc2:addal,30hmovdl,al;顯示字符 movah,02hint21hmoval,ds:siandal,

37、0fh;取低4位cmpal,0ahjbc3add al,07hc3:addal,30hmovdl,al;顯示字符 movah,02hint21hretendpcode ends end start4bcd碼轉(zhuǎn)換為二進(jìn)制碼實(shí)驗(yàn)源文件名dva3_4.asm(在文件夾“asm_匯編例程”中)實(shí)驗(yàn)程序清單如下:stack1 segment stack dw 256 dup(?)stack1 endsddatasegmentmesdbthe bcd code of binary are:$bufdb01h,07h,03h,04h,05h,01h,06h,08hdb10h dup(0)ddataendsc

38、ode segmentassume cs:code,ds:ddatastart:movax,ddatamovds,axmov cx,0004hmov di,offset bufa1:mov al,diadd al,almov bl,aladd al,aladd al,aladd al,blinc dimov ah,00hadd al,dimov di+07h,axinc diloop a1movdx,offset mesmovah,09hint21hmovcx,04hmovdi,offset bufadddi,08ha2:movax,dicall shwordmovdl,20hmovah,02hint21hincdiincdiloop a2start0: mov ah,06h ;判斷是否有鍵按下mov dl,0ffhint 21hje start0 ;若沒(méi)有轉(zhuǎn)start0 mov ax,4c00h ;有鍵返回dosint 21hshwordprocnearmovbl,ahcall showmovbl,alcall showretendpshowprocnearpush axpush dxmoval,blandal,0f0h;取高4位shral,4cmpal,0ah;是否是a以上的數(shù)jbc2addal,07hc2:addal

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論