微機(jī)原理與接口技術(shù)第4章匯編語言程序設(shè)計(jì).ppt_第1頁
微機(jī)原理與接口技術(shù)第4章匯編語言程序設(shè)計(jì).ppt_第2頁
微機(jī)原理與接口技術(shù)第4章匯編語言程序設(shè)計(jì).ppt_第3頁
微機(jī)原理與接口技術(shù)第4章匯編語言程序設(shè)計(jì).ppt_第4頁
微機(jī)原理與接口技術(shù)第4章匯編語言程序設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩191頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第4章 匯編語言程序設(shè)計(jì),4.1 匯編語言的格式 4.1.1 8086匯編語言程序的一個(gè)例子 MY_DATA SEGMENT ;定義數(shù)據(jù)段 SUM DB ? ;為符號(hào)SUM保留一個(gè)字節(jié) MY_DATA ENDS ;定義數(shù)據(jù)段結(jié)束 MY_CODE SEGMENT ;定義碼段,ASSUME CS:MY_CODE, ;規(guī)定CS和DS的內(nèi)容 DS:MY_DATA PORT_VA1 EQU 3 ;端口的符號(hào)名 GO: MOV AX, MY_DATA ;DS初始化為MY_DATA MOV DS, AX MOV SUM, 0 ;清SUM單元,CYCLE: CMP SUM, 100 ;SUM單元與100相比較

2、 JNA NOT_DONE ;若未超過,轉(zhuǎn)至NOT_DONE MOV AL, SUM ;若超過,把SUM單元的內(nèi)容 OUT PORT_VAL, AL ;通過AL輸出 HLT ;然后停機(jī),NOT DONE:IN AL, PORT_VAL ;未超過時(shí),輸入下一個(gè)字節(jié) ADD SUM, AL ;與以前的結(jié)果累加 JMP CYCLE ;轉(zhuǎn)至CYCLE,MY CODE ENDS ;代碼段結(jié)束 END GO ;整個(gè)程序結(jié)束 由這個(gè)例子看到,8086匯編的一個(gè)語句行是由4個(gè)部分組成的,即 標(biāo)號(hào) 操作碼 操作數(shù) ;注釋(或名字),4.1.2 8086匯編語言源程序的格式,源程序的一般格式為: NAME1 SE

3、GMENT 語句 語句 NAME1 ENDS NAME2 SEGMENT 語句 語句 NAME2 ENDS END ,4.2 語句行的構(gòu)成,4.2.1 標(biāo)記(Token) 1IBM宏匯編的字符集 (1)字母 包含大寫的英文字母:ABCDXYZ; 小寫的英文字母:abcxyz。,(2)數(shù)字 阿拉伯?dāng)?shù)字:0123456789。 (3)特殊字符,圖4-1 IBM宏匯編字符集中可打印字符,2界符(Delimiters),圖4-2 IBM宏匯編中的界符集,3常量(Constants),(1)數(shù)字(整數(shù))常量 二進(jìn)制常量 以字母B結(jié)尾的由一串“0”和“1”組成的序列。例如,00101100B。, 十進(jìn)制常

4、量,由若干個(gè)09的數(shù)字組成的序列,可以以字母D作結(jié)尾,或沒有任何字母作結(jié)尾。例如,1234D或1234。, 八進(jìn)制常量,以字母Q結(jié)尾,由若干個(gè)07的數(shù)字組成的序列。例如255Q、377Q等。, 十六進(jìn)制常量,以字母H結(jié)尾,由若干個(gè)09的數(shù)字或AF的字母所組成的序列。,(2)字符串常量,字符串常量是由包含在單引號(hào)內(nèi)的1或2個(gè)ASCII字符構(gòu)成的。,4標(biāo)識(shí)符(Identifiers),標(biāo)識(shí)符是由程序員自由建立起來的、有特定意義的字符序列,如例子中的SUM、CYCLE、PORT_VAL等。 一個(gè)標(biāo)識(shí)符是由最多為31個(gè)字母、數(shù)字及規(guī)定的特殊字符(? _ $)等組成的,且不能用數(shù)字打頭(以免與十六進(jìn)制數(shù)

5、相混淆)。,下面是一些標(biāo)識(shí)符的例子: X GAMMA JACKS THIS_DONE THISDONE,5保留字(Reserved Words),保留字看上去像標(biāo)識(shí)符,但是它們?cè)谡Z言中有特殊的意義,而且不能用它們作為標(biāo)識(shí)符。,表4-1IBM宏匯編中的保留字,續(xù)表,續(xù)表,6注釋(Comment),為了使匯編語言的源程序更便于閱讀和理解,常在源程序中加上注釋。 注釋是在分號(hào)(;)后面的任意的字符序列,直到行的結(jié)尾。 在匯編時(shí),匯編程序?qū)λ鼈儾⒉贿M(jìn)行處理。 在可打印的文件中,注釋和源程序一起打印。,4.2.2 符號(hào)(Symbol),1寄存器(Registers) 2變量(Variable) 所有的變

