一、實驗目的
1.熟練掌握8086/8088常用匯編指令的使用方法
2.熟練掌握循環結構程序編程技巧
3.熟練掌握匯編語言程序運行調試方法
二、實驗要求
認真分析實驗題目,設計程序流程圖,獨立完成代碼編寫及運行調試。
三、實驗題目
給出不大于255的十個正整數,分別計算出其中偶數和奇數的平均值,并以十進制的方式輸出,保留到小數點后兩位。
四、程序流程圖
略。
五、程序代碼
sseg segment stack
stp db 100 dup(0)
sseg ends
dseg segment
dta db 12,14,12,14,12,16,57,21,25,11
dtb db 0;偶數計數器
dtc db 0;奇數計數器
jishu db 0,0
oushu db 0,0
num db ?
flag db 1
dseg ends
cseg segment
assume cs:cseg,ds:dseg
assume ss:sseg
print macro add al,30hmov dl,almov ah,02hint 21h
endm
huanhang macromov al,0ahmov dl,almov ah,02hint 21h
endm
shijinzhi macro
local a,b,cmov num,al;判斷是否大于100cmp num,100jc a;num<100,cf =1,跳amov ah,0mov al,nummov bl,100div bl;al為商,ah為余數mov num,ahprintmov flag,0
a: ;判斷是否大于10cmp num,10jc bmov ah,0mov al,nummov bl,10div bl;al為商,ah為余數mov num,ahprintmov flag,1
b: cmp flag,1;flag的作用是防止余數小于10jnc cmov al,0print
c: mov al,numprint
endm
panduan procmov dl,2ehmov ah,02hint 21hmov al,nummov ah,0cmp ah,aljc notzeroprintret
notzero: mov al,nummov num,100mul num;存在ax中div blshijinzhiret
panduan endp
start: mov ax,dsegmov ds,axmov ax,ssegmov ss,axmov sp,size stpmov cx,10mov si,0
again: mov al,[si]shr al,1;cf = 1奇,cf = 0偶jc dmov bl,[si]add oushu,bladc byte ptr oushu+1,0inc dtbjmp e
d: mov bl,[si]add jishu,bladc byte ptr jishu+1,0inc dtc
e: inc siloop againmov ah,oushu+1mov al,oushudiv dtb;al中存平均值,ah存余數mov oushu,almov oushu+1,ahmov ah,jishu+1mov al,jishudiv dtc;mov jishu,almov jishu+1,ah;按十進制輸出mov al,oushushijinzhimov al,oushu+1mov num,almov bl,dtbcall panduanhuanhangmov al,jishushijinzhimov al,jishu+1mov num,almov bl,dtccall panduanmov ah,4chint 21h
cseg ends
end start
運行截圖:
六、實驗總結
本次實驗中,我對循環結構程序又有了更新一層認識,對匯編指令的使用規則及方法掌握的更熟練了。在本次實驗中,我同時也遇到了一些困難:
- 在最后的幾次調試時,發現小數位是不對的,且只有一位數。經過調試發現是我直接將余數打印了出來,并沒有處理成小數。要想將余數轉化成小數,將余數乘以10的倍數再除以除數即可。
- 在寫宏定義時,也想運用循環結構,不知是否可行。在老師的幫助下,發覺需要在頭部聲明:local?x,x,x。原因是當宏在主程序中被二次展開時,標號會重名,所以要提前聲明一下防止出錯。
- 在寫程序的過程中也犯了一些基礎的錯誤,如不能直接div?數值,需將數值放在寄存器中;adc?oushu+1,0是不行的,需要指明數值類型是字還是字節,應修改為:adc?byte ptr oushu+1,0;以及mov?存儲器,存儲器這種低級的錯誤。
經過這段時間的訓練,一點點地編寫代碼與調試,對于匯編語言有了更高一層的理解與掌握,也認識到了它身為低級語言的重要性,希望我在未來的學習中能更加深刻的學習與掌握相關知識,搭建好人與機器溝通的橋梁。