第三章檢測點
檢測點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]
進棧出棧這裡其實理解了原理也就沒有什麼大問題了,也算好理解。今天依舊是一個菜鳥鴨