6、量都具有三種屬性: (1)段值(SEGMENT),即變量單元所在段的段地址(段的起始地址)的高16位,低4位始終為0。,(2)偏移量(OFFSET),即變量單元地址與段的起始地址之間的偏移量(16位)。 (3)類型(TYPE),變量有三種類型:字節(jié)(Byte)、字(word)和雙字(Double Word)。,3標(biāo)號(hào)(Label) 4數(shù) 5其他符號(hào),4.2.3 表達(dá)式(Expressions),1操作數(shù)(Operands) 一個(gè)操作數(shù)或者是一個(gè)寄存器名,或是一個(gè)常量(數(shù)字常量或字符串常量),或是一個(gè)存儲(chǔ)器操作數(shù)。,(1)常量操作數(shù),具有數(shù)字值的操作數(shù)是常量或是表示常量的標(biāo)識(shí)符(符號(hào))。 例中的

7、常量操作數(shù)是100、PORT_VAL。 常量操作數(shù)的值的允許范圍是從65535+65535。,(2)存儲(chǔ)器操作數(shù),存儲(chǔ)器操作數(shù),通常是標(biāo)識(shí)符。 具體地說,可以分成標(biāo)號(hào)(Label)和變量(Variable)兩種。,變量可以具有以下幾種尋址方式: 直接尋址 基址尋址 變址(索引)尋址 基址變址尋址,2運(yùn)算符(Operators), 算術(shù)運(yùn)算符(Arithmetic Operators) 邏輯運(yùn)算符(Logical Operators) 關(guān)系運(yùn)算符(Relational Operators) 分析運(yùn)算符(Analytic Operators) 合成運(yùn)算符(Synthetic Operators),

8、(1)算術(shù)運(yùn)算符,一個(gè)是加(+)、減()、乘(*)和除(/)運(yùn)算符。 另一個(gè)算術(shù)運(yùn)算符是MOD,它產(chǎn)生除法以后的余數(shù),例如,19/7是2(商是2),而19MOD7是5(余數(shù)是5)。,因此,對(duì)例子中的存儲(chǔ)器地址作如下運(yùn)算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表達(dá)式。而 SUM-CYCLE,(2)邏輯運(yùn)算符,邏輯運(yùn)算符是按位操作的AND、OR、XOR和NOT。 1010 1010 1010 1010B AND 1100 1100 1100 1100B=1000 1000 1000 1000B 1100 1100 1100 1100B OR 1111 0000 1111 0

9、000B=1111 1100 1111 1100B NOT 1111 1111 1111 1111B=0000 0000 0000 0000B,(3)關(guān)系運(yùn)算符,在IBM宏匯編中有以下關(guān)系運(yùn)算符: 相等Equal(EQ) 不等Not Equal(NE) 小于Less Than(LT), 大于Greater Than(GT) 小于或等于Less Than or Equal(LE) 大于或等于Greater Than or Equal(GE),若在程序中有以下關(guān)系運(yùn)算: MOV BX, PORT_VAL LT 5 若PORT_VAL的值小于5,關(guān)系為真,則匯編程序在匯編后產(chǎn)生的語句為: MOV B

10、X, 0FFFFH 若PORT_VAL的值不小于5,則關(guān)系為假,匯編后產(chǎn)生的語句為: MOV BX, 0,(4)分析運(yùn)算符 (5)合成運(yùn)算符,4.2.4 語句(Statements),一個(gè)匯編語言的源程序是由一條條語句組成的,語句就是對(duì)需要計(jì)算機(jī)完成的動(dòng)作的說明。 源程序中的語句可分成兩類:指令語句和指示性語句。,指令語句,匯編程序把它們翻譯成機(jī)器代碼,這些代碼命令8086執(zhí)行某些操作。如MOV、ADD、JMP等。,對(duì)于指示性語句(偽指令),匯編程序并不把它們翻譯成機(jī)器代碼,實(shí)際上也不可能翻譯成機(jī)器代碼,只是用來指示、引導(dǎo)匯編程序在匯編時(shí)做一些操作,如定義符號(hào)、分配存儲(chǔ)單元、初始化存儲(chǔ)器等,所

