1. 程式人生 > 實用技巧 >天池新聞推薦比賽1:賽題理解+baseline

天池新聞推薦比賽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、嘗試編寫了十進位制輸出數字的程式