實驗一 用機器指令和彙編指令程式設計——組合語言實驗
1.教材實驗一結論
(1)將下面的程式段分別用e命令和a命令兩種方式寫入記憶體
b8 20 4e mov ax,4E20H 05 16 14 add ax,1416H bb 00 20 mov bx,2000H 01 d8 add ax,bx 89 c3 mov bx,ax 01 d8 add ax,bx b8 1a 00 mov ax,001AH bb 26 00 mov bx,0026H 00 d8 add al,bl 00 dc add ah,bl 00 c7 add bh,al b400 mov ah,0 00 d8 ad al,bl 04 9c add al,9CH
e命令寫入0100:0開始的記憶體單元,並用u命令檢視
或者使用a命令寫入0100:0開始的記憶體單元
修改CS暫存器中的內容為0100,IP暫存器中的內容為0000後,使用t命令,逐條執行這個程式段
可以發現AX,BX中的內容隨著指令中的執行而改變,IP暫存器中的內容在執行完一個指令後,會自動指向下一條指令的地址
(2)將下面3條指令寫入從2000:0開始的記憶體單元中,利用這3條指令計算2的8次方
mov ax,1 add ax,ax jmp 2000:0003
接下來用t命令執行這個程式段
除錯開始(ax起初是0):
除錯結束(ax最後為8):
(3)檢視記憶體中的內容
從FFF00H~FFFFFH中找到生產日期,並試圖改變它
找到類似生產日期的位置在FFF0:00F5至FFF0:00FC記憶體單元中
試將其值修改為09/10/20
可見修改值的操作無效,因為向地址C0000~FFFFF的記憶體單元中寫入資料是無效的,因為它是一個只讀儲存器ROM
(4)向記憶體從B8100H開始的單元中填寫資料
可以看到向B8100開始的記憶體單元中修改資料,會顯示出一些彩色的圖示,這是因為A0000~BFFFF在8086PC機內是視訊記憶體地址空間
2.教材實驗二結論
(1)使用debug將下面的程式段寫入記憶體,逐條執行
mov ax,0022 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ax= 5150 add ax,[2] ax = A4A2 mov bx,[4] bx= 5554 add bx,[8] bx = ACAA push ax sp = 00FE 修改的記憶體單元的地址是: 2200:00FE 內容為:A4A2 push bx sp = 00FC 修改的記憶體單元的地址是: 2200:00FC 內容為:ACAA
pop ax sp = 00FE AX=ACAA
pop bx sp = 00FC BX = A4A2
push [4] sp = 00FE 修改的記憶體單元的地址是:2200:00FE 內容為:5554
push [6] sp = 00FC 修改的記憶體單元的地址是: 2200:00FC 內容為:5756
a指令書寫程式:
記憶體單元改寫:
除錯開始:
除錯過程:
除錯結束:
(2)執行以下程式,並分析為什麼2000:0~2000:f中的內容會發生改變
修改2000中的內容
mov ax,2000:將2000送入暫存器ax中
mov ss,ax mov sp,10:將ax中的值作為棧的段地址,並將sp中的值設定為10,記憶體單元中值的變化可能是為了標識這個空間是一個棧
mov ax,3123:將3123送入暫存器中
push ax:將ax中的內容壓入棧
mov ax,3366:將3366送入ax中
push ax:將ax中的值壓入棧
前三行組合語言指令的意思是:設定棧的起始地址為2200:0,並設定棧的大小為10
五、實驗總結
學會了dosbox中的debug工具的幾個常用指令
實踐的知識:8086機的記憶體空間的劃分,記憶體單元地址的編寫,棧的使用
仍未解決的知識:申明棧空間時的儲存空間中的一串亂碼究竟是何含義?為什麼執行mov ss,ax操作時,順便執行了mov sp,10