計算機硬件技術基礎-張桂新Chapter3-4_第1頁
計算機硬件技術基礎-張桂新Chapter3-4_第2頁
計算機硬件技術基礎-張桂新Chapter3-4_第3頁
計算機硬件技術基礎-張桂新Chapter3-4_第4頁
計算機硬件技術基礎-張桂新Chapter3-4_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

第四節(jié)匯編語言程序設計一、概述1.編寫匯編語言程序步驟2.判斷程序質量的標準3.幾種程序結構二、匯編語言程序設計舉例例1將寄存器BX中的內(nèi)容以十六進制形式顯示出來。例2將鍵盤輸入的十進制數(shù)據(jù)串轉換成其相應大小的數(shù)值存放在BX寄存器中。一、概述1.

編寫匯編語言程序步驟2.

判斷程序質量的標準3.

幾種程序結構一.編寫匯編語言程序步驟分析實際問題,抽象描述問題的模型確定解決模型的算法按算法畫出程序流程圖按流程圖編寫程序上機調試,運行程序2.判斷程序質量的標準程序的正確性程序的可讀性程序的執(zhí)行時間程序所占內(nèi)存大小3.幾種程序結構順序結構分支結構循環(huán)結構子程結構順序結構兩個分支YN

、、、

CMPAL,BLJGgreat

JMPexitgreat:

exit:、、、、、、

AL≤BL處理AL>BL處理分支結構三個分支

、、、

CMPAL,0

JGgreat

JLless

JMPexitless:

JMPexitgreat:

exit:、、、AL=0處理AL>0處理AL<0處理YYNN分支結構循環(huán)結構當型循環(huán)(當條件成立進入循環(huán))循環(huán)初始設置循環(huán)體循環(huán)條件判斷?YN直到型循環(huán)(直到條件成立退出循環(huán))YN循環(huán)初始設置循環(huán)體循環(huán)條件判斷?1.多處調用完成同一功能的子程:codeSEGMENTstart:、、

CALLsub

、、

CALLsub

、、

CALLsub

、、

MOVAH,4CHINT21HsubPROC

、、、、

RETsubENDPcodeENDSENDstart2.模塊化程序設計:codeSEGMENTbegin:CALL

sub1

CALLsub2

CALLsub3MOVAH,4CHINT21Hsub1PROC

、、

RETsub1ENDPsub2PROC

、、

RETsub2ENDPsub3PROC

、、

RETsub3ENDPcodeENDSENDbegin

子程結構注意返回DOS語句位置二、匯編語言程序設計舉例例1

將寄存器BX中的內(nèi)容以十六進制形式顯示出來。例2

將鍵盤輸入的十進制數(shù)據(jù)串轉換成其相應大小的數(shù)值存放在BX寄存器中。有關字符、數(shù)碼轉換的處理1.

計算機處理字符時,常用的字符編碼是ASCII碼。2.

數(shù)字和字母的ASCII碼是一個有序序列數(shù)字0~9:30H~39H大寫字母A~Z:41H~5AH小寫字母a~z:61H~7AH3.計算機處理信息時,其對象都是二進制數(shù)。外設(顯示器、打印機、鍵盤等)用ASCII碼與CPU進行信息傳送。例如:1)在鍵盤上按下某一字符鍵(如’9’),鍵盤接口向鍵盤緩沖區(qū)送去的是該字符的ASCII碼(如39H),

不是送數(shù)字09H。

2)在文本方式下,要在顯示器上顯示某一字符(如’A’),

須將該字符的ASCII碼(如41H)送顯示緩沖區(qū),不是送數(shù)字0AH。計算機要利用顯示器、鍵盤等外設時,須據(jù)程序設計的需要進行有關轉換。例將CPU運算的結果通過顯示器顯示時,需將結果轉換成其對應的ASCII碼才能進行顯示。例

CPU要處理從鍵盤輸入的某一數(shù)據(jù),

需將該數(shù)據(jù)串進行轉換后才能應用。例1

將BX寄存器中的內(nèi)容以十六進制形式顯示出來。

BX是一個16位寄存器二進制1010100100111110

用十六進制顯示時,每4位用一個字符顯示,共4個其中0000→’0’30H,1010→’A’41H

0001→’1’31H

,1011→’B’42H

、、、、

1001→’9’39H