11、以偽指令本身不占用存儲(chǔ)單元,例如: MY_PLACE DB ?,指令語句的格式為: 標(biāo)號(hào):助記符 參數(shù), , 參數(shù);注釋 指示性語句的格式為: 名字 命令 參數(shù), , 參數(shù) ;注釋,4.3 指示性語句(Directive Statements),在IBM宏匯編中有以下幾種指示性語句: (1)符號(hào)定義語句(Symbol definition) (2)數(shù)據(jù)定義語句(Data definition) (3)段定義語句(Segmentation definition) (4)過程定義語句(Procedure definition) (5)結(jié)束語句(Termination),4.3.1 符號(hào)定義語句,1

12、等值語句EQU NAME EQU EXPRESSION 一些例子如下: BOILING_POINT EQU 212 BUFFER_SIZE EQU 32 NEW_PORT EQU PORT_VAL+1 COUNT EQU CX CBD EQU AAD,2等號(hào)(Equal sign)=語句,EMP = 6 EMP = 7 EMP = EMP + 1,3解除語句PURGE,PURGE語句的格式為: PURGE 符號(hào)1, 符號(hào)2, , 符號(hào)n 例如: PURGE NEW_PORT NEW_PORT EQU PORT_VAL+10,4.3.2 數(shù)據(jù)定義語句,數(shù)據(jù)定義語句,為一個(gè)數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元,用一

13、個(gè)符號(hào)名與這個(gè)存儲(chǔ)單元相聯(lián)系,且為這個(gè)數(shù)據(jù)提供一個(gè)任選的初始值。,與數(shù)據(jù)項(xiàng)相聯(lián)系的符號(hào)名稱為變量。 以下是數(shù)據(jù)定義語句的例子: THING DB ? ;定義一個(gè)字節(jié) BIGGER_THING DW? ;定義一個(gè)字 BIGGEST_THING DD?;定義一個(gè)雙字,例如: THING DB 25 不僅使THING這個(gè)符號(hào)與一個(gè)字節(jié)的存儲(chǔ)單元相聯(lián)系,而且在匯編時(shí)會(huì)把25放入與THING相聯(lián)系的存儲(chǔ)單元中。 所以THING是一個(gè)字節(jié)變量,它的初始值為25。,同樣,以下語句: BIGGER_THING DW 4142H 在匯編時(shí)就會(huì)把41H與42H分別放至與BIGGER_THING相聯(lián)系的兩個(gè)連續(xù)的字

14、節(jié)單元中(一個(gè)字中),而且42H放在地址低的字節(jié),41H放在地址高的字節(jié)。 所以,若BIGGER_THING是一個(gè)字變量,則它的初始值為4142H。,語句 BIGGEST_THING DD 12345678H 在匯編時(shí)的初始化如圖4-3所示。 它定義了一個(gè)雙字變量,且給了初始值。,IN_PORTDB PORT_VAL OUT_PORTDB PORT_VAL+1 其中,PORT_VAL已由EQU語句賦了值。,圖4-3 定義雙字的數(shù)據(jù)定義語句的作用,一個(gè)存儲(chǔ)單元的類型如下: (1)數(shù)據(jù)字節(jié) SUM DB ? ;定義一個(gè)字節(jié) (2)數(shù)據(jù)字(兩個(gè)連續(xù)的字節(jié)) BIGGER DW ? ;定義一個(gè)字,(3

15、)數(shù)據(jù)雙字(四個(gè)連續(xù)的字節(jié)) BIGGEST DD ? ;定義一個(gè)雙字 (4)Near指令單元 CYCLE: CMP SUM, 100 (5)Far指令單元,若在一個(gè)程序中,對(duì)它的數(shù)據(jù)段有如下定義: DATA_TABLES SEGMENT BUFFER1 DB 100 DUP(0) BUFFER2 DW 200 DUP(20H) BUFFER3 DD 100 DUP(13) DATA_TABLES ENDS,其中的每一個(gè)存儲(chǔ)單元都有一些屬性(或組成部分)。 分析運(yùn)算符SEG,返回的是一個(gè)存儲(chǔ)單元的段地址(即它所在段的起始地址);OFFSET運(yùn)算符返回的是每一個(gè)存儲(chǔ)單元地址的段內(nèi)偏移量,即它與段

