(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...