【正文】
。 但機(jī)器語言程序是計(jì)算機(jī)惟一能夠直接理解和執(zhí)行的程序 , 具有執(zhí)行速度快 、 占用內(nèi)存少等特點(diǎn) 。但是,這種用高級語言編寫的源程序并不能在機(jī)器上直接執(zhí)行,需要被翻譯成對應(yīng)的目標(biāo)程序 (即機(jī)器語言程序 ),機(jī)器才能運(yùn)行。 用 高級 語 言編 寫的 源 程序編 譯或 解 釋 程 序 目 標(biāo)程 序 3.匯編語言 (Assembly Language) 匯編語言是一種采用助記符表示的程序設(shè)計(jì)語言,即用助記符來表示指令的操作碼和操作數(shù),用標(biāo)號或符號代表地址、常量或變量。當(dāng)然,由于源程序和所要解決的問題的數(shù)學(xué)模型之間的關(guān)系不夠直觀,使得匯編語言程序設(shè)計(jì)需要較多的軟件開發(fā)時間,也增加了程序設(shè)計(jì)過程中出錯的可能性。它除了能夠?qū)R編語言源程序翻譯成機(jī)器語言程序這一主要功能外,還能夠根據(jù)用戶的要求自動分配存儲區(qū)域 (包括程序區(qū)、數(shù)據(jù)區(qū)、暫存區(qū)等 );自動地把各種進(jìn)位制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),把字符轉(zhuǎn)換成 ASCII碼,計(jì)算表達(dá)式的值等;自動對源程序進(jìn)行檢查,給出錯誤信息 (如非法格式,未定義的助記符、標(biāo)號,漏掉操作數(shù)等 )等。 匯編,鏈接和運(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é) 果打 印 總 庫存打 印 各 部門 庫 存打 印 訂 貨清 單 。 .DATA VALUE1 DW 2050 VALUE2 DW 500 SUM DW 2 DUP(?) PRODUCT DW 2 DUP(?) 。this program finds the sum of two externally defined words and stores 。 在說明變量或過程的模塊中,必須用偽指令PUBLIC告訴鏈接程序此變量或過程能被其他模塊所訪問。 用來表示程序設(shè)計(jì)問題的操作序列成為算法,即“怎樣做?”。 例題: : 已知某日的最高溫度和最低溫度,要求計(jì)算這一天的平均溫度。查指令表并閱讀細(xì)節(jié) ADC dest, source 。 轉(zhuǎn)換第二個 ASCII碼到非壓縮 BCD數(shù)。 AND dest, source ASCII 4 0011 0100 屏蔽 0000 1111 結(jié)果 0000 0100 2)用循環(huán)位移指令左移四位。 I F t e m p e r a t u r e l e s s t h a n 7 0 d e g r e e sT H E N t u r n o n h e a t e rE L S E t u r n o f f h e a t e rC O N D I T I O N?S T A T E M E N T ( S ) 2S T A T E M E N T ( S ) 1Y NI F T H E N E L S E 流 程 圖I F C O N D I T I O N T H E N S T A T E M E N T ( S ) 1E L S E S T A T E M E N T ( S ) 2 偽 代 碼2. 分支結(jié)構(gòu) (IFTHENELSE) 1. 問題定義: 2. 有一臺控制印刷線路板制造機(jī)器的 8086微機(jī)。 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 。PORTS: Use FFF8Htemperature input 。register and load control word OUT DX, AL 。else light green lamp YELLOW: MOV AL, 01H 。go to next mainline instruction GREEN: MOV AL, 02H MOV DX, 0FFFAH OUT DX, AL EXIT: MOV DX, 0FFFCH 。如果溫度低于 300C,則打開黃燈以告訴操作員溶液的溫度不夠。如果溶液溫度等于或者高于 1000C,則繼續(xù)進(jìn)行下一步的處理。initialize port FFFAH for output MOV AL, 99H 。initialize port FFFAH for output MOV AL, 99H 。if temp =100 then JAE HEATER_OFF 。turn heater on JMP TEMP_IN 。point DX to output port OUT DX, AL 。下圖說明了這種鍵盤的并行數(shù)據(jù)線和選通線是怎樣與微機(jī)端口連接的。對于本例假設(shè)一個有效 ASCⅡ 碼已在并行數(shù)據(jù)線上時,選通信號趨向于高。FFF8HASCII data input port CODE SEGMENT ASSUME CS: CODE MOV DX, 0FFFAH 。if strobe is low then keep looking MOV DX, 0FFF8H 。one file will contain the main module: EXTRN SUBPROG1: FAR EXTRN SUBPROG2: FAR PUBLIC VALUE1,VALUE2,SUM,PRODUCT 。 .CODE MAIN PROC FAR MOV AX, DATA MOV DS, AX CALL SUBPROG1 。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 。 : 初始化 REPEAT 從端口(傳感器)讀入數(shù)據(jù) 屏蔽高半字節(jié) 存入數(shù)組中 等待 1ms過程 UNTIL 讀入 100個字節(jié) 算法設(shè)計(jì): 《采樣數(shù)據(jù)程序〉 初始化數(shù)據(jù)段寄存器, DS 初始化堆棧段寄存器, SS 初始化指向數(shù)組的指針, SI 初始化計(jì)數(shù)器, BX REPEAT 等待 1ms過程 讀端口 初始化計(jì)數(shù)器 CX 屏蔽高半字節(jié) REPEAT 存入數(shù)組中 減量 CX 等待 1ms過程 UNTIL CX=0 增量指針, SI 減量計(jì)數(shù)器, BX UNTIL BX=0 : IN AND CALL INC DEC Jcc : AL DW 100 DUP (?) : 初始化數(shù)據(jù)段寄存器, DS 初始化堆棧段寄存器, SS 初始化指向數(shù)組的指針, SI 初始化計(jì)數(shù)器, BX 初始化計(jì)數(shù)器, CX PRESSURE_PORT EQU 0FFF8H DATA SEGMENT PRESSURE DW 100 DUP (?) SAMPLE EQU (($PRESSURE)/2) DATA ENDS STACK SEGMENT DW 40 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 LEA SI, PRESSURE MOV BX, SAMPLE MOV DX, PRESSURE_PORT NEXT_VAL: IN AX, DX AND AX, 0FFFH MOV [SI], AX CALL WAIT_1MS INC SI INC SI DEC BX JNZ NEXT_VAL STOP: NOP WAIT_1MS PROC NEAR 。 4. 算法設(shè)計(jì): 5. 將 BCD數(shù) 17分裂成兩個半字節(jié) 6. 保存低半字節(jié)(不需乘 1) 7. 用 0AH乘高半字節(jié) 8. 將結(jié)果和低半字節(jié)相加 9. 例如: 4596=4*1000+5*100+9*10+6*1 10. 1000=03E8H 4000=4*03E8H=0FA0H 11. 100=0064H 500=5*0064H=01F4H 12. 10=000AH 90=9*000AH=005AH 13. 1=0001H 6=1*0001H=0006H 14. 4596 11F4H 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 AL, BCD_IN CALL BCD_BIN MOV BIN_VAL, AL NOP BCD_BIN PROC NEAR PUSHF PUSH BX PUSH CX MOV BL, AL AND BL, 0FH AND AL, 0F0H MOV CL, 04 ROR AL, CL MOV BH, 0AH MUL BH ADD AL, BL POP CX POP BX POPF RET BCD_BIN ENDP CODE ENDS END START ( a)用寄存器傳遞參數(shù)實(shí)例 2. 用一般存儲單元傳遞參數(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