介面技術實驗四、加減運算實驗
阿新 • • 發佈:2018-11-13
一、實驗目的
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
結果
其他結果
看來沒問題了