【正文】
1 62 93 65 52 74 23 84 12 9A R R A Y SD SC O S T 數(shù) 組 的 開始 位 置P R I C E S 數(shù) 組 的開 始 位 移 量P R I C E S 數(shù) 組 的開 始 位 置B X = 預(yù) 期 P R I C E S數(shù) 組 元 素 的 偏 置R A MARRAYS SEGMENT COST DB 20H, 28H, 15H, 26H, 19H, 27H, 16H, 29H PRICE DB 36H, 55H, 27H, 42H, 38H, 41H, 29H, 39H ARRAYS ENDS 4)初始化表 MOV AX, ARRAYS MOV DS, AX 3)數(shù)據(jù)結(jié)構(gòu) 5)選擇指令: MOV ADD DAA Jcc 6)編寫程序: ARRAYS SEGMENT COST DB 20H, 28H, 15H, 26H, 19H, 27H, 16H, 29H PRICE DB 36H, 55H, 27H, 42H, 38H, 41H, 29H, 39H ARRAYS ENDS CODE SEGMENT ASSUME CS: CODE, DS: ARRAYS START: MOV AX, ARRAYS MOV DS, AX LEA BX, PRICES MOV CX, 0008H DO_NEXT: MOV AL, [BX] ADD AL, 03H DAA MOV [BX], AL INC BX DEC CX JNZ DO_NEXT CODE ENDS END START 4. 子程序設(shè)計(jì): (1)模塊化的程序設(shè)計(jì) 主 模 塊模 塊 1 模 塊 2 模 塊 N 。this program finds the sum of two externally defined words and stores 。 傳遞參數(shù)的四種主要途徑是: 1 在寄存器中 2 在用名字存取的存儲器中 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 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 1. 用寄存器傳遞參數(shù)實(shí)例: 2. 問題定義: 3. 要求將壓縮的 BCD數(shù) 17轉(zhuǎn)換成等價(jià)的二進(jìn)制數(shù)。 void get_temp(int *ptr)。 } Void get_temp(int *ptr ) { printf ( “ Please enter the Celsius temperature. /n” )。 系統(tǒng)功能調(diào)用和 BIOS 由一系列的中斷服務(wù)子程序構(gòu)成,但調(diào)用與返回不是使用子程序調(diào)用指令 CALL 和返回指令 RET, 而是通過軟中斷指令 INT n 和中斷返回指令 IRET 調(diào)用和返回的。對于少量參數(shù)傳遞的簡單程序,使用寄存器通常是最容易的方法,對于向 /從過程傳遞數(shù)組或其他數(shù)據(jù)結(jié)構(gòu),則用寄存器傳遞指向這些數(shù)據(jù)結(jié)構(gòu)開始地址的指針,如前面已解釋過的,傳遞指針到過程比過程用名字直接存取數(shù)據(jù)結(jié)構(gòu)要靈活的多。 printf ( “ The temperature in Fahrenheit is %d \n” , temp )。 printf (“ headcount= %d \n headcount= %d \n present= %d \n *present= %d \n present= %d \n” ,headcount, headcount, present, *present, present )。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 (2) 調(diào)用過程 近過程的調(diào)用 1)運(yùn)行機(jī)制 2)數(shù)據(jù)保存 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 例題: : 假設(shè)從一壓力傳感器讀取 100個(gè)數(shù)據(jù) 字 的程序,要求每隔 1ms從傳感器讀取 一個(gè)數(shù)據(jù)字,然后屏蔽每個(gè)字的高4位并把結(jié)果放在一個(gè) 數(shù)組 中。 .DATA VALUE1 DW 2050 VALUE2 DW 500 SUM DW 2 DUP(?) PRODUCT DW 2 DUP(?) 。mask extra bits and set flags JZ LOOK 。選通信號可以是有效高信號或有效低信號。load code for heater off MOV DX, 0FFFAH 。input temperaure data CMP AL, 100 。 2. 算法設(shè)計(jì) (a) 輸入溫度值 WHILE 溫度 =100 DO 關(guān)閉加熱器 打開加熱器 T = 1 0 0 ?打 開 加 熱 器YN輸 入 溫 度 值開 始A關(guān) 閉 加 熱 器 3. 數(shù)據(jù)結(jié)構(gòu) AL ( IN AL, DX ) 4. 初始化表 MOV DX, 0FFFEH 。其作用是檢查溫度傳感器,然后按照從傳感器讀到的溫度值打開綠燈、黃燈或紅燈。lamp JMP GREEN 。to initialize ports 5. 選擇指令: IN OUT CMP Jcc 6. 編寫程序: 。 MOV AX, WORD PTR VAL_ASC AND AX, 0F0FH XCHG AH, AL MOV CL, 4 ROL AH, CL OR AL, AH MOV VAL_BCD, AL 。 2. 算法設(shè)計(jì): 轉(zhuǎn)換第一個(gè) ASCII碼到非壓縮 BCD數(shù)。 ( 4)按照主要指令的要求,用 MOV指令或其他的指令把數(shù)據(jù)送到正確的位置。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)用其他模塊的過程中,必須用偽指令 EXTRN告訴匯編程序 EXTRN后的過程或變量不在此模塊中。 .STACK 64 。 圖 匯編程序的功能示意圖 用 匯 編 語 言編 寫的 源程 序匯 編程 序 目 標(biāo) 程 序 匯編程序是最早也是最成熟的一種系統(tǒng)軟件。例如,實(shí)時(shí)的數(shù)據(jù)采集、檢測和在線的實(shí)時(shí)控制等,往往要求程序的目標(biāo)代碼盡可能少占內(nèi)存并有盡可能快的執(zhí)行速度,在這些場合下,使用高級語言編寫的程序常常不能滿足要求。 它的缺點(diǎn)是不直觀 , 不易理解和記憶 , 因此編寫 、 閱讀和修改機(jī)器語言程序都比較繁瑣 。 3. 掌握子程序與堆棧技術(shù)。但是,這種用高級語言編寫的源程序并不能在機(jī)器上直接執(zhí)行,需要被翻譯成對應(yīng)的目標(biāo)程序 (即機(jī)器語言程序 ),機(jī)器才能運(yùn)行。當(dāng)然,由于源程序和所要解決的問題的數(shù)學(xué)模型之間的關(guān)系不夠直觀,使得匯編語言程序設(shè)計(jì)需要較多的軟件開發(fā)時(shí)間,也增加了程序設(shè)計(jì)過程中出錯(cuò)的可能性。 匯編,鏈接和運(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 庫 存 更 新輸 入 銷 售記 錄部 分 庫 存更 新輸 出 結(jié) 果打 印 總 庫存打 印 各 部門 庫 存打 印 訂 貨清 單 。this program finds the sum of two externally defined words and stores 。 用來表示程序設(shè)計(jì)問題的操作序列成為算法,即“怎樣做?”。查指令表并閱讀細(xì)節(jié) ADC dest, source 。 AND dest, source ASCII 4 0011 0100 屏蔽 0000 1111 結(jié)果 0000 0100 2)用循環(huán)位移指令左移四位。 2. 算法設(shè)計(jì): 3. 輸入溫度值 4. IF 溫度 300C THEN 5. 打開黃燈 6. ELSE 7. 打開綠燈 8. 讀傳感器 輸 入 溫度 值T 3 0 C ?打 開 黃 燈打 開 綠 燈AY N讀 傳 感 器 3. 數(shù)據(jù)結(jié)構(gòu): AL ( IN AL, DX ) 4. 初始化表: MOV DX, 0FFFEH 。register and load control word OUT DX, AL 。go to next mainline instruction GREEN: MOV AL, 02H MOV DX, 0FFFAH OUT DX, AL EXIT: MOV DX, 0FFFCH 。