语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构
學(xué)習(xí)一門語(yǔ)言,我們首先學(xué)其基本的數(shù)據(jù)類型和邏輯表達(dá)式的一些基本語(yǔ)句。為了使程序具有更加良好的運(yùn)行效率,我們還需要學(xué)習(xí)它的一些設(shè)計(jì)結(jié)構(gòu)。這一篇我們將以此為大家講解一些常見(jiàn)的程序結(jié)構(gòu),以及其在匯編語(yǔ)言中的設(shè)計(jì)方法。
一個(gè)好的程序應(yīng)滿足以下幾個(gè)要求:
常見(jiàn)程序結(jié)構(gòu):
- 順序結(jié)構(gòu)
- 分支結(jié)構(gòu)
- 循環(huán)結(jié)構(gòu)
- 子程序結(jié)構(gòu)
一、順序結(jié)構(gòu)
按照程序的書寫順序執(zhí)行,這樣的程序結(jié)構(gòu)就叫做順序結(jié)構(gòu)。
例:設(shè)變量X、Y均為16位無(wú)符號(hào)數(shù),試寫一個(gè)求表達(dá)式2X + Y值的程序:
DSEG SEGMENT X DW 34H ; 表示將十六進(jìn)制數(shù) 34H 存放到 X 中Y DW 56HZ DW ?,? ; ?表示為空,也可以不寫 DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG , DS: DSEG START: MOV AX, DSEG MOV DS, AX ; 讓DS指向自己定義的數(shù)據(jù)段MY_D SEGMENT XOR DX , DX MOV AX , XADD AX , AX ADC DX , 0 ; ADC能夠把進(jìn)位加到DADD AX , Y ADC DX,0 MOV Z , AX MOV Z+2 , DX MOV AH , 4CH ; 因?yàn)槌绦蚨紙?zhí)行完成要返回dos,要將中斷號(hào)4ch送AH INT 21H ; 調(diào)用dos中斷21h,中斷調(diào)用號(hào)為AH( 即4ch),返回dos CSEG ENDSEND START匯編語(yǔ)言中的AX、BX、CX、DX作為CPU內(nèi)部的通用寄存器中的數(shù)據(jù)寄存器助記專符用來(lái)存放參與運(yùn)算的數(shù)據(jù)或是存儲(chǔ)運(yùn)算的結(jié)果。這四個(gè)數(shù)據(jù)寄存器都是16位的,實(shí)際由兩個(gè)8位寄存器組合而成,這是為了靈活處理8位數(shù)據(jù)。二、分支結(jié)構(gòu)
順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問(wèn)題,但不能做判斷再選擇。對(duì)于要先做判斷再選擇的問(wèn)題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ(yǔ)句。
例:判斷MEMS單元的數(shù)據(jù),若數(shù)據(jù)>0,結(jié)果為1;若數(shù)據(jù)<0,結(jié)果為-1;若數(shù)據(jù)=0,結(jié)果為0;將結(jié)果存入MEMD單元:
MY_D SEGMENT MEMS DB 08H MEMD DB ? MY_D ENDS MY_C SEGMENT ASSUME DS:MY_D , CS:MY_C START: MOV AX , MY_D ; 獲取數(shù)據(jù)段的段地址 MOV DS, AX MOV AL, MEMS ; 將待比較元素放入AL中 CMP AL, 0 JGE NEXT ; 有符號(hào)數(shù)如果>=0,則轉(zhuǎn)向next MOV AL, -1 ; 如果不滿足 >=0, 則順序執(zhí)行,給AL賦值-1 JMP DONE ; 無(wú)條件跳轉(zhuǎn)指令 NEXT: JE DONE je ; 表示等于就跳轉(zhuǎn) MOV AL, 1 ; 如果不等于的話則賦值為1 DONE: MOV MEMD, AL MOV AX , 4C00H INT 21H MY_C ENDS END START三、循環(huán)結(jié)構(gòu)
在程序設(shè)計(jì)中遇到需要按照一定的規(guī)律或條件,多次重復(fù)執(zhí)行一組指令的情況時(shí),可以用循環(huán)程序?qū)崿F(xiàn)。循環(huán)結(jié)構(gòu)一般根據(jù)某一條件判斷為真或?yàn)榧賮?lái)確定是否重復(fù)執(zhí)行循環(huán)體,條件永真或無(wú)條件的循環(huán)就是邏輯上的死循環(huán)。
循環(huán)程序通常由三部分組成:
- 循環(huán)初始化
- 循環(huán)體
- 循環(huán)控制部分
例:計(jì)算1~100的數(shù)字之和,并將結(jié)果存入變量SUM中:
DATA SEGMENTSUM DW ? ; 用于存儲(chǔ)計(jì)算結(jié)果 DATA ENDS CODE SEGMENTASSUME CS:CODE , DS:DATA START: MOV AX , DATAMOV DS , AX XOR AX , AX ; 將AX清零,將CF標(biāo)志位也清零MOV CX , 100 AGAIN: ADD AX , CXLOOP AGAIN ; 執(zhí)行LOOP指令時(shí),CPU自動(dòng)將CX的值減1,若CX=0,則結(jié)束循環(huán);MOV SUM , AX MOV AH, 4CH INT 21H CODE ENDS END START四、子程序結(jié)構(gòu)
為了簡(jiǎn)化編程,常把功能相對(duì)獨(dú)立的程序段單獨(dú)編寫和調(diào)試,作為一個(gè)相對(duì)獨(dú)立的模塊供程序使用,這就是子程序。子程序的調(diào)用過(guò)程是通過(guò)CALL指令實(shí)現(xiàn)的,子程序的返回則通過(guò)RET指令完成。為了使子程序結(jié)構(gòu)清晰,可以使用過(guò)程定義偽指令PROC和ENDP來(lái)定義子程序。
例:編寫子程序?qū)⒓拇嫫鰽X內(nèi)容乘10,結(jié)果仍存在AX中:
主程序: X EQU 1000 CODE SEGMENTASSUME CS:CODE START: MOV AX, X CALL MUL10 MOV AX, 4C00HINT 21H MUL10 PROC PUSHF PUSH BX ADD AX, AX MOV BX, AX ADD AX, AX ADD AX, AX ADD AX, BX POP BX ; 彈出堆棧,恢復(fù)現(xiàn)場(chǎng) POPF RET MUL10 ENDP CODE ENDS END START總結(jié)
以上是生活随笔為你收集整理的语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 合并报表编制采用的理论_合并报表是否恢复
- 下一篇: 开发流媒体服务器_Github选出10大