Redisson官方文件 - 2. 配置方法
一、實驗任務
1. 實驗任務1
ex1.asm的原始碼:
1 ;ex1.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 7 mov byte ptr ds:[0], 1 8 mov byte ptr ds:[1], 1 9 mov byte ptr ds:[2], 2 10 mov byte ptr ds:[3], 2 11 mov byte ptr ds:[4], 3 12 mov byte ptr ds:[5], 3 13 mov byte ptr ds:[6], 4 14 mov byteptr ds:[7], 4 15 16 mov ah, 4ch 17 int 21h 18 code ends 19 end
使用masm、link工具彙編、連結:
debug除錯:
觀察到cx=31,使用u命令精準反彙編至30;
使用g命令執行至倒數第二行,此時命令列出現影象
2. 實驗任務2
ex2.asm的原始碼:
1 ;ex2.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 7 mov bx, 0 8 mov ax, 101H 9 mov cx, 4 10 s: mov [bx], ax11 add bx, 2 12 add ax, 101H 13 loop s 14 15 mov ah, 4ch 16 int 21h 17 code ends 18 end
使用masm、link工具彙編、連結:
執行結果:
debug除錯:
觀察到cx=1c,使用u命令精準反彙編至1b;
使用g命令執行至倒數第二行,此時命令列出現影象:
實驗分析:
該程式的作用與ex1.exe相同,都是對視訊記憶體的指定位置寫入特定的內容,使得螢幕上顯示四個顏色形狀各異的圖示。
在具體實現上,ex1.exe通過程式碼的重複來更改視訊記憶體地址,而ex2.exe則利用了loop語句簡化了這一過程。
3. 實驗任務3
ex3.asm的原始碼:
1 assume cs:code 2 code segment 3 mov ax,0b800h 4 mov ds,ax 5 mov ax,0237h 6 mov bx,07b8h 7 8 mov cx,16 9 s: mov ds:[bx],ax 10 add bx,2h 11 loop s 12 13 mov ax,4c00h 14 int 21h 15 code ends 16 end
執行結果截圖:
把填充的字資料,從0237H 改成0239H後,觀察結果:
把填充的字資料,從0237H 改成0437H後,觀察結果:
實驗分析:
這個字資料中高位位元組裡存放的是圖示的顏色,低位位元組裡存放的圖示的內容。
4. 實驗任務4
ex4.asm的原始碼如下:
1 assume cs:code 2 code segment 3 mov ax,0 4 mov ds,ax 5 mov ax,0200h 6 mov bx,ax 7 8 mov ax,0 9 mov cx,03fh 10 s: mov ds:[bx],ax 11 add ax,1 12 add bx,1 13 loop s 14 15 mov ax,4c00h 16 int 21h 17 code ends 18 end
debug除錯:
成功將0~63寫入記憶體0:200~0:23f。
5. 實驗任務5
ex5.asm的原始碼如下:
1 assume cs:code 2 code segment 3 mov ax ,cs 4 mov ds,ax 5 mov ax,002h 6 mov es,ax 7 mov bx,0 8 mov cx,cx 9 10 s: mov al,ds:[bx] 11 mov es:[bx],al 12 inc bx 13 loop s 14 15 mov ax,4c00h 16 int 21h 17 code ends 18 end
debug除錯結果如下:
可以看見已經成功把程式本身複製至0:200記憶體單元處。
二、實驗總結
在實驗過程中,對於實驗1和實驗2的除錯過程中,發現了一個問題:對於視訊記憶體的讀寫,有時候是成功的,而有時候是失敗的。經過多次實驗,可以總結出一個結論,當執行讀寫視訊記憶體指令時,如果控制檯的頁面已經被語句鋪滿,因為新程式碼的顯示,產生了頁面的滾動,則無法正確讀寫視訊記憶體;若控制檯內容為空,新程式碼的顯示不導致頁面滾動,則可以讀寫視訊記憶體顯示圖示。
經過分析,我認為是控制檯語句滾動這一事實發生在讀寫視訊記憶體語句之後,同時控制檯為了滾動頁面,會將下面行的內容寫入滾上去的一行,這次寫入會覆蓋之前的語句讀寫現存,導致讀寫視訊記憶體語句雖然生效,但是無法顯示出結果。