【正文】
} 程序舉例:說(shuō)明、調(diào)用和定義 C函數(shù)模板 參數(shù)傳遞小結(jié): 在調(diào)用程序和過(guò)程之間可以用( 1)寄存器、( 2)指定存儲(chǔ)單元(用名字或指針存?。┗蛘撸?3)棧傳遞參數(shù)。 R A MF F F F F H0 0 0 0 0 HX X X X 0 HX X X X 0 HX X X X 0 HC o d e s e g m e n t6 4 kD a t as e g m e n t6 4 kS t a c ks e g m e n t6 4 kE x t r as e g m e n t6 4 k[ B X ][ S P ][ B X ]I PC P U[ S I ][ D I ][ B P ][ D I ][ S I ]A H A LB H B LC H C LD H D LB PS ID IS PF l a gI PC SD SS SE S* 1 0 H DATA SEGMENT BCD_IN DB 17H BIN_VAL DB ? DATA ENDS STACK SEGMENT DW 100 DUP (0) STACK ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SI, OFFSET BCD_IN MOV DI, OFFSET BIN_VAL CALL BCD_BIN NOP BCD_BIN PROC NEAR PUSHF PUSH AX PUSH BX PUSH CX MOV AL, [SI] MOV BL, AL AND BL, 0FH AND AL, 0F0H MOV CL, 04 ROR AL, CL MOV BH, 0AH MUL BH ADD AL, BL MOV [DI], AL POP CX POP BX POP AX POPF RET BCD_BIN ENDP ( c)用指向有名存儲(chǔ)單元 CODE ENDS 的指針傳遞參數(shù)實(shí)例 END START C語(yǔ)言程序: /* headcount=5 */ includestdio /* headcount=404 */ /* present=404 */ Void main ( ) /* *present=5 */ { /* present=406 */ int headcount=5。declare data here to be shared .MODEL SMALL 。當(dāng)在鍵盤(pán)上敲入某個(gè)鍵時(shí),鍵盤(pán)中的電路將檢測(cè)敲入的鍵,然后將該鍵的 ASCⅡ 碼發(fā)送到連接端口 FFF8H的 8位數(shù)據(jù)線上。and port FFF8H for input OUT DX, AL TEMP_IN: MOV DX, 0FFF8H 。next mainline instruction IN AL, DX 。point DX to port control MOV AL, 99H 。dest= dest+ source+ CF DIV source 。the sum in a location defined by the calling module EXTRN VALUE1: WORD EXTRN VALUE2: WORD EXTRN SUM: WORD PUBLIC SUBPROG1 .MODEL SMALL .CODE SUBPROG1 PROC FAR SUB BX, BX 。 用匯編語(yǔ)言編寫(xiě)的源程序也需要翻譯成目標(biāo)程序才能被機(jī)器執(zhí)行。 4. 了解宏匯編和宏指令的應(yīng)用。 由于高級(jí)語(yǔ)言程序是在未考慮機(jī)器的結(jié)構(gòu)特點(diǎn)的條件下編寫(xiě)的,因而它就不能充分利用某種具體 CPU所具有的某些特性,而通過(guò)編譯或解釋程序生成的目標(biāo)程序往往比較冗長(zhǎng), 占有較多的內(nèi)存空間,執(zhí)行時(shí)間也比較長(zhǎng),這就限制了它在某些場(chǎng)合下的運(yùn)用。declare data here to be shared .MODEL SMALL 。 初始化表 : 數(shù)據(jù)段寄存器 DS 堆棧段寄存器 SS 附加段寄存器 ES 堆棧段指針 SP 8255A可編程并行端口 8259A優(yōu)先級(jí)中斷控制器 8254可編程計(jì)數(shù)器 8251可編程串行端口 初始化數(shù)據(jù)變量 設(shè)置中斷允許標(biāo)志 ( 3)選擇實(shí)現(xiàn)算法中每一主要?jiǎng)幼魉枰闹噶?,并決定數(shù)據(jù)在這些指令中的存放形式。 ORG 0010H VAL_ASC DB ‘ 47’ VAL_BCD DB ? 。if temp30 then light yellow 。當(dāng)然如果溶液的溫度因過(guò)度加熱而足夠高時(shí),則不需要打開(kāi)加熱器。temp again HEATER_OFF: MOV AL, 00H 。read keyboard strobe AND AL, 01 。this program finds the product of two externally defined words and 。 printf ( “ The temperature in Celsius is %d \n” , temp )。 DOS 系統(tǒng)功能調(diào)用和 BIOS 的服務(wù)子程序,使得程序設(shè)計(jì)人員不必涉及硬件就可以使用系統(tǒng)的硬件,尤其是 I / O 的使用與管理 。 void main( ) { get_temp ( tempc )。the sum in a location defined by the calling module EXTRN VALUE1:WORD EXTRN VALUE2:WORD EXTRN SUM:WORD PUBLIC SUBPROG1 .MODEL SMALL .CODE SUBPROG1 PROC FAR SUB BX, BX 。FFF8HASCII data input port CODE SEGMENT ASSUME CS: CODE MOV DX, 0FFFAH 。turn heater on JMP TEMP_IN 。如果溶液溫度等于或者高于 1000C,則繼續(xù)進(jìn)行下一步的處理。register and load control word OUT DX, AL 。 AND dest, source ASCII 4 0011 0100 屏蔽 0000 1111 結(jié)果 0000 0100 2)用循環(huán)位移指令左移四位。 用來(lái)表示程序設(shè)計(jì)問(wèn)題的操作序列成為算法,即“怎樣做?”。 匯編,鏈接和運(yùn)行程序 E D I T O RP R O G R A MA S S E M B L E RP R O G R A ML I N K E RP R O G R A Mm y f i l e . e x em y f i l e . m a pm y f i l e . c r fm y f i l e . l s tm y f i l e . a s mO t h e r o b j f i l e sm y f i l e . o b j 模塊化的程序設(shè)計(jì) (從功能分析 ——戰(zhàn)略上看) 主 模 塊模 塊 1 模 塊 2 模 塊 N 庫(kù) 存 更 新輸 入 銷(xiāo) 售記 錄部 分 庫(kù) 存更 新輸 出 結(jié) 果打 印 總 庫(kù)存打 印 各 部門(mén) 庫(kù) 存打 印 訂 貨清 單 。但是,這種用高級(jí)語(yǔ)言編寫(xiě)的源程序并不能在機(jī)器上直接執(zhí)行,需要被翻譯成對(duì)應(yīng)的目標(biāo)程序 (即機(jī)器語(yǔ)言程序 ),機(jī)器才能運(yùn)行。 它的缺點(diǎn)是不直觀 , 不易理解和記憶 , 因此編寫(xiě) 、 閱讀和修改機(jī)器語(yǔ)言程序都比較繁瑣 。 圖 匯編程序的功能示意圖 用 匯 編 語(yǔ) 言編 寫(xiě)的 源程 序匯 編程 序 目 標(biāo) 程 序 匯編程序是最早也是最成熟的一種系統(tǒng)軟件。this program finds the product of two externally defined words and stores the product in a location defined by the calling module EXTRN VALUE1: WORD EXTRN VALUE2: WORD EXTRN PRODUCT: WORD PUBLIC SUBPROG2 .MODEL SMALL .CODE SUBPROG2 PROC FAR MOV AX, VALUE1 MOV CX, VALUE2 MUL AX, CX MOV PRODUCT, AX MOV PRODUCT+2, DX RET SUBPROG2 ENDP END 注意: 在調(diào)用其他模塊的過(guò)程中,必須用偽指令 EXTRN告訴匯編程序 EXTRN后的過(guò)程或變量不在此模塊中。 2. 算法設(shè)計(jì): 轉(zhuǎn)換第一個(gè) ASCII碼到非壓縮 BCD數(shù)。to initialize ports 5. 選擇指令: IN OUT CMP Jcc 6. 編寫(xiě)程序: 。其作用是檢查溫度傳感器,然后按照從傳感器讀到的溫度值打開(kāi)綠燈、黃燈或紅燈。input temperaure data CMP AL, 100 。選通信號(hào)可以是有效高信號(hào)或有效低信號(hào)。 .DATA VALUE1 DW 2050 VALUE2 DW 500 SUM DW 2 DUP(?) PRODUCT DW 2 DUP(?) 。 printf (“ headcount= %d \n headcount= %d \n present= %d \n *present= %d \n present= %d \n” ,headcount, headcount, present, *present, present )。對(duì)于少量參數(shù)傳遞的簡(jiǎn)單程序,使用寄存器通常是最容易的方法,對(duì)于向 /從過(guò)程傳遞數(shù)組或其他數(shù)據(jù)結(jié)構(gòu),則用寄存器傳遞指向這些數(shù)據(jù)結(jié)構(gòu)開(kāi)始地址的指針,如前面已解釋過(guò)的,傳遞指針到過(guò)程比過(guò)程用名字直接存取數(shù)據(jù)結(jié)構(gòu)要靈活的多。 } Void get_temp(int *ptr ) { printf ( “ Please enter the Celsius temperature. /n” )。 傳遞參數(shù)的四種主要途徑是: 1 在寄存器中 2 在用名字存取的存儲(chǔ)器中 3 用指針 4 用堆棧 R A MF F F F F H0 0 0 0 0 HX X X X 0 HX X X X 0 HX X X X 0 HC o d e s e g m e n t6 4 kD a t as e g m e n t6 4 kS t a c ks e g m e n t6 4 kE x t r as e g m e n t6 4 k[ B X ][ S P ][ B