匯編語言 第3版 王爽 檢測點答案及詳細解析 (更新中)


在線知識點:Here

第一章 基礎知識

檢測點1.1

(1)1個CPU的尋址能力為 \(8\) KB,那么它的地址總線的寬度為 \(13\) 位。

(2)1KB的存儲器有 \(1024\) 個存儲單元,存儲單元的編號從 \(0\)\(1023\)

(3)1KB的存儲器可以存儲 \(8192(2^{13})\) 個bit, \(1024\) 個Byte。

(4)1GB是 1073741824 (2^30) 個Byte、1MB是 1048576(2^20) 個Byte、1KB是 1024(2^10)個Byte。

(5)8080、8088、80296、80386的地址總線寬度分別為16根、20根、24根、32根,則它們的尋址能力分別為: 64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。

(6)8080、8088、8086、80286、80386的數據總線寬度分別為8根、8根、16根、16根、32根。則它們一次可以傳送的數據為: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。

(7)從內存中讀取1024字節的數據,8086至少要讀 512 次,80386至少要讀 256 次。

(8)在存儲器中,數據和程序以 二進制 形式存放。

解題過程:

(1)1KB=1024B,8KB=1024B*8=2^N,N=13。

(2)存儲器的容量是以字節為最小單位來計算的,1KB=1024B。

(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。

(4)1GB=1073741824B(即230)1MB=1048576B(即220)1KB=1024B(即2^10)。

(5)一個CPU有N根地址線,則可以說這個CPU的地址總線的寬度為N。這樣的CPU最多可以尋找2的N次方個內存單元。(一個內存單元=1Byte)。

(6)8根數據總線一次可以傳送8位二進制數據(即一個字節)。

(7)8086的數據總線寬度為16根(即一次傳送的數據為2B)1024B/2B=512,同理1024B/4B=256。

(8)在存儲器中指令和數據沒有任何區別,都是二進制信息。


\[QAQ \]


第二章 寄存器

檢測點 2.1

(1) 寫出每條匯編指令執行后相關寄存器中的值。

mov ax,62627   AX=F4A3H 

mov ah,31H     AX=31A3H 

mov al,23H     AX=3123H 

add ax,ax      AX=6246H 

mov bx,826CH   BX=826CH 

mov cx,ax      CX=6246H 

mov ax,bx      AX=826CH 

add ax,bx      AX=04D8H 

mov al,bh      AX=0482H 

mov ah,bl      AX=6C82H 

add ah,ah      AX=D882H 

add al,6       AX=D888H 

add al,al      AX=D810H 

mov ax,cx      AX=6246H

(2) 只能使用目前學過的匯編指令,最多 \(4\) 條指令,編程計算 \(2\)\(4\) 次方

暫時沒學過什么指令,先挖坑留着以后寫

update

mov  ax,2         AX=2 

add  ax,ax        AX=4 

add  ax,ax        AX=8 

add  ax,ax        AX=16 

檢測點2.2

(1) 給定段地址為0001H,僅通過變化偏移地址尋址,CPU的尋址范圍為 0010H1000FH

解題過程:

物理地址=\(SA*16+EA\)

EA的變化范圍為 \(0h\) ~ \(ffffh\)

物理地址范圍為 \((SA*16+0h)\)~$(SA*16+ffffh) $

現在 \(SA=0001h\) ,那么尋址范圍為

\((0001h*16+0h)\)​ ~ \((0001h*16+ffffh) =0010h~1000fh\)

檢測點2.2

(2) 有一數據存放在內存20000H單元中,現給定段地址為SA,若想用偏移地址尋到此單元。則SA應滿足的條件是:最小為 1001H ,最大為 2000H

當段地址給定為 1001H 以下和 2000H 以上,CPU無論怎么變化偏移地址都無法尋到20000H單元。

解題過程:

物理地址=SA*16+EA

20000h=SA*16+EA

SA=(20000h-EA)/16=2000h-EA/16

EA取最大值時,SA=2000h-ffffh/16=1001h,SA為最小值

EA取最小值時,SA=2000h-0h/16=2000h,SA為最大值


這里的 \(ffffH/16=fffh\) 是通過 \(Win\) 自帶計算器算的

按位移來算確實應該為 \(fff.fh\) ,這里小數點后的f應該是省略了

單就除法來說,應有商和余數,但此題要求的是地址最大和最小,所以余數忽略了

如果根據位移的算法(段地址*16=16進制左移一位),小數點后應該是不能省略的

我們可以反過來再思考下,如果SA為1000h的話,小數點后省略

SA=1000h,EA取最大ffffh,物理地址為1ffffh,將無法尋到20000H單元

這道題不應看成是單純的計算題

檢測點2.3

下面的3條指令執行后,cpu幾次修改IP?都是在什么時候?最后IP中的值是多少?

mov ax,bx 

sub ax,ax 

jmp ax 

答:一共修改四次

第一次:讀取mov ax,bx之后

第二次:讀取sub ax,ax之后

第三次:讀取jmp ax之后

第四次:執行jmp ax修改IP

最后IP的值為0000H,因為最后ax中的值為0000H,所以IP中的值也為0000H

檢測點2.3

下面的3條指令執行后,cpu幾次修改IP?都是在什么時候?最后IP中的值是多少?

mov ax,bx 

sub ax,ax 

jmp ax 

答:一共修改四次

第一次:讀取mov ax,bx之后

第二次:讀取sub ax,ax之后

第三次:讀取jmp ax之后

第四次:執行jmp ax修改IP

最后IP的值為0000H,因為最后ax中的值為0000H,所以IP中的值也為0000H

第三章 寄存器(內存訪問)

檢測點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

提示,注意 \(ds\) 的設置

用 DosBox 的Debug驗證結果....


(2) 內存中的情況如圖3.6所示

各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;

① 寫出CPU執行的指令序列(用匯編指令寫出)。

② 寫出CPU執行每條指令后,CS、IP和相關寄存器的數值。

③ 再次體會:數據和程序有區別嗎?如何確定內存中的信息哪些是數據,哪些是程序?

指令序列 CS IP DS AX BX
初始值 2000h 0 0 0 0
1 mov ax,6622h 2000h 3h 0 6622h
2 jmp 0ff0:0100 ff0h 100h 0 6622h
3 mov ax,2000h ff0h 103h 0 2000h
4 mov ds,ax ff0h 105h 2000h 2000h
5 mov ax,[8] ff0h 108h 2000h c389h
6 mov ax,[2] ff0h 10bh 2000h ea66h

檢測點3.2

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

待補


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM