實驗三 多個段的彙編源程式編寫與除錯
實驗3 多個段的彙編源程式編寫與除錯
一、實驗目的
1、理解和掌握將資料、程式碼、棧放入不同邏輯段的程式的編寫和除錯
2、理解具有多個段的彙編源程式對應的目標程式執行時,記憶體的分配方式
3、掌握大小寫字元的轉換辦法、數字字元和數值之間的轉換方法
4、理解並掌握各種定址方式的靈活應用
5、掌握彙編指令loop,and,or,div,mul的用法
二、實驗準備
複習教材chapter6-8章
三、實驗結論
1、實驗任務1
源程式如下:
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
使用masm、link對task1.asm進行彙編、連結,得到可執行檔案task1.exe執行結果如下
使用debug工具進行除錯,執行到程式返回前,即line27之前結果如下:
修改line4裡面5個位元組單元值,重新進行彙編、連結、執行,觀察結果
db 5 dup(2) --> 改成: db 2,3,4,5,6
猜測:這裡的數值的作用主要是向視訊記憶體中寫入顏色資料
2、實驗任務2
已知資料段中定義的位元組資料如下:
data segments db 23, 50, 66, 71, 35 data ends
編寫程式,在螢幕上以十進位制整數形式列印輸出這5個兩位數。
編寫原始碼如下:
assume cs:code,ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov cx,5 mov si,0 s: mov ah,0 mov al,[si] mov bl,10 div bl mov bx,ax mov ah,2 or bl,30h mov dl,bl int 21h mov ah,2 or bh,30h mov dl,bh int 21h mov ah,2 mov dl,',' int 21h inc si loop s mov ax,4c00h int 21h code ends end start
執行結果如下
3、實驗任務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
執行結果如下:
此時檢視資料
程式返回前data段中的資料如上圖所示
返回前cs=076C ss=076B ds=076A
程式載入後code段的地址為X,則data段的地址為:X-1,stack段的段地址為:X-2
4、實驗任務4
原始碼如下:
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
執行結果如下
此時檢視資料
data資料段中的資料如上圖所示
程式返回前,cs=076C、ss=076B、ds=076A
code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1
該段實際佔有的空間為([N/16]+1)*16
5、實驗任務5
原始碼如下
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
執行結果如下:
此時檢視資料
data資料段中的資料如上圖所示
程式返回前cs=076A,ss=076E,ds=076D
code段的段地址是X,則data段的段地址為X+3,stack段的段地址是X+4
6、實驗任務6
只有task5.exe可以正確執行,應為在task5.asm中data段和stack段是定義在程式段的後面的,編譯器會順序執行
7、實驗任務7
原始碼如下:
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 ; 在整合軟體環境中,請將此處的段名稱由c→改為c1或其它名稱 db 8 dup(0) c1 ends code segment start: mov ax,a mov es,ax mov ax,c1 mov ds,ax mov bx,0 mov cx,8 s1: mov ax,es:[bx] add [bx],ax add bx,2 loop s1 mov ax,b mov es,ax mov bx,0 mov cx,8 s2: mov ax,es:[bx] add [bx],ax add bx,2 loop s2 mov ax,4c00h int 21h code ends end start
執行結果如下:
8、實驗任務8
原始碼如下:
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,10h mov ax,a mov ds,ax mov bx,0 s: push[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
執行結果如下: