一. 實驗要求
利用Proteus平臺,建立8086的多位十六進制加法運算的例子。
二. 實驗目的
- 熟悉實驗系統的編程和使用。
- 掌握使用加法類運算指令編程及調試方法。
- 掌握加法類指令對狀態標誌位的影響。
三. 實驗說明
由於本實驗是三個十六位二進制數相加運算,N4爲存放結果,其中N1爲1111H,N2爲2222H,N3爲3333H,所以結果應該爲6666H。
四. 實驗程序流程圖
五. 實驗步驟
a.仿真代碼
;N4=N1+N2+N3 =1111H+2222H+3333H=6666H
CODE SEGMENT;表示代碼段開始
ASSUME CS:CODE,DS:DATA;CODE對應代碼段寄存器,DATA對應數據段寄存器
BEG: ;必要的,作爲程序入口
MOV AX,DATA;
MOV DS,AX;藉助AX間接將DATA段地址賦值給DS,因爲段寄存器只接受通用寄存器數據作爲源操作數
MOV SI,OFFSET NUM1;將NUM1的偏移地址賦值給SI,以便之後間接尋址
MOV AX,0;將AX清零用來存儲加法結果
ADD AX,[SI+0];將1111H移入AX
ADD AX,[SI+2];1111H+2222H=3333H
ADD AX,[SI+4];3333H+3333H=6666H
MOV [SI+6],AX;將結果存到空餘位置
JMP $;暫停程序
CODE ENDS;表示代碼段結束
DATA SEGMENT;數據段,存儲各數據
NUM1 DW 1111H ;N1
NUM2 DW 2222H ;N2
NUM3 DW 3333H ;N3
NUM4 DW 0000H ;N4
DATA ENDS
END BEG
b.調試、驗證
在剛運行程序時的內存可以分辨出前面是代碼段,隔着四個字的空白內存後是數據段。數據段中可以直接看到1111H、2222H、3333H這三個數據。注意到數據段地址由0020H開始
然後把數據段地址賦給了DS。可以看到DS的值爲0002H.乘以十即爲真實的段地址。這是因爲
將1111H移入AX寄存器
對AX加上2222H
對AX加上3333H,計算環節結束。
六. 實驗結果和體會
實驗結果展示:最後在內存中便存儲了計算結果,爲6666H。
從這個流程中可以意識到一些彙編編程的思想。待數據往往事先存入數據段中,需要計算時才使用MOV語句移入通用寄存器,結果再寫入內存。由於通用寄存器數量有限(4個),且部分寄存器在某些語句上有專門用途(如MUL語句必須用AX)。不可一次將太多數據存入寄存器,因此往往需要進行內存的讀取與寫入。該點是與使用高級語言進行編程時,對編程者來說不一樣的地方。
此外數據段與代碼段在代碼中的先後順序無關緊要。且在內存中,數據段和代碼段之間還有4個字的空白空間。
七. 擴展題目程序和實驗結果
;N4=N1+N2+N3 =11H+22H+33H=66H
CODE SEGMENT;代碼段
ASSUME CS:CODE,DS:DATA;CODE對應代碼段寄存器,DATA對應數據段寄存器
BEG: MOV AX,DATA
MOV DS,AX;藉助AX間接將DATA段地址賦值給DS,因爲段寄存器只接受通用寄存器數據作爲源操作數
MOV SI,OFFSET NUM1;將NUM1的偏移地址移入SI以便訪問
MOV AL,0;初始化AL,該句及下一句可化簡成MOV AL,[SI+0]
ADD AL,[SI+0];加上第一個數
ADD AL,[SI+1];加上第二個數
ADD AL,[SI+2];加上第三個數
MOV [SI+3],AL;將AL中的結果存入內存
JMP $;程序暫停
CODE ENDS
DATA SEGMENT
NUM1 DB 11H ;N1。由於是8位數據,使用字節保存
NUM2 DB 22H ;N2
NUM3 DB 33H ;N3
NUM4 DB 00H ;N4
DATA ENDS
END BEG
結果圖片展示:
可以看到AX及內存中存儲了計算結果66H