16、地址之間的偏差。故: SEG BUFFER1 SEG BUFFER2 SEG BUFFER3,都是相同的,它們返回的地址都是DATA_TABLES的地址。 所以,若要對(duì)數(shù)據(jù)段寄存器初始化,則可以采用指令:,MOV AX, SEG BUFFER1 MOV DS, AX 而 OFFSET BUFFER1 OFFSET BUFFER2 OFFSET BUFFER3,是各不相同的。若要向這些緩沖區(qū)填入新的數(shù)據(jù),可以用一些地址指針,則可以用以下指令來初始化地址指針: MOV BX, OFFSET BUFFER1 MOV SI, OFFSET BUFFER2 MOV DI, OFFSET BUFFER3

17、以后,就可以用這些指針來間接尋址這些緩沖區(qū)。,表4-2存儲(chǔ)器地址操作數(shù)的類型值,4.3.3 段定義語句,段定義的主要命令有SEGMENT,ENDS,ASSUME,ORG。 SEGMENT和ENDS語句把匯編語言源程序分成段。 這些段就相應(yīng)于存儲(chǔ)器段,在這些存儲(chǔ)器段中,存放相應(yīng)段的目標(biāo)碼。,下面的程序是一個(gè)簡單的例子,它說明了如何使用SEGMENT、ENDS和ASSUME命令,以定義代碼段、堆棧段、數(shù)據(jù)段和附加段。 MY_DATA SEGMENT X DB ? Y DW ? Z DD ?,MY_DATA ENDS MY_EXTRA SEGMENT ALPHA DB ? BETA DW ? GAM

18、MADD ? MY_EXTRA ENDS MY_STACK SEGMENT,DW 100 DUP(?) TOP EQU THIS WORD MY_STACK ENDS MY_CODE SEGMENT ASSUME CS:MY_CODE, DS:MY_DATA ASSUME ES:MY_EXTRA, SS:MY_STACK,START:MOV AX, SEG X MOV DS, AX MOV AX, SEG ALPHA MOV ES, AX,MOV AX, MY_STACK MOV SS, AX MOV SP, OFFSET TOP MY_CODE ENDS END START,(1)不要搭接,

19、段中的第一個(gè)可用字節(jié)是在16字節(jié)界限上。 MY_SEG SEGMENT MY_SEG ENDS 這是一種正常情況。,(2)允許搭接,但第一個(gè)可用字節(jié)必須在字的界限上。 MY_SEG SEGMENT WORD MY_SEG ENDS,(3)段開始在指定的16個(gè)字節(jié)界值上,但第一個(gè)可用字節(jié)在指定的偏移位置上。 MY_SEG SEGMENT AT 1A2BH;段地址為1A2BH ORG 0003H ;段內(nèi)從偏移量0003H開始 MY_SEG ENDS,在最后這個(gè)例子中,介紹了另一個(gè)語句ORG(Origin),它規(guī)定了段內(nèi)的起始地址。 偽指令ORG 的一般格式為: ORG ,此語句指定了段內(nèi)在它以后的

20、程序或數(shù)據(jù)塊存放的起始地址,也即以語句中的表達(dá)式的值作為起始地址,連續(xù)存放,除非遇到一個(gè)新的ORG語句。,4.3.4 過程定義語句,過程定義語句的格式為: PROCEDURE_NAME PROC NEAR 或 PROCEDURE_NAME PROC FAR RET PROCEDURE NAME ENDP,下面是一個(gè)過程定義的例子: MY_CODE SEGMENT UP_COUNT PROC NEAR ADD CX, 1 RET UP_COUNT ENDP START:,CALL UP_COUNT CALL UP_COUNT HLT MY_CODE ENDS END START,4.3.5 結(jié)束

