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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

12、操作符dup 重復(fù)定義多個相同單元的數(shù)據(jù)時采用。如 a db 3 dup (?)相當(dāng)于a db ?,?,? 8 保留符號? 根據(jù)數(shù)據(jù)定義偽指令的類型,保留相應(yīng)單位的內(nèi)存空間,不賦初值。 9 當(dāng)前地址指針$ 在匯編程序?qū)R編語言源程序進行匯編的過程中,當(dāng)前正在匯編的指令的地址用當(dāng)前地址指針$指示。對分配內(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)用是匯編程序通過int 21h 軟件中斷來調(diào)用dos 內(nèi)

13、部的子程序而進行某種操作的一個方法,dos 系統(tǒng)功能調(diào)用在實模式下的編程中應(yīng)用很廣泛,大致有上百種功能,這些功能的具體含義和參數(shù)設(shè)置可查閱手冊,而功能調(diào)用的基本格式如下: mov ah ,功能號 ;準備入口參數(shù) int 21h 下面列出匯編語言程序設(shè)計中經(jīng)常使用的兩種功能調(diào)用及其說明。109h 號功能調(diào)用 將數(shù)據(jù)段(ds)中以字符結(jié)尾的一個字符串輸出到屏幕上。 入口參數(shù):dx 寄存器存放該字符串的首地址(有效地址部分) 出口參數(shù):無 注意: 9 號系統(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 號系統(tǒng)功能 功能:返回系統(tǒng) 入口參數(shù): al=終止代碼或無 格式: mov ah ,4ch int 21h 或: mov ax ,4c00h int 21h (2) 使用語句 int 20h 功能:返回系統(tǒng) 入口參數(shù):cs 指向程序段前綴 實驗一 顯示程序?qū)嶒炓?、實驗?zāi)康?(1) 掌握在pc 機上以十六進制形式顯示數(shù)據(jù)的方法。 (2) 掌握部分dos 功能調(diào)用使用方法。 (3) 熟悉dvcc32jhp集成軟件調(diào)試環(huán)境。 二、實驗內(nèi)容及說明 一般來說,有很多程序需要顯示輸出提示運行的狀況和結(jié)果,有的還需要將數(shù)據(jù)區(qū)中的內(nèi)容顯示在屏幕上。本實驗要求將指定數(shù)據(jù)區(qū)的字符以

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

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

17、sm(在文件夾“asm_匯編例程”中)實驗程序清單如下: 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ù)據(jù)傳送實驗一、實驗?zāi)康?(1) 熟悉dvcc32jhp 調(diào)試運行環(huán)境。 (2) 掌握與數(shù)據(jù)有關(guān)的不同尋址方式。 二、實驗內(nèi)容 本實驗要求將數(shù)據(jù)段中的一個字符串傳送到附加段中,并輸出附加段中的目標字符串到屏幕上顯示。

19、 三、實驗步驟 (1) 運行dvcc32jhp軟件,選擇編輯edit 菜單編寫實驗程序或選擇open菜單打開程序。 (2) 使用“asm編譯”菜單中“編譯+連接+運行”選項,對實驗程序進行匯編、連接。匯編、連接無誤的話,就直接運行程序。觀察運行結(jié)果。(3) 或使用動態(tài)調(diào)試,進入調(diào)試環(huán)境,觀察調(diào)試過程中,指令執(zhí)行情況,包括各寄存器及數(shù)據(jù)區(qū)內(nèi)容的變化等。 (4) 更改數(shù)據(jù)區(qū)中的數(shù)據(jù),考察程序的正確性。 四、參考程序參考實驗程序文件名dva2.asm(在文件夾“asm_匯編例程”中)實驗程序清單如下: 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 ;開始傳輸數(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 ;若沒有轉(zhuǎn)start0 mov ax,4c00h ;有鍵返回dos int 21hcode ends end start 如果將程序主體部分的寄存器間接尋址方式改為相對尋址方式,則如下

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

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

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

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

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

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

28、碼轉(zhuǎn)換為二進制碼參考流程三、實驗步驟 (1) 運行dvccjh32p 軟件,選擇編輯edit 菜單,根據(jù)實驗內(nèi)容描述的數(shù)碼轉(zhuǎn)換內(nèi)容分別編寫實驗程序。 (2) 使用“asm編譯”菜單中“編譯+連接+運行”選項,對實驗程序進行匯編、連接。匯編、連接無誤的話,就直接運行程序。觀察運行結(jié)果。 (3) 或使用動態(tài)調(diào)試,進入調(diào)試環(huán)境,觀察調(diào)試過程中,指令執(zhí)行情況,包括各寄存器及數(shù)據(jù)區(qū)內(nèi)容的變化等。 (4) 更改數(shù)據(jù)區(qū)中的數(shù)據(jù),考察程序的正確性。四、參考程序1將ascii 碼表示的十進制數(shù)轉(zhuǎn)換為二進制數(shù)實驗源文件名dva3_1.asm(在文件夾“asm_匯編例程”中)實驗程序清單如下: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;若沒有轉(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 十進制數(shù)的ascii 碼轉(zhuǎn)換為bcd碼實驗源文件名dva3_2(在文件夾“asm_匯編例程”中) 實驗程序清單如下: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 ;若沒有轉(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 十六進制數(shù)的ascii 碼轉(zhuǎn)換為十進制數(shù)實驗源文件名dva3_3.asm(在文件夾“asm_匯編例程”中)實驗程序清單如下: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;若沒有轉(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)換為二進制碼實驗源文件名dva3_4.asm(在文件夾“asm_匯編例程”中)實驗程序清單如下: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 ;若沒有轉(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論