1. 程式人生 > >第三章檢測點

第三章檢測點

檢測點3.1

(1) 在DEBUG中,用 “D 0:0 lf” 檢視記憶體,結果如下:

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60

0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88

下面的程式執行前,AX=0,BX=0,寫出每條彙編指令執行完後相關暫存器中的值。

 

mov ax,1

mov ds,ax

mov ax,[0000] ax= 2662H

mov bx,[0001]        bx= E626H

mov ax,bx             ax= E626H

mov ax,[0000]       ax= 2662H

mov bx,[0002]       bx= D6E6H

add ax,bx              ax= FD48H

add ax,[0004]        ax= 2C14H

mov ax,0               ax= 0

mov al,[0002]        ax= 00e6H

mov bx,0               bx= 0

mov bl,[000c]        bx= 0026H

add al,bl               ax= 000CH
 

        emmm,這是道看起來很簡單的題,但本人進來看了題目後,最開始的疑問是,開始的 mov ax,1  mov ds,ax 明顯是把ds暫存器改為0001,那後一條命令操作的程式碼段地址應該是0001:0000 - 0001:ffff,但題目一開始卻只給出0000:0000 - 0000:0010的記憶體單元!開始我懷疑題目是不是出錯了~

 

  後來才想起書前面講過,所位的段地址和偏移地址,並不是記憶體中真實存在分段,分段只是cpu去分,為了8086資料傳送​的設計而已。真實的記憶體中的資料,還是要以實體地址為準,OK,那麼:

  題目開始mov ax,1  mov ds,ax 得到的資料段地址起始為:ds=0001,所以在邏輯上,之後的記憶體訪問都會在0001:0000-0001:ffff中進行​​,可以算一下題目中給的:0000:0010實體地址為:0000*10+0010= 00010

  而此時ds=0001,0001:0000​的實體地址為:0001*10 + 0000 = 00010

  可以看到,這二個數據的實體地址是相同的,也就是說,題目最開始其實就已經給出了0001:0000這個記憶體單元中的真實資料了,就等於0000:0010,後面的也就容易了,只需要注意al,bl暫存器資料溢位。​

總結:有時候真是容易忽視或忘記一些細節問題,雖然別人提起你馬上明白,但不自己練習還真不是那麼容易記在心裡!

 

(2)記憶體中的情況如圖所示:


各暫存器的初始值:CS = 2000H , IP = 0 , DS = 1000H , BX = 0;

1.寫出CPU執行的指令序列(用匯編指令寫出)

2.寫出CPU執行每條指令後,CS、IP和相關暫存器中的數值.

3.再次體會:資料和程式有區別嗎?如何確定記憶體中的資訊哪些是資料,哪些是程式?

 

3:資料和程式沒有多大區別。想要確定具體的職務可以看他們被送入了什麼樣的暫存器,不同的暫存器賦予了他不同的涵意。

 

檢測點3.2

(1)補全下面的程式,使其可以將10000H-1000FH中的8個字,逆序拷貝到20000H-2000FH中。

 

mov ax,1000H 

mov ds,ax 

( mov ax,2000H ) 

( mov ss,ax )    

( mov sp,10h )   

push [0] 

push [2] 

push [4] 

push [6] 

push [8] 

push [A] 

push [C] 

push [E] 
 

 

(2)補全下面的程式,使其可以將10000H-1000FH中的8個字,逆序拷貝到20000H-2000FH中。 

 

mov ax,2000H 

mov ds,ax 

( mov ax,1000H )

( mov ss,ax )

( mov sp,0 )    

pop [e] 

pop [c] 

pop [a] 

pop [8] 

pop [6] 

pop [4] 

pop [2] 

pop [0]
 

 

  進棧出棧這裡其實理解了原理也就沒有什麼大問題了,也算好理解。今天依舊是一個菜鳥鴨