21、語句,START: END START,4.4 指 令 語 句,4.4.1 指令助記符 1NOP(No Operation) 2保留空格(Place Holder),4.4.2 指令前綴,LOCK REP(Repeat) REPE(當(dāng)相等時(shí)重復(fù)) REPNE(當(dāng)不相等時(shí)重復(fù)) REPZ(當(dāng)標(biāo)志ZF=1時(shí)重復(fù)) REPNZ(當(dāng)標(biāo)志ZF=0時(shí)重復(fù)) 具有前綴的指令語句的例子為: CYCLE: LOCK DEC COUNT,4.4.3 操作數(shù)尋址方式,1立即(Immediate) MOV AX, 15 ;15是一個(gè)立即數(shù) 2寄存器(Register) MOV AX, 15 ;AX是一個(gè)寄存器操作數(shù),

22、3直接(Direct) SUM DB ? MOV SUM, 15 ;SUM是一個(gè)直接存儲(chǔ)器操作數(shù) 4通過基址寄存器間接(Indirect Through Base Register) MOV AX,BX MOV AX,BP,5通過變址寄存器間接(Indirect Through Index Register),MOV AX,SI MOV AX,DI,6通過基址寄存器加變址寄存器間接(Indirect Through Base Register Plus Index Register),MOV AX,BXSI MOV AX,BXDI MOV AX,BPSI MOV AX,BPDI,7通過基址或變

23、址寄存器加位移量間接,MANY_BYTES DB 100 DUP(?) MOV AX, MANY_BYTESBX MOV AX, MANY_BYTESBP MOV AX, MANY_BYTESSI MOV AX, MANY_BYTESDI,8通過基址寄存器加變址寄存器加位移量間接,MANY_BYTES DB 100 DUP(?) MOV AX, MANY_BYTESBXSI MOV AX, MANY_BYTESBXDI MOV AX, MANY_BYTESBPSI MOV AX, MANY_BYTESBPDI,4.4.4 串操作指令,ALPHADB ? BETADB ? MOVSI, OFFS

24、ET ALPHA MOVDI, OFFSET BETA MOVSBETA, ALPHA,下面我們通過一個(gè)例子來說明:一個(gè)完整的匯編語言源程序應(yīng)該由哪些部分組成。 例子是把兩個(gè)分別由未組合的BCD碼(一個(gè)字節(jié)為一位BCD數(shù))的串相加。,由于8086中允許兩個(gè)未組合的十進(jìn)制數(shù)相加,只要經(jīng)過適當(dāng)調(diào)整就可以得到正確的結(jié)果。 所以,在程序中把第一個(gè)串的一位BCD數(shù)取至AL中,與第二個(gè)串的相應(yīng)位相加,經(jīng)過AAA調(diào)整,再把結(jié)果存至存儲(chǔ)器中。,程序中的前面部分是為了設(shè)置段,先設(shè)置數(shù)據(jù)段,用DB偽指令定義兩個(gè)數(shù)據(jù)串,用COUNT表示數(shù)據(jù)的長度。 接著是定義堆棧段,為堆棧留下了100個(gè)單元的空間(實(shí)際上當(dāng)然要由需

25、要來定),然后是定義代碼段,從標(biāo)號(hào)GO開始就是可執(zhí)行指令部分。 程序如下:,NAME ADP_TWO_BCD_STRING DATA SEGMENT STRI1DB 1, 7, 5, 2 STRI2DB 3, 8, 1, 4 COUNTEQU $-STRI2 DATA ENDS,STACK SEGMENT PARA STACK STACK STAPNDB 100 DUP(?) TOP EQU LENGTH STAPN STACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK, DS:DATA, ES:DATA,STATR PROC FAR PUSH DS

26、 MOV AX, 0 PUSH AX,GO:MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX CLC CLD,MOV SI, OFFSET STRI1 MOV DI, OFFSET STRI2 MOV CX, COUNT CYCLE:LODS STRI1 ADC AL,DI AAA STOS STRI2 LOOP CYCLE RET STATR ENDP,CODE ENDS END START 程序中的 DATA SEGMENT DATA ENDS,4.5 匯編語言程序設(shè)計(jì)及舉例

27、,4.5.1 算術(shù)運(yùn)算程序設(shè)計(jì)(直線運(yùn)行程序) 例4-1 兩個(gè)32位無符號(hào)數(shù)乘法程序。 NAME 32 BIT MULTIPLY DATA SEGMENT MULNUM DW 0000, 0FFFFH, 0000, 0FFFFH, 4 DUP(?),DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA,START PROCFAR BEGIN: PUSHDS ;DS中包含的是程序段前綴的起始地址 MOVAX,

