在線知識點: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)在存儲器中指令和數據沒有任何區別,都是二進制信息。
第二章 寄存器
檢測點 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的尋址范圍為 0010H 到 1000FH 。
解題過程:
物理地址=\(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中。
待補