天池新聞推薦比賽1:賽題理解+baseline
一、實驗結論
實驗過程中使用到的碟符註明為v。
實驗一:
實驗任務(1):首先按照要求,使用txt記事本文字編輯器,錄入彙編源程式task1.asm。實驗程式碼在壓縮包中給出了。
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
進入虛擬dos機器,目錄設定為masm資料夾,對於task1.asm進行彙編連線。
執行編譯好的程式,看到了結果是nuist綠的大寫字母顯示。
開始debug
在實驗中,指定的資料段是data,為唯一的資料段,佔用了位元組,CX的大小是003B,因此可知具體的反彙編應該到002B處。
程式執行到末尾的時候處於記憶體空間的002B處,因此,除錯到002B處。執行到line27處。
改變了內容進行修改重新編譯連線執行,結果是出現了彩色的各種顏色的nuist
db 5 dup(2) --> 改成: db 2,3,4,5,6
後面的四個字母的顏色改變了,因此,此處數值控制的是顯示的字母對應的顏色,推理可知,2對應綠色,順應其他四種顏色對應。對應的應該是ASCII表中的標準色號。
實驗任務(2):已知資料段data中定義位元組資料如下: 編寫程式,在螢幕上以十進位制整數形式列印輸出這5個兩位數。23,50,66,71,35
編寫程式如下:
assume cs:code,ds:data
data segment
db 23, 50, 66, 71, 35
data ends
code segment
start:
mov cx,5
mov bx,data
mov ds,bx
s: mov al,ds:[di]
mov bl,10
mov ah,0
div bl
mov dx,ax
add dx,3030H
mov ah,2
int 21h
mov ah,2
mov dl,dh
int 21h
inc di
loop s
mov ah,4CH
int 21h
code ends
end start
執行結果包含了幾個數的內容,以十進位制形式列印了出來。
實驗任務(3):使用任意文字編輯器,錄入彙編源程式task3.asm。
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
編譯連線
開始進行debug除錯
執行到程式結束之前,即1D處
使用-d命令檢視記憶體中的內容
問題1:執行前,data內資料正常的內容是 0123H,0456H,0ABCH,0DEFH,0FEDH,0CBAH,0987H
問題2:CPU執行任務返回前,CS、SS、DS內容分別是076CH,076BH,076AH
問題3:程式開始執行之前,設CODE地址為X,那麼DATA段地址為X-2,STACK棧段地址為X-1.data定義了一個十六位元組的地址內容,STACK棧定義了十六位元組的空間,因此相差10H位元組
實驗任務(4):使用任意文字編輯器,錄入彙編源程式task4.asm。
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
編譯連線
開始debug
反彙編,執行到結束之前
問題1:任務執行完成前,data中資料未變,內容是0123H,0456H
問題2:CPU執行返回前,CS、SS、DS的內容分別是076CH、076BH、076AH
問題3:程式載入後CODE段地址為X,則DATA段地址為X-1,STACK棧段地址為X-2
問題4:如果資料段佔用了十六位元組,那麼實際佔有的空間16*[N/16+1],取整後運算
實驗任務(5):使用任意文字編輯器,錄入彙編源程式task5.asm。
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
編譯連線
開始debug
反彙編執行到程式結束之前
問題1:程式執行返回之前,data中的值仍然是之前的內容,即0123H,0456H
問題2:CPU執行程式返回前,CS、SS、DS的值分別是076AH、076EH、076DH
問題3:程式載入後CODE的段地址是X,則DATA的段地址是X+3,STACK棧的段地址是X+4
實驗任務(6):第三個程式可以正確執行,因為不指定入口的情況下,仍然會找到載入進入記憶體的第一個單元,cs的初始值為ds+10,第三個程式的程式碼段放在最開始的時候,因此儘管有錯誤,還是能正常執行到程式自己退出
實驗任務(7):使用任意文字編輯器,錄入彙編源程式task7.asm。
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c1 segment
db 8 dup(0)
c1 ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,c1
mov ss,ax
mov sp,8
mov cx,4
mov bx,6
s: mov al,ds:[bx]
add al, es:[bx]
mov ah,ds:[bx+1]
add ah,es:[bx+1]
push ax
sub bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
編譯連線
實驗任務(8):使用任意文字編輯器,錄入彙編源程式task8.asm。
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,b
mov ss,ax
mov sp,16
mov ax,a
mov ds,ax
mov bx,0
s: push ds:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
編譯連線
反彙編
執行到對應位置
二、實驗總結
1、初步瞭解了字型顏色在螢幕上顯示的彙編寫法
2、嘗試編寫了十進位制輸出數字的程式