預備知識:debug的使用
前面實驗中講了debug一些命令的用法,這裡再補充一些關於debug的知識。
(1)關於d命令
現在我們知道段位址是存放在暫存器中的,在d命令後面直接給出段位址,是debug提供的一種直觀的操作方式。d命令是由debug執行的,debug在執行d 1000:0這樣的命令時會先將段位址1000h送入暫存器中。
debug是靠什麼執行d命令的?當然是一段程式。誰來執行這段程式?當然是cpu
cpu在訪問記憶體單元的時候從哪得到記憶體單元中的段位址?從段暫存器中得到。
所以,debug在處理d命令的程式段中,必須有將段位址送入暫存器的**。
-r ds
:1000
-d ds:0檢視從1000:0開始的記憶體區間的內容
-r ds
:1000
-d ds:0 18 檢視從1000:0 ~ 1000:18記憶體區間的內容
-d cs:0 檢視當前**段中的指令**
-d ss:0 檢視當前棧段中的內容
(2)在e,a,u命令中使用段暫存器。在e,a,u這些可以帶有記憶體單元位址的命令中,也可以同d命令一樣,用段暫存器表示記憶體單元中的段位址,以下是幾個例子。
-r ds
:1000
-e ds:0 11 22 33 44 55 66從1000:0開始的記憶體區間中寫入資料
-u cs:0 以彙編的指令顯示當前**段中的**,0是**的偏移位址
-r ds
:1000
-a ds:0 以彙編的指令形式,向從1000:0開始的記憶體單元中寫入指令
(3)下一條指令執行了嗎?在debug中用a命令寫一段程式:
mov ax,2000
mov ss,ax
mov sp,10
mov ax,3123
push ax
mov ax,3366
push ax
從下面執行過程,發現什麼
再用t執行mov ax,2000後的下條指令是,mov ax,ss當我們執行完mov ax,ss指令後應當顯示的下條執行指令應該是mov sp,10但是卻是,mov ax,3123,為什麼會這樣?
我們發現,在執行mov ss,ax之後不僅僅只有ss發生了改變,而sp也發生了改變,變成了我們應當執行,mov sp,10的結果說明我們在執行mov ss,ax時,sp也緊跟著執行了,但為什麼會這樣呢?這個內容不是我們當前所要學習的,會在中斷機制中進行講解。
實驗任務
使用debug,將下面程式寫入記憶體,逐條執行,根據被執行後的答案進行填空。
ax=ffff
ds=ffff
ax=2200
ss=2200
sp=0100
mov ax,[0] ax=c0ea
add ax,[2] ax=cofc
mov bx,[4] bx=30f0
add bx,[6] bx=6021
push ax sp=000e
push bx sp=000c
pop ax sp=000e,ax=6021
pop bx sp=0010,bx=cofc
push [4] sp=000e 2200:000e,30f0
push [6] sp=000c,2200:000c,6021
(2)仔細觀察下圖的實驗過程,然後分析為什麼2000:0~2000:f中的內容會發生變化
一些見解:
執行mov ss,ax 時其後邊的指令將立即被執行(這是mov ss,**指令特點)。這也是為什麼強調mov ss,ax 後邊必須跟上mov sp,10的原因。這麼規定是便於控制棧段大小,防止特別是在有子程式呼叫時出錯。至於這兩條指令執行後靠近棧頂的10個位元組中值立即有了變化,是對定義棧段時部分執行環境變數進行暫存,靠近棧頂的10個位元組中的暫存資料分別是ss、ip、 cs 等的值。
組合語言實驗二
datas segment 此處輸入資料段 datas ends stacks segment 此處輸入堆疊段 stacks ends codes segment assume cs codes,ds datas,ss stacks start mov ax,datas mov ds,ax 實驗二 ...
組合語言實驗二
用機器指令和彙編指令程式設計 實驗任務 一 使用 debug,將下面的程式段寫入記憶體,逐條執行,根據指令執行後實際運 況填空。在中途輸入指令的時候,錯把 add 指令輸成了 mov 指令。並且有乙個有趣的地方是,我這段指令中是有 mov sp,0100 這個指令的,但是在執行的時候這條指令並沒有顯...
組合語言 實驗二
在進行實驗之前,有個小知識點 中斷機制 debug的t命令在執行修改暫存器ss的指令時,下一條指令也緊接著被執行。實驗任務 1 敲下如下 填空與實驗結果一致。實驗任務 2 1.我們發現 2000 0 2000 f 的單元值是有變化的 那麼是什麼原因呢?2.前3行的功能是 將段暫存器ss的值設定為段位...