【正文】
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 CALL BCD_BIN NOP NOP BCD_BIN PROC NEAR PUSHF PUSH AX PUSH BX PUSH CX MOV AL, BCD_IN MOV BL, AL AND BL, 0FH AND AL, 0F0H MOV CL, 04 ROR AL, CL MOV BH, 0AH MUL BH ADD AL, BL MOV BIN_VALUE, AL POP CX POP BX POP AX POPF RET BCD_BIN ENDP CODE ENDS END START ( b)用有名存儲單元傳遞參數(shù)的實例 3. 用指針傳遞參數(shù) 指針方法可以傳遞指向數(shù)據(jù)存放在任何存儲單元的過程指針,也能傳遞指向零散值或指向數(shù)組或串的指針,因而這種方法具有更大的靈活性。 } DATA SEGMENT headcount DW 5 present DW OFFSET headcount DATA SEGMENT CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV BX, present MOV AX, [BX] … CODE ENDS END START 4. 用棧傳遞參數(shù) 為了用棧傳遞參數(shù)到一過程,在主程序中的過程調用之前,應把這些參數(shù)壓進棧的某個地方,然后過程中的指令按需從棧中讀取參數(shù)。 void main( ) { get_temp ( tempc )。 } int c2f ( int c ) { int f。 scanf (“ %d ” ,ptr )。 對于多用戶程序中的過程,從高級語言中調用的過程或過程調用自身,應該在棧中傳遞參數(shù)。 DOS 系統(tǒng)功能調用和 BIOS 的服務子程序,使得程序設計人員不必涉及硬件就可以使用系統(tǒng)的硬件,尤其是 I / O 的使用與管理 。 常用系統(tǒng)功能調用和 BIOS中斷調用 微型計算機系統(tǒng)( IBM PC 及兼容機)為匯編用戶提供了兩個程序接口,一個是 DOS 系統(tǒng)功能調用,另一個是 ROM中的 BIOS (Basic Input/Output System)。選擇哪種方法很大程度上依賴于特定程序,沒有標準規(guī)則,不過有幾條建議。 return(f)。 printf ( “ The temperature in Celsius is %d \n” , temp )。 S e g m e n t r e g i s t e r : C S D S E S S SO f f s e t r e g i s t e r ( s ) : I P S I , D I , B X S I , D I , B X S P , B PO f f s e t R e g i s t e r s f o r V a r i o u s S e g m e n t s 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 AL, BCD_IN PUSH AX CALL BCD_BIN POP AX MOV BIN_VAL, AL NOP BCD_BIN PROC NEAR PUSHF PUSH AX PUSH BX PUSH CX PUSH BP MOV BP, SP MOV AX, [BP+12] B P HC LC HB LB HA LA HF LF HI P LI P HA H. . .S S * 1 0 H = 7 0 0 0 0 HB P 壓 棧 后 0 0 4 2 HA X 壓 棧 后 0 0 4 E HA X 壓 棧 前 0 0 5 0 HB P LA L棧 狀 態(tài) 圖 MOV BL, AL AND BL, 0FH AND AL, 0F0H MOV CL, 04 ROR AL, CL MOV BH, 0AH MUL BH ADD AL, BL MOV [BP+12], AL ; BP缺省段為 SS POP BP POP CX POP BX POP AX POPF RET BCD_BIN ENDP CODE ENDS END START ( d)用棧傳遞參數(shù)實例 include int tempc, tempf int c2f(int c)。 int *present=headcount。這些在主程序和過程之間來回傳遞的數(shù)據(jù)值或地址通常被稱為參數(shù)( parameters)。this program finds the product of two externally defined words and 。call subprog2 to mul value1*value2 MOV AH, 4CH INT 21H MAIN ENDP END MAIN 。 .STACK 64 。read in ASCII code CODE ENDS END 例 2: 1)問題定義 要求把通貨膨脹因子 03H加入到具有 8個元素價格數(shù)組的每個價格中,而其中每一個價格是以壓縮式 BCD(每個字節(jié)中有兩個 BCD數(shù))形式存放在一個字節(jié)存儲單元中,價格的范圍在 1到 99分之間。read keyboard strobe AND AL, 01 。point DX at strobe port 5)選擇指令 IN Jcc IN 6)編寫程序 。當經過一段時間數(shù)據(jù)已駐留在這些數(shù)據(jù)線上后,鍵盤中的電路發(fā)出一個壓鍵選通信號,以指示 8位數(shù)據(jù)線上的數(shù)據(jù)已經有效。這個數(shù)據(jù)準備信號通常被稱為選通。temp again HEATER_OFF: MOV AL, 00H 。else load code for heater on MOV DX, 0FFFAH 。point at input port IN AL, DX 。 ports: uses FFF8H for temperature data input 。當然如果溶液的溫度因過度加熱而足夠高時,則不需要打開加熱器。 2. 算法設計: 3. 輸入溫度值 4. IF 溫度 300C THEN 5. 打開黃燈 6. ELSE IF 溫度 400C THEN 7. 打開綠燈 8. ELSE 打開紅燈 9. 讀傳感器 T 3 0 ?打 開 黃 燈T 4 0 ?打 開 紅 燈打 開 綠 燈YNYN讀 溫 度 值讀 傳 感 器 CODE SEGMENT ASSUME CS:CODE MOV DX, 0FFFEH MOV AL, 99H OUT DX, AL MOV DX, 0FFF8H IN AL, DX MOV DX, 0FFFAH CMP AL, 30 JB YELLOW CMP AL, 40 JB GREEN RED: MOV AL, 04H OUT DX, AL JMP EXIT YELLOW: MOV AL, 01H OUT DX, AL JMP EXIT GREEN: MOV AL, 02H OUT DX, AL EXIT: MOV DX, 0FFFCH IN AL, DX CODE ENDS END C O N D I T I O N?S T A T E M E N T ( S )YNW H I L E D O L O O P 流 程 圖3. 循環(huán)結構 WHILE – DO LOOP WHILE condition DO statement (s) WHILE not 24 samples DO Read data sample from sensor Add correction factor of + 7 Store result in memory Wait 1 hour. 例 1: 1. 定義問題 2. 假設在一個化學處理控制過程中,只有當溶液溫度上升到 1000C后,才能繼續(xù)進行下一步的處理。read ph sensor CODE ENDS END 輸 入 溫度 值T 〉 = 3 0 C ?打 開 黃 燈打 開 綠 燈AYN讀 傳 感 器輸入溫度值 IF 溫度〉 =300C THEN 打開綠燈 ELSE 打開黃燈 讀傳感器 CMP AL, 30 JAE GREEN JMP YELLOW GREEN: MOV AL, 02H MOV DX, 0FFFAH OUT DX, AL JMP EXIT YELLOW: MOV AL, 01H MOV DX, 0FFFAH OUT DX, AL EXIT: MOV DX, 0FFFCH IN AL, DX CODE ENDS END 2. 多重 IFTHENELSE結構: IF condition THEN statement(s)1 ELSE IF condition THEN statement(s)2 ELSE statement(s)3 M O N D A Y ?M A K E C E L E R YS O U PT U E S D A Y ?S U N D A Y ?M A K EM U S H R O O MS O U PM A K EM I N E S T R O N ES O U PYNYNY 1. 問題定義: 2. 有一臺控制印刷線路板制造機器的 8086微機。point DX at output port OUT DX, AL 。if temp30 then light yellow 。initialize 8086 port FFFAH