微机原理实验2:多字节BCD加法实验
一、實驗目的
掌握數(shù)據(jù)傳送、算術指令和循環(huán)指令的用法。
二、實驗內容
將兩個多位十進制數(shù)相加。要求加數(shù),被加數(shù)均以ASCII碼形式存放在以DATA1和DATA2為首的5個內存單元中( 低位在前),結果存在DATA1處。
三、程序清單
CRLF MACRO ;建立宏命令,利用INT中斷實現(xiàn)回車換行的功能,方便后續(xù)直接調用MOV DL,0DHMOV AH,02HINT 21H ;光標移到第一列MOV DL,0AHMOV AH,02HINT 21H ;光標移到下一行 ENDMDATA SEGMENT DATA1 DB 33H,39H,31H,37H,34H ;被加數(shù)ASCII碼 DATA2 DB 36H,35H,30H,38H,32H ;加數(shù)ASCII碼 DATA ENDSSTACK SEGMENT STACK ;堆棧段 STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV SI,OFFSET DATA2 ;SI存放數(shù)據(jù)地址MOV BX,05 ;BX中存放數(shù)字長度CALL DISPL ;顯示加數(shù)CRLFMOV SI,OFFSET DATA1 ;源地址指向被加數(shù)MOV BX,05CALL DISPL ;顯示被加數(shù)CRLFMOV DI,OFFSET DATA2 ;目的地址指向加數(shù)CALL ADDA ;調加法運算子程序MOV SI,OFFSET DATA1MOV BX,05CALL DISPL ;顯示結果CRLFMOV AX,4C00HINT 21H ;返回DOSDISPL PROC NEAR ;顯示子程序 DS1: MOV AH,02MOV DL,[SI+BX-1] ;顯示字符串中一個字符INT 21HDEC BXJNZ DS1RET DISPL ENDPADDA PROC NEAR ;加法運算子程序MOV DX,SIMOV BP,DIMOV BX,05 AD1: SUB BYTE PTR [SI+BX-1],30H ;將ASCII碼轉換位二進制數(shù)SUB BYTE PTR [DI+BX-1],30HDEC BXJNZ AD1MOV SI,DXMOV DI,BPMOV CX,05 ;五位數(shù)加法, 5 作為循環(huán)次數(shù)CLC ;清進位標志 AD2: MOV AL,[SI]MOV BL,[DI]ADC AL,BL ;帶進位加法AAA ;非組合BCD碼調整;如果al的低4位是在0到9之間,保留低4位,清除高4位,如果al的低4位在10到15之間;則通過加6,來使得低4位在0到9之間,然后再對高4位清零。;如果al的低4位是在0到9之間,ah值不變,CF和AF標志清零,否則,ah=ah+1,并設置CF和AF標志MOV [SI],AL ;結果存被加數(shù)區(qū)INC SI ;指向下一位INC DILOOP AD2 ;沒有加夠 5 位轉MOV SI,DX ;恢復加數(shù),被加數(shù)地址指針MOV DI,BPMOV BX,05 AD3: ADD BYTE PTR [SI+BX-1],30H ;轉換為ASCII碼ADD BYTE PTR [DI+BX-1],30HDEC BXJNZ AD3RET ADDA ENDP CODE ENDSEND START四、實驗過程
1.用編輯器建立源文件D101-2.ASM
2.用匯編程序MASM.EXE對源文件進行匯編,產(chǎn)生目標文件,再用連接程序LINK產(chǎn)生可執(zhí)行文件
3.使用調試工具DEBUG進行程序調試
先用U命令反匯編,以便了解指令地址。顯示結果如下,具體調試結果見第五部分。
五、實驗結果分析
1.程序調試及結果
可以看到在076D:0015地址處的指令是調用顯示子程序DISPL來顯示加數(shù),被加數(shù)的顯示類似,使用G命令執(zhí)行到076D:0039處,查看顯示結果。
使用-G 0076命令執(zhí)行到ADDA子程序中,使用D命令查看ASCII碼被轉化為十六進制數(shù)后在內存中的存放情況,如下
使用-G 008f命令執(zhí)行到BCD加法結束,查看被加數(shù)內存區(qū)域數(shù)值如下,因為28056+47193=75249,因此內存區(qū)域由低地址到高地址應依次為09 04 02 05 07,使用-d ds:0命令進行查看,與理論值一致。
繼續(xù)使用G命令運行程序,直到將計算結果轉化為ASCII碼后,結果為
最后,運行到程序結束,將結果打印到屏幕上,如下:
2.分析總結
首先,在MASM編譯器Microsoft ? Macro Assembler Version 5.00版本下,糾正實驗指導書中出現(xiàn)的一個小問題。實驗指導書中對“CRLF”命令宏的建立代碼放在了文件最開頭,然而在該版本編譯器下編譯會報錯:Out of memory,將該宏命令放入代碼段后編譯即可編譯成功,后續(xù)又將其放在文件開頭編譯,又可以編譯成功沒任何報錯信息,對此迷惑不解,具體原因還需查閱相關資料。
本次實驗的核心在于數(shù)據(jù)的傳送指令、算數(shù)指令和循環(huán)指令的用法,其中比較重要的指令有:AAA(ASCII adjust after addition)指令,是BCD指令集中的一個指令,用于在兩個未打包的BCD值相加后,調整al和ah寄存器的內容;BCD(Binary-coded decimal)數(shù)是指2進制編碼的10進制數(shù),占據(jù)一個字節(jié)的低4位,只有0-9是有效值。AAA指令做兩件事情:(1)如果al的低4位是在0到9之間,保留低4位,清除高4位,如果al的低4位在10到15之間,則通過加6,來使得低4位在0到9之間,然后再對高4位清零。(2)如果al的低4位是在0到9之間,ah值不變,CF和AF標志清零,否則,ah=ah+1,并設置CF和AF標志。此外,還要搞清楚ADC等帶進位加法指令與不帶進位加法ADD指令的區(qū)別,將這些搞明白,則本實驗的核心內容就沒有什么問題了。
總結
以上是生活随笔為你收集整理的微机原理实验2:多字节BCD加法实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 幽默搞笑押韵的句子176个
- 下一篇: 弗罗斯特以写什么著称