28、 0 PUSHAX ;設(shè)置返回至DOS的段值和IP值 MOVAX, DATA MOVDS, AX,MOVES, AX ;置段寄存器初值 LEABX, MULNUM MULU32:MOVAX, BX ;BAX MOVSI, BX+4 ;DSI MOVDI, BX+6 ;CDI MULSI ;BD,MOVBX+8, AX ;保存部分積1 MOV BX+0AH, DX MOV AX, BX+2 ;AAX MULSI ;AD ADDAX, BX+0AH,ADCDX, 0 ;部分積2的一部分與部分積1的相應(yīng)部分相加 MOV BX+0AH, AX MOV BX+0CH, DX ;保存 MOV AX, BX

29、 ;BAX,圖4-4 用16位乘法指令實(shí)現(xiàn)32位乘法的程序流程圖,MULDI ;BC ADDAX, BX+0AH ;與部分積3的相應(yīng)部分相加 ADCDX, BX+0CH MOVBX+0AH, AX MOVBX+0CH, DX PUSHF ;保存后一次相加的進(jìn)位位,MOVAX, BX+2 ;AAX MULDI ;AC POPF ADCAX, BX+0CH ;與部分積4的相應(yīng)部分相加 ADCDX, 0 MOVBX+0CH, AX MOVBX+0EH, DX,RET START ENDP CODE ENDS END BEGIN,4.5.2 分支程序設(shè)計(jì),SIGEFMOV AX, BUFFER OR

30、AX, AX JE ZERO JNS PLUS MOV BX, 0FFH JMP CONTI,ZERO:MOV BX, 0 JMP CONTI PLUS:MOV BX, 1 CONTI:,圖4-5 符號(hào)函數(shù)的程序流程圖,4.5.3 循環(huán)程序設(shè)計(jì),1用計(jì)數(shù)器控制循環(huán) 例4-2 在一串給定個(gè)數(shù)的數(shù)中尋找最大值(或最小值),放至指定的存儲(chǔ)單元。每個(gè)數(shù)用16位表示。,NAME SEARCH_MAX DATA SEGMENT BUFFER DW X1, X2, ., Xn COUNT EQU $ - BUFFER MAX DW ? DATA ENDS STACK SEGMENT PAPA STACK S

31、TACK,DB 64 DUP(?) TOP EQU $ - STACK STACK ENDS CODE SEGMENT START PROC FAR ASSUME CS:CODE, DS:DATA, SS:STACK,BEGIN:PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX,MOV CX, COUNT LEA BX, BUFFER MOV AX,BX INC BX DEC CX AGAIN:CMP AX,BX JGE NEXT,MOV AX,BX

32、 NEXT: INC BX LOOP AGAIN START ENDP CODE ENDS END BEGIN,2多重循環(huán),下面是一個(gè)多重循環(huán)的例子(沒有精確計(jì)算延時(shí)時(shí)間): DELAY:MOV DX, 3FFH TIME MOV AX, 0FFFFH TIME1 DEC AX NOP,JNE TIME1 DEC DX JNE TIME RET,4.5.4 字符串處理程序設(shè)計(jì),1確定字符串的長度 例4-3 從頭搜索字符串的結(jié)束標(biāo)志,統(tǒng)計(jì)搜索的字符個(gè)數(shù),其流程圖如圖4-6所示。,相應(yīng)的程序?yàn)椋?NAME LENGTH_OF_STRING DATA SEGMENT STRINGDB ABCDUVW

33、XYZ, 0DH LL DB ? CR EQU 0DH DATA ENDS,STACKSEGMENT PARA STACK STACK DB L00DUP(?) STACKENDS CODE SEGMENT,ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START PROCFAR BEGIN:PUSHDS MOVAX, 0 PUSHAX MOVAX, DATA MOVDS, AX MOVES, AX,LEA DI, STRING ;設(shè)串的地址指針 MOV DL, 0 ;置串長度初值為0 MOV AL, CR ;串結(jié)束標(biāo)志AL AGAIN: SCASB ;

34、搜索串 JE DONE ;找到結(jié)束標(biāo)志,停止 INC DL ;串長度加1 JMP AGAIN,DONE: LEA BX, LL MOV BX, DL RET START ENDP CODE ENDS END BEGIN,圖4-6 確定字符串長度的流程圖,2加偶校驗(yàn)到ASCII字符,例4-4 若有一個(gè)ASCII字符串,它的起始地址放在單元STRING內(nèi),要求從串中取出每一個(gè)字符,檢查其中包含的“1”的個(gè)數(shù),若已為偶數(shù),則它的最高有效位置“0”;否則,最高有數(shù)位置“1”,然后送回。 其流程如圖4-7所示。,圖4-7 加偶校驗(yàn)位至ASCII字符,相應(yīng)的程序?yàn)椋?NAME PARITY_CHECK D

35、ATA SEGMENT STRINGDB 1234567890 COUNTEPU $ - STRING DATA ENDS STACKSEGMENT PARA STACK STACK DB 100 DUP(?),STACKENDS CODESEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK STARTPROC FAR BEGIN:PUSH DS MOV AX, 0 PUSH AX,MOV AX, DATA MOV DS, AX MOV ES, AX LEA SI, STRING MOV CX, COUNT,AGAIN:LODSB AND AL,

36、 AL JPE NEXT OR AL, 80H MOV SI - L, AL,NEXT:DEC CX JNZ AGAIN RET STARTENDP CODEENDS END BEGIN,4.5.5 碼轉(zhuǎn)換程序設(shè)計(jì),1十六進(jìn)制到ASCII的轉(zhuǎn)換 例4-5 若有一個(gè)二進(jìn)制數(shù)碼串,要把每一個(gè)字節(jié)中的二進(jìn)制轉(zhuǎn)換為兩位十六進(jìn)制數(shù)的ASCII,高4位的ASCII放在地址高的單元。串中的第一個(gè)字節(jié)為串的長度(小于128)。 能實(shí)現(xiàn)這樣轉(zhuǎn)換的流程如圖4-8所示。,相應(yīng)的程序?yàn)椋?NAME HEX_CHANGE_TO_ASCII DATA SEGMENT L1 DW 2 STRINGDB 34H, 98H 1

37、2 DW ? BUFFERDB 2*2 DUP(?) DATAENDS,STACKSEGMENT PARA STACK STACK DB 100 DUP(?) STACKENDS CODESEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK,STARTPROC FAR BEGIN:PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX MOV CX, LL,LEA BX, STRING LEA SI, BUFFER MOV AX, CX SAL CX, 1 MOV 12, CX M

38、OV CX, AX AGAIN:MOV AL, BX,MOV DL, AL AND AL, 0FH CALL CHANGE MOV AL, DL PUSH CX MOV CL, 4 SHR AL, CL POP CX,CALL CHANGE INC BX LOOP AGAIN RET START ENDP CHANGE PROC CMP AL, 10 JL ADD_0 ADD AL, A-0-10,ADD_0: ADD AL, 0 MOV SI, AL INC SI RET CHANGE ENDP CODE ENDS END BEGIN,(a) (b) 圖4-8 把十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII的

39、程序流程圖,2從二進(jìn)制到ASCII串的轉(zhuǎn)換,例4-6 把在內(nèi)存變量NUMBER中的16位二進(jìn)制數(shù),每一位轉(zhuǎn)換為相應(yīng)的ASCII,存入串變量STRING中,其流程如圖4-9所示。,相應(yīng)的程序?yàn)椋?NAME BINARY_TO_ASCII DATA SEGMENT NUMDW 4F78H STRINGDB 16 DUP(?) DATAENDS STACKSEGMENT PARA STACK STACK DB 100 DUP(?),STACKENDS CODESEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK STARTPROC FAR BEGIN:

40、PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX,圖4-9 把二進(jìn)制位串的每一位轉(zhuǎn)換為ASCII的程序流程圖,MOV ES, AX LEA DI, STRING MOV CX, LENGTH STRING PUSH DI PUSH CX MOV AL, 30H ;使緩沖區(qū)全置為“0”,REP STOSP POP CX POP DI MOV AL, 31H MOV BX, NUM,AGAIN: RCL BX, L ;左移BX,把相應(yīng)位進(jìn)入C標(biāo)志 JNC NEXT ;若為零則轉(zhuǎn)至NEXT MOV DI, AL ;若為“1”,則把“1”置入緩沖區(qū) N

41、EXT:INC DI,LOOP AGAIN RET STARTENDP CODEENDS END BEGIN,4.5.6 有關(guān)I/O的DOS功能調(diào)用,1在CRT上連續(xù)輸出字符09 MOVDL, OUTPUT_CHAR MOVAH, 2 INT 21H,圖4-10 在CRT上輸出09的程序流程圖,相應(yīng)的程序?yàn)椋?NAME OUTPUT_CHAR_0_9 STACK SEGMENT PARA STACK STACK DB 100 DUP(?) STACKENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK,START PROC FAR BEGIN:PUSH DS M

