《組合語言》檢測點10 5

2021-10-07 15:17:10 字數 1917 閱讀 3367

(1)下面程式執行之後,ax中的值為多少?

assume cs:code

stack segment

dw 8 dup (0)

stack ends

code segment

start:

mov ax,stack

mov ss,ax

mov sp,

16 mov ds,ax

mov ax,

0 call word ptr ds:

[0eh]

inc ax

inc ax

inc ax

mov ax,

4c00h

int21hcode ends

end start

這個地方需要注意的是ds與ss是一樣的,也就是說棧段與資料段相同。當程式執行到call word ptr ds:[0eh]時,cpu首先會把ip的值壓入棧(此時ip已經指向下一條指令inc ax),也就是說ss:[0eh]儲存了ip的低八位,ss:[0fh]儲存了ip的高八位。然後cpu從ds:[0eh]中取出資料賦值給ip,然後繼續執行。

所以,cpu在執行完call word ptr ds:[0eh]之後,緊接著會執行inc ax這條指令。

所以最後ax中的值為3。

(2)下面的程式執行之後,ax和bx中的數值為多少?

assume cs:code

data segment

dw 8 dup (0)

data ends

code segment

start:

mov ax,data

mov ss,ax

mov sp,

16 mov word ptr ss:[0

],offset s

mov ss:[2

],cs

nops:

mov ax,offset s

sub ax,ss:

[0ch]

mov bx,cs

sub bx,ss:

[0eh]

mov ax,

4cooh

int21hcode ends

end start

這段程式與上乙個程式有點類似,將資料段與棧段定義到了一起。

mov word ptr ss:[0

],offset s

mov ss:[2

],cs

這兩行**其實就是將s所在的資料段的段位址以及相對段位址的偏置分別存放到了ss的第2個字和第1個字。cpu在執行後面緊跟著的call dword ptr ss:[0]語句時,首先將**段的段位址cs入棧,存放到ss:[0eh]中,然後將ip入棧,存放到ss:[0ch]中,此時,ip指向nop這一條指令。隨即,程式跳到標號s處執行。

在執行s後面的程式時,首先將s的偏移位址存入ax,然後用ax中的值減去ss:[0ch]中的值,結果存放在ax中,由上文知,ss:[0ch]處存放的是nop的偏移位址,所以兩者相減的結果為1(nop 指令的長度 是 1)。

同樣的道理,存放在bx中的**段段位址cs與存放在ss:[0eh]中的段位址為同乙個值,兩者相減結果為0。

所以,程式執行後,ax中的值為1,bx中的值為0。

組合語言檢測點10 4

建議先自己思考問題的答案,不懂則返回看書 這兒用到了bp,除了之前這樣用過bp外 bx bp 還會在棧中用到。比如說,堆疊中壓入了很多資料或者位址,你肯定想通過sp來訪問這些資料或者位址,但sp是要指向棧頂的,是不能隨便亂改的,這時候你就需要使用bp,把sp的值傳遞給bp,通過bp來尋找堆疊裡資料或...

組合語言檢測點11 3

建議先自己思考問題的答案,不懂則返回看書 這兩道題太簡單了,但為了完整的系列,還是寫寫,沒必要分析。a,b 表示此範圍包含a,b a,b 表示此範圍不包含a,b 1 補全下面的程式,f000 0處的32個位元組中,大小在 32,128 的資料的個數。mov ax,0f000h mov ds,ax m...

《組合語言》檢測點9 2

補全程式,利用jcxz指令,實現在記憶體2000h段中查詢第乙個值為0的位元組,找到後,將它的偏移位址儲存在dx中。assume cs code code segment start mov ax,2000h mov ds,ax mov bx,0 s jmp short s ok mov dx,bx...