王爽匯編語言答案(1-4)


王爽匯編語言答案(1-4章)

檢測點

chapter1

檢測點1.1

(1)1個CPU的尋址能力為8KB,那么它的地址總線的寬度為13
(2)1KB的存儲器有個存儲單元。存儲單元的編號從00001023
(3)1KB的存儲器可以存儲個8192bit,1024個Byte。
(4)1GB、1MB、1KB分別是2^30 , 2^20 , 2^10Byte。
(5)8080、8088、80286、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)在存儲器中,數據和程序以形式二進制存放。

chapter2

檢測點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
  1. 只能使用目前學過的匯編指令,最多使用4條指令,編程計算2的4次方。
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的尋址范圍為00010H1000FH
(2)有一數據存放在內存20000H單元中,現給定段地址為SA,若想用偏移地址尋到此單元。則SA應滿足的條件是:最小為1001H,最大為2000H

檢測點2.3

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

mov ax, bx
sub ax, ax
jmp ax

**共計4次修改IP的值:

  1. mov ax, bx 指令加載至指令緩沖器后
  2. sub ax, ax 指令加載至指令緩沖器后
  3. jmp ax 指令加載至指令緩沖器后
  4. jmp ax 執行后,IP變為0000H**

chapter3

檢測點3.1

  1. 在Debug中,用“d 0:0 1f”查看內存,結果如下:
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=0000H
mov al, [0002] AX=00E6H
mov bx, 0 BX=0000H
mov bl, [000C] BX=0026H
add al, bl AX=000CH
  1. 內存中的情況如圖所示

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

  1. 寫出CPU執行的指令序列(用匯編指令寫出)。
  2. 寫出CPU執行每條指令后,CS、IP和相關寄存器中的數值。
  3. 再次體會:數據和程序有區別嗎?如何確定內存中的信息哪些是數據,哪些是程序?
mov ax,6622H  ;CS= 2000H IP= 0003H AX= 6622H
jmp 0ff0:0100 ;CS= 0fff0 IP= 0100H 
mov ax,2000H  ;CS= 0fff0 IP= 0103H AX= 2000H
mov ds,ax     ;CS= 0fff0 IP= 0105H DS= 2000H
mov ax,[0008] ;CS= 0fff0 IP= 0108H AX= C389H
mov ax,[0002] ;CS= 0fff0 IP= 010BH AX= 6622H

程序和數據沒有區別,都是在內存單元中的二進制碼。當內存單元被CS:IP指定時其存儲的就被當做程序執行。當內存單元被DS:偏移地址指定時其存儲的就是數據。

檢測點3.2

1.補全下面的程序,使其可以將10000H1000FH中的8個字,逆序復制到20000H2000FH中。

mov ax, 1000H
mov ds, ax
mov ax, 2000H
mov ss, ax
mov sp, 0010H
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]

2.補全下面的程序,使其可以將10000H1000FH中的8個字,逆序復制到20000H2000FH中。

mov ax, 2000H
mov ds, ax
mov ax, 2000H
mov ss, ax
mov sp, 0010H
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]

實驗

實驗1 查看CPU和內存,用機器指令和匯編指令編程

Debug的使用

什么是Debug:
Debug是DOS、Windows都提供的實模式(8086方式)程序的調試工具。使用它,可以查看CPU各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。

Debug的命令:

  1. 用Debug的R命令查看、改變CPU寄存器的內容;
  2. 用Debug的D命令查看內存中的內容;
  3. 用Debug的E命令改寫內存中的內容;
  4. 用Debug的U命令將內存中的機器指令翻譯成匯編指令;
  5. 用Debug的T命令執行一條機器指令;
  6. 用Debug的A命令以匯編指令的格式在內存中寫入一條機器指令。
    Debug的命令比較多,共有20多個,但這6個命令是和匯編學習密切相關的。

如何進入Debug:
現在通過其他的虛擬機方式,還原到窗口並不現實,相當麻煩,這里采用Dosbox模擬運行。

具體搭建可見,不是我寫的

關於dubug更詳細的操作可以看原書,或者下載非整書,截取了debug部分的內容,提取碼za88

注意在debug中,所有的數字均為16進制表示,mov ax,1839后,ax就為1893

第一個小實驗

第三個小實驗
會發現內容無法更改圖中紅圈所示。

第四個小實驗
e命令選的內存為顯存內存,DOS界面被更改。

實驗2 用機器指令和匯編指令編程

  1. 修改SS寄存器
    在debug中單步執行以下程序:
mov ax,1000H
mov ss,ax
mov bx,8945H
mov sp,2834H

我們發現,在執行了mov ss, ax后,直接轉向執行mov sp, 2834H,觀察bx的值,我們發現mov bx, 8945H 已經被執行過了。不單是mov ss,ax,對如mov ss,bx,mov ss,[0],pop ss等指令都會發生上面的情況,這些指令有哪些共性呢?它們都是修改棧段寄存器ss的指令。產生該現象是由於中斷機制的原因,這部分內容將會在后面詳細說明。

  1. 使用Debug,將下面的程序段寫入內存,逐條執行,根據指令執行后的實際運行情況填空。
mov ax, ffff
mov ds, ax
mov ax, 2200
mov ss, ax
mov sp, 0100

mov ax, [0]        ;ax= c0ea
add ax, [2]        ;ax= c0fc
mov bx, [4]        ;bx= 30f0
add bx, [6]        ;bx= 6021

push ax            ;sp=00fe 
push bx            ;sp=00fc 
pop ax             ;sp=00fe ;ax=6021
pop bx             ;sp=0100 ;bx=c0fc
push [4]           ;sp=00fe
push [6]           ;sp=00fc
  1. 仔細觀察圖中程序,思考為什么2000:0~f內存會發生變化。

通過觀察我們可以很明顯的發現從內存高位到低位,第2個字的位置儲存了CS寄存器中的值,第3個字的位置儲存了IP寄存器中的值,而第5個字的位置很有可能儲存了AX寄存器中的值,或者SS寄存器,為了驗證我們的猜想,我們換一塊位置寫我們的程序,並且在之前給BX和CX都賦值。

通過觀察可以發現,確實是和bx和cx無關,關於CS和IP寄存器猜想是正確的,5個字中保存了SS寄存器的值。造成這個原因的,應該是修改SS寄存器中斷機制的原因。

實驗3 編程、編譯、連接、跟蹤

  1. 將下面的程序保存為 t1.asm文件,將 其生成可執行文件 t1.exe
  2. 用debug跟蹤t1.exe的執行過程
  3. PSP的頭兩個字是CD 20,用debug查看PSP的內容
assume cs : codesg
	codesg segment
		mov ax, 2000H 
		mov ss, ax
		mov sp, 0 
		add sp, 10
		pop ax
		pop bx 
		push ax 
		push bx 
		pop ax 
		pop bx

		mov ax, 4c00H
		int 21H
	codesg  ends
end

執行過程

mov ax, 2000H ; ax=2000
mov ss, ax    ; ss=2000
mov sp, 0     ; sp=0000
add sp, 10    ; sp=000A
pop ax        ; sp=000C ax=0000
pop bx        ; sp=000E bx=0000
push ax       ; sp=000C
push bx       ; sp=000A
pop ax        ; sp=000C
pop bx        ; sp=000E
mov ax, 4c00H ; ax=4C00
int 21H       ;
修改SS,中斷並未影響棧
查看PSP d DS:0000


免責聲明!

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



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