42、OV AX, 0 PUSH AX MOV BL, 0 PUSH BX GOON:MOV D1, 20H;把空格字符DL MOV AH, 2,INT 21H ;輸出空格字符 POP BX MOV AL, BL INC AL DAA ;增量后進(jìn)行十進(jìn)制調(diào)整,AND AL, 0FH MOV BL, AL PUSH BX OR AL, 30H;轉(zhuǎn)換為ASCII碼 MOV D1, AL MOV AH, 2 INT 21H;輸出一個(gè)09之間的字符,MOV CX, 0FFFFH;為便于觀察,插入一定的延時(shí) AGAIN:DEC CX JNE AGAIN JMP GOON START ENDP CODE END

43、S END BEGIN,2在CRT上連續(xù)顯示0059,相應(yīng)的程序?yàn)椋?NAME OUTPUT_CHAR_00_59 STACKSEGMENT PARA STACK STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT BUFFERDB 3 DUP(?),DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START PROC FAR BEGIN:PUSH DS MOV AX, 0,PUSH AX MOV AX, DATA MOV DS, AX MOV CX, 1000 ;設(shè)置最大的循環(huán)次數(shù) MOV

44、BL, 0 LEA SI, BUFFER PUSH BX,GOON:MOV D1, 0DH MOV AH, 2;輸出回車符 INT 21H MOV D1, 0AH MOV AH, 2;輸出換行符,INT 21H POP BX MOV AL, BL INC AL DAA CMP AL, 60H;AL增加到60了嗎? JC NEXT;未達(dá)到,轉(zhuǎn)去顯示 MOV AL, 0;到60,置為0,NEXT:MOV BL, AL PUSH BX MOV D1, AL PUSH CX MOV CL, 4 SHR AL, CL,OR AL, 30H ;把AL中十位數(shù),轉(zhuǎn)換為ASCII MOV SI, AL INC

45、 SI MOV AL, DL AND AL, 0FH OR AL, 30H;把AL中的個(gè)位數(shù),轉(zhuǎn)換為ASCII,MOV SI, AL INC SI MOV AL, $ MOV SI, AL MOV DX, OFFSET BUFFER MOV AH, 9 INT 21H ;輸出字符串 MOV CX, 0FFFFH,AGAIN:DEC CX JNE AGAIN POP CX DEC CX JE DONE MOV SI, OFFSET BUFFER JMP GOON,DONE:RET START ENDP CODE ENDS END BEGIN,圖4-11 在CRT上連續(xù)顯示0059的程序,4.5.

46、7 宏匯編與條件匯編,1宏指令的用途 (1)在匯編語言的源程序中,若有的程序段要多次使用,為了使在源程序中不重復(fù)書寫這個(gè)程序段,可以用一條宏指令來代替。由宏匯編程序在匯編時(shí)產(chǎn)生所需要的代碼。,MOVCL, 4 SALAL, CL 若要多次使用,就可以用一條宏指令代替。如下所示: SHFT MACRO MOVCL, 4 SAL AL, CL ENDM,(2)宏定義不但能使源程序的書寫簡潔,而且由于宏指令具有接收參量的能力,所以功能就更靈活。,SHIFT MACRO X MOV CL, X SAL AL, CL ENDM,SHIFT MACRO X, Y MOV CL, X SAL Y, CL ENDM,SHIFT 4, AL SHIFT 4, BX SHIFT 6, DI,這些宏指令在匯編時(shí),分別產(chǎn)生以下指令的目標(biāo)代碼: MOVCL, 4 SAL AL, CL MOVCL, 4 SAL BX, CL MOVCL, 6 SAL DI, CL,(3)形式參量不只可以出現(xiàn)在操作數(shù)部分,也可以出現(xiàn)在操作碼部分。如: SHIFT MACRO X, Y, Z MOV CL, X S&Z Y, CL ENDM,若有以下調(diào)用: SHIFT 4, AL, AL SHIFT 6, BX, AR SHIFT 8, SI, HR,在匯編時(shí),分別產(chǎn)生以下指令的目標(biāo)代碼。 MOV CL, 4 SA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論