1. 程式人生 > >介面技術實驗四、加減運算實驗

介面技術實驗四、加減運算實驗

一、實驗目的
1.學習並掌握資料傳送指令和算術運算指令的用法。
2.熟悉在PC機上建立、彙編、連結和執行8086組合語言程式的過程。
二、實驗內容
將兩個多位十進位制數相加,並在螢幕上顯示加數、被加數以及和。己知被加數和加數均以ASCII碼形式存放在DATA1和DATA2為首的單元中(低位位於低地址),結果送回DATAl處。
如:
DATA1 DB ‘2’,‘1’,‘4’,‘3’ ;兩個兩位十進位制被加數以ASCII碼儲存
DATA2 DB ‘6’,‘5’,‘8’,‘7’ ;兩個兩位十進位制加數以ASCII碼儲存
結果在螢幕上打印出:
12+56=68
34+78=112
結果為
三、程式設計提示
1.因被加數和加數均以ASCII碼形式存放,所以在相加前必須轉化為BCD碼,此時用未組合BCD碼最適宜。未組合BCD碼相加要用到AAA加法調整指令。
2.顯示資料可用2號DOS功能呼叫。
3.程式流程圖如圖所示。
在這裡插入圖片描述

先講一下我的思路,其實是後來想的,感覺還行,就是程式碼多一些,150多行,當然也可以用迴圈縮短一丟丟把。

是這樣的
在這裡插入圖片描述
當然不能少了進位比如實驗中的34+78=112,我弄了一個跳轉,一旦出現第三位,用JNZ不跳轉輸出‘1’再輸出後兩位的結果‘12’

DATAS SEGMENT
    ;此處輸入資料段程式碼  
    DATA1 DB '2','1','4','3' 
    DATA2 DB '6','5','8','7'
DATAS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV CX,0002H
    LEA SI,DATA1
    MOV SI,OFFSET DATA1
    LEA DI,DATA2
    MOV DI,OFFSET DATA2
    ;第一行開始
    MOV AX,[SI+1]   ;取1
    MOV AH,02H    ;輸出1
	MOV DL,AL
	INT 21H
	MOV AX,[SI]   ;取2
	MOV AH,02H    ;輸出2
	MOV DL,AL
	INT 21H
    
    MOV AH,02H    ;第一個'+'
	MOV DL,'+'
	INT 21H
	
	MOV AX,[DI+1]   ;取5
    MOV AH,02H    ;輸出5
	MOV DL,AL
	INT 21H
	MOV AX,[DI]   ;取6
    MOV AH,02H    ;輸出6
	MOV DL,AL
	INT 21H
    
    MOV AH,02H    ;第一個'='
	MOV DL,'='
	INT 21H
    
    MOV AX,[SI]   ;取2
    SUB AX,30H
	MOV BX,[DI]   ;取6
	SUB BX,30H
	ADD AL,BL
	AAA
	ADD AX,30H
	MOV [SI],AX  ;將結果'6'存在DATA1[0]
	
	MOV AX,[SI+1]   ;取1
    SUB AX,30H
	MOV BX,[DI+1]   ;取5
	SUB BX,30H
	ADD AL,BL
	AAA
	JNC NC0        ;判斷是否進位,若沒進位就跳轉NC0處
	ADD AX,30H
	MOV [SI+1],AX   ;將結果'8'存在DATA1[1]
 	MOV AH,02H
 	MOV DL,'1'      ;用來輸出第三位,沒有進位就不輸出,當然前面已經跳轉了
 	INT 21H
 	MOV AH,02H
 	MOV DL,[SI+1] ;先輸出6
	INT 21H
	MOV DL,[SI]   ;後輸出8
	INT 21H
	JMP L       ;有的進位的情況,第一行輸出完
 NC0:
  	ADD AX,30H
	MOV [SI+1],AX
    MOV AH,02H
	MOV DL,[SI+1]
	INT 21H
	MOV DL,[SI]
	INT 21H
	JMP L     ;沒進位的情況,第一行輸出完
;注意第二個同樣道理,只是最後跳轉到結束程式,應該沒人會注意吧	
  L:INC SI   ;SI,DI分別自增兩次
	INC DI
	LOOP L
	;第一行結束
	
	MOV AH,02H
	MOV DL,0DH ;回車
	INT 21H
	MOV AH,02H
	MOV DL,0AH ;換行
	INT 21H
	
	;第二行開始
    MOV AX,[SI+1]   ;取3
    MOV AH,02H    ;輸出3
	MOV DL,AL
	INT 21H
	MOV AX,[SI]   ;取4
	MOV AH,02H    ;輸出4
	MOV DL,AL
	INT 21H
    
    MOV AH,02H    ;第二個'+'
	MOV DL,'+'
	INT 21H
	
	MOV AX,[DI+1]   ;取7
    MOV AH,02H    ;輸出7
	MOV DL,AL
	INT 21H
	MOV AX,[DI]   ;取8
    MOV AH,02H    ;輸出8
	MOV DL,AL
	INT 21H
    
    MOV AH,02H    ;第二個'='
	MOV DL,'='
	INT 21H
    
    MOV AX,[SI]   ;取4
    SUB AX,30H
	MOV BX,[DI]   ;取8
	SUB BX,30H
	ADD AL,BL
	AAA
	ADD AX,30H
	MOV [SI],AX
	
	MOV AX,[SI+1]   ;取3 其實是取4,因為之前進位1,3+1=4
    SUB AX,30H
	MOV BX,[DI+1]   ;取7
	SUB BX,30H
	ADD AL,BL
    AAA
    JNC NC1;CF!=0跳轉
    ADD AX,30H
	MOV [SI+1],AX
 	MOV AH,02H
 	MOV DL,'1'
 	INT 21H
 	MOV AH,02H
 	MOV DL,[SI+1]
	INT 21H
	MOV DL,[SI]
	INT 21H
	JMP DOC
 NC1:
	ADD AX,30H
	MOV [SI+1],AX
	MOV AH,02H
 	MOV DL,[SI+1]
	INT 21H
	MOV DL,[SI]
	INT 21H
	JMP DOC
	
DOC:MOV AH,4CH
    INT 21H
CODES ENDS
    END START

結果

在這裡插入圖片描述

其他結果

在這裡插入圖片描述
在這裡插入圖片描述
看來沒問題了