組合語言實驗二

2021-10-19 11:21:23 字數 2228 閱讀 5715

預備知識: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的值設定為段位...