1. 程式人生 > 實用技巧 >實驗一 用機器指令和彙編指令程式設計——組合語言實驗

實驗一 用機器指令和彙編指令程式設計——組合語言實驗

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
b4 
00 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