,1111→’F’46H?十六進制A93E屏幕上的顯示‘A’‘9’‘3’‘E’對應的ASCII41H39H33H45H算法:取出要顯示的某4位,轉換為對應的ASCII碼,再調用DOS系統(tǒng)功能進行顯示。1)對于0000~1001,先擴展成一個字節(jié),高4位清0,加上30H后,即可得字符’0’~’9’對應的ASCII碼。

00000001B+30H=31H00001001B+30H=39H

0001B‘1’1001B‘9’2)對于1010~1111,先擴展成一個字節(jié),高4位清0,加上30H后,還要再加上07H,才能得到’A’~’F’對應的ASCII碼

00001010B+30H+07H=41H00001111B+30H+07H=46H

1010B‘A’1111B‘F’codeSEGMENTASSUMECS:codestart:MOVCH,4;字符個數(shù)

MOVCL,4;循環(huán)移位次數(shù)

next:ROLBX,CL

;取顯示位的值

MOVDL,BL

;保存在DL中

ANDDL,0FH

;清除高4位

ADDDL,30H

;轉變?yōu)閿?shù)字的ASCII

CMPDL,39H;大于39H,則應轉變

JLEprint;為字母A~F的ASCII

ADDDL,07H

print:MOVAH,2H;顯示DL中的字符

INT21HDECCH;顯示結束?

JNZnextMOVAH,4CH;返回DOSINT21HcodeENDS

ENDstart顯示字符個數(shù)CH=4循環(huán)移位次數(shù)CL=4BX循環(huán)左移4位,將要顯示的值移至低4位,保存在DL中清DL的高4位,只保留要顯示位的值DL←DL+30H完成數(shù)值0~9的ASCII碼轉換YNDL←DL+07H完成數(shù)值A~F的ASCII碼轉換用02功能顯示DL中的字符YN返回DOSDL超出39H?CH←CH-1轉換結束?開始思考:1.例1采用的是大寫字母A~F進行顯示,若采用小寫字符a~f進行顯示,程序如何改寫?

1010001110011110‘A39E’或‘a(chǎn)39e’2.

編程將CPU內(nèi)14個16位寄存器當前的內(nèi)容分別用十六進制形式顯示出來。編程將CPU內(nèi)14個16位寄存器當前的內(nèi)容分別用十六進制形式顯示出來。

要點:將上例改寫為一個子程,入口參數(shù)為BX

子程中注意寄存器值的保存和恢復注意CS、IP、PSW寄存器值的獲取方法例將CPU內(nèi)14個16位寄存器當前內(nèi)容分別用16進制形式顯示出來(采用DEBUG下R命令的顯示順序)codeSEGMENTASSUMECS:codestart:PUSHBXMOVBX,AX;顯示AX

CALLlistbx

POPBX;顯示BX

CALLlistbx

MOVBX,CX;顯示CX

CALLlistbx

MOVBX,DX;顯示DX

CALLlistbx

MOVBX,SP;顯示SP

CALLlistbx

MOVBX,BP;顯示BP

CALLlistbx

MOVBX,SI;顯示SI

CALLlistbx

MOVBX,DI;顯示DI

CALLlistbx

MOVBX,DS;顯示DS

CALLlistbx

MOVBX,ES;顯示ES

CALLlistbx

MOVBX,SS;顯示SS

CALLlistbx

MOVBX,SEGstart

CALLlistbx

;顯示CSMOVBX,OFFSETstart

CALLlistbx

;顯示IP

PUSHF

POPBX;顯示PSW

CALLlistbx

MOVAH,4CH;返回DOSINT21HlistbxPROC

MOVCH,4MOVCL,4next:ROLBX,CLMOVDL,BLANDDL,0FHADDDL,30HCMPDL,39HJLEprintADDDL,07Hprint:MOVAH,2HINT21HDECCHJNZnext

MOVDL,20H;顯示空格符

MOVAH,02HINT21HRET

;子程返回listbxENDPcodeENDSENDstart

listbxPROC

PUSHCX;保存寄存器

PUSHBXPUSHDXPUSHAXPUSHF

POPF

;恢復寄存器

POPAXPOPDXPOPBXPOPCXRET

;子程返回listbxENDPcodeENDSENDstart用十六進制顯示BX內(nèi)容子程

D:\>LIST_REG

;在DOS下執(zhí)行程序0000000000FF0BDF00000912000000000BDF0BDF0BEF0BEF00003202D:\>DEBUG

LIST_REG.EXE

;利用DEBUG檢測結果-R;顯示當前寄存器內(nèi)容AX=0000BX=0000CX=007BDX=0000SP=0000BP=0000SI=0000DI=0000DS=128EES=128ESS=129ECS=129EIP=0000NVUPEIPLNZNAPONC129E:000053PUSHBX-G;執(zhí)行程序00000000007B00000000000000000000128E128E129E129E00007202Programterminatednormally-運行的結果與用R命令顯示的結果相同,程序運行結果正確例2

將鍵盤輸入的十進制數(shù)據(jù)串轉換成相應大小的數(shù)值存放在BX寄存器中。分析:

從鍵盤輸入’1234’(表示1234)

用0AH功能輸入,則緩沖區(qū)存放的內(nèi)容為:06h04h31h32h33h34h0Dhnum問題:要轉換成1234即04D2h存放在BX中,怎么實現(xiàn)?清ASCII碼的高4位可得各數(shù)位大小值。01h02h03h04h04D2h?算法一:數(shù)值大小=各位值×權值之和

1234D=千位×1000+百位×100+十位×10+個位

=1×1000+2×100+3×10+4=0000010011010010B=04D2H01h02h03h04h04D2h?算法二:數(shù)值大小=部分和×10+下一位數(shù)值

1234D=(((0×10+1)×10+2)×10+3)×10+4=0000010011010010B=04D2H

部分和從0開始,循環(huán)次數(shù)等于輸入的位數(shù)01h02h03h04h04D2h?

dataSEGMENT

stringDB‘Input:’,’$’numDB6,?,6DUP(?)

dataENDS

CODESEGMENT

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AX

CALLinputCALLchangeCALLlist_bx

MOVAH,4CHINT21H

開始初始化DS的值CALLinput顯示輸入提示,等待從鍵盤輸入十進制數(shù)據(jù)串CALLchange將數(shù)據(jù)串轉化為相應的數(shù)值存放在BX中返回DOS主程序流程圖CALLlist_bx將BX內(nèi)容以16進制顯示出來input子程序流程圖調用09功能顯示輸入提示調用0A功能等待從鍵盤輸入數(shù)據(jù)RET返回inputPROC

LEADX,stringMOVAH,09HINT21HLEADX,numMOVAH,0AHINT21H

RETinputENDP0604313233340D00num0000change子程序流程圖(BX)←輸入字符的數(shù)值大小SI←數(shù)據(jù)串偏址CX←數(shù)據(jù)串長度AX←部分和初值0DI←乘數(shù)10YNRET返回AX←部分和乘10(AX)←(AX)+(BX)形成新的部分和修改SI指針,指向下一位輸入BX←轉換結果AXCX←CX-1CX=0?

changePROCLEASI,num+2MOVCL,num+1MOVCH,0

MOVAX,0MOVDI,10

next:

MULDIMOVBH,0MOVBL,[SI]ANDBL,0FH

ADDAX,BX

INCSI

LOOPnextzero:MOVBX,AX

RETchangeENDP

0604313233340D00num00001234D=((

(

0×10

+1

)

×10

+2)

×10

+3

)

×10

+4顯示字符個數(shù)CH=4循環(huán)移位次數(shù)CL=4BX循環(huán)左移4位,將要顯示的值移至低4位,保存在DL中清DL的高4位,只保留要顯示位的值DL←DL+30H完成數(shù)值0~9的ASCII碼轉換YNDL←DL+07H完成數(shù)值A~F的ASCII碼轉換用02功能顯示DL中的字符YNRET返回DL超出39H?CH←CH-1轉換結束?list_bx子程序流程圖

list_bxPROCMOVCH,4MOVCL,4next:ROLBX,CL

MOVDL,BL

ANDDL,0FH

ADDDL,30H

CMPDL,39H

JLEprint

ADDDL,07H

print:MOVAH,2HINT21HDECCHJNZnext

RET

;子程返回

list_bxENDPcodeENDS

ENDstart編寫子程序的注意事項:

注意子程中PUSH、POP應成對,否則易造成死機。dataSEGMENT

stringDB‘Hello’,’$’

dataENDScodeSEGMENT

ASSUMECS:code,DS:datastart:MOVAX,dataMO

溫馨提示

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

最新文檔

評論

0/150

提交評論