實驗3 轉移指令跳轉原理及其簡單應用程式設計 201983290153呂軒皓
阿新 • • 發佈:2021-11-28
一、實驗目的
1. 理解和掌握轉移指令的跳轉原理 2. 掌握使用call和ret指令實現子程式的方法,理解和掌握其引數傳遞方式 3. 理解和掌握80×25彩色字元模式顯示原理 4. 綜合應用定址方式和彙編指令完成簡單應用程式設計 二、實驗準備 複習教材9-10章: 轉移指令的跳轉原理 彙編指令jmp, loop, jcxz, call, ret, retf的用法 三、實驗內容 1. 實驗任務1 使用任何一款文字編輯器,錄入8086彙編程式原始碼task1.asm。 task1.asm assume cs:code, ds:datadata segment
x db 1, 9, 3
len1 equ $ - x
y dw 1, 9, 3
len2 equ $ - y
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, offset x
mov cx, len1
mov ah, 2
s1:mov dl, [si]
or dl, 30h
int 21h
mov dl, ' '
int 21h
inc si
loop s1
mov ah, 2
mov dl, 0ah
int 21h
mov si, offset y
mov cx, len2/2
mov ah, 2
s2:mov dx, [si]
or dl, 30h
int 21h
mov dl, ' '
int 21h
add si, 2
loop s2
mov ah, 4ch
int 21h
code ends
end start v> 對源程式進行彙編、連結,得到可執行程式task1.exe,執行後,結合執行結果和註釋,及必要的debug 除錯:
2. 回答問題 ① line27, 彙編指令 loop s1 跳轉時,是根據位移量跳轉的。通過debug反彙編,檢視其機器碼, 分析其跳轉的位移量是多少?(位移量數值以十進位制數值回答)從CPU的角度,說明是如何計算得 到跳轉後標號s1其後指令的偏移地址的。 答:跳轉位移量是14,loop命令的機器碼為E2F2,F2八位二進位制形式為11110010,補碼為10001110,補碼二進位制數即為跳轉位移值 ② line44,彙編指令 loop s2 跳轉時,是根據位移量跳轉的。通過debug反彙編,檢視其機器碼, 分析其跳轉的位移量是多少?(位移量數值以十進位制數值回答)從CPU的角度,說明是如何計算得 到跳轉後標號s2其後指令的偏移地址的。
答:跳轉位移量是16,loop命令的機器碼為E2F0,F0八位二進位制形式為11110000,補碼為10010000,補碼二進位制數即為跳轉位移值
2. 實驗任務2 使用任何一款文字編輯器,錄入8086彙編程式原始碼task2.asm。 task2.asm assume cs:code, ds:data
data segment
dw 200h, 0h, 230h, 0h
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax, data
mov ds, ax
mov word ptr ds:[0], offset s1
mov word ptr ds:[2], offset s2
mov ds:[4], cs
mov ax, stack
mov ss, ax
mov sp, 16
call word ptr ds:[0]
s1: pop ax
call dword ptr ds:[2]
s2: pop bx
pop cx
mov ah, 4ch
int 21h
code ends
end start ① 根據call指令的跳轉原理,先從理論上分析,程式執行到退出(line31)之前,暫存器(ax) = ? 暫存器 (bx) = ? 暫存器(cx) = ? 答:ax=0021,bx=0026,cx=076c ② 對源程式進行彙編、連結,得到可執行程式task2.exe。使用debug除錯,觀察、驗證除錯結果與理論 分析結果是否一致。 答:debug之後,結果正確
3. 實驗任務3 針對8086CPU,已知邏輯段定義如下: data segment
x db 99, 72, 85, 63, 89, 97, 55
len equ $- x
data ends
編寫8086彙編源程式task3.asm,在螢幕上以十進位制形式輸出data段中這一組連續的資料,資料和資料 之間以空格間隔。 要求: 編寫子程式printNumber 功能:以十進位制形式輸出一個兩位數 入口引數:暫存器ax(待輸出的資料 --> ax) 出口引數:無 編寫子程式printSpace 功能:列印一個空格 入口引數:無 出口引數:無 在主體程式碼中,綜合應用定址方式和迴圈,呼叫printNumber和printSpace, 實現題目要求。 程式碼編寫: assume cs:code, ds:datadata segment
x db 99, 72, 85, 63, 89, 97, 55
len equ $- x
data ends
code segment
start:
mov ax, data
mov ds, ax
mov cx,len
mov si,0
s: mov ah,0
mov al,[si]
mov bx,offset printnumber
call bx
mov bx,offset printSpace
call bx
inc si
loop s
mov ah, 4ch
int 21h
printnumber:
mov bl,10
div bl
mov bx,ax
mov ah,2
mov dl,bl
or dl,30h
int 21h
mov dl,bh
or dl,30h
int 21h
ret
printSpace:
mov ah,2
mov dl,' '
int 21h
ret
code ends
end start
4. 實驗任務4
針對8086CPU,已知邏輯段定義如下:
data segment
str db 'try'
len equ $ - str
data ends
編寫8086彙編源程式task4.asm,在螢幕上以指定顏色、指定行,在螢幕上輸出字串。 要求: 編寫子程式printStr 功能:在指定行、以指定顏色,在螢幕上顯示字串 入口引數 字串首字元地址 --> ds:si(其中,字串所在段的段地址—> ds, 字串起始地址的偏 移地址—> si) 字串長度 --> cx 字串顏色 --> bl 指定行 --> bh (取值:0 ~24) 出口引數:無
在主體程式碼中,兩次呼叫printStr,使得在螢幕最上方以黑底綠字顯示字串,在螢幕最下方以黑 底紅色顯示字串 程式碼編寫: assume cs:code, ds:data
data segment
str db 'try'
len equ $ - str
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax,0B800H
mov es,ax
mov si,offset printStr
mov ah,2
mov bx,0
call si
mov si,offset printStr
mov ah,4
mov bx,0F00H
call si
mov ah, 4ch
int 21h
printStr:
mov cx,len
mov si,0
s: mov al,[si]
mov es:[bx+si],ax
inc si
inc bx
loop s
ret
code ends
end start 效果演示: 5. 實驗任務5 針對8086CPU,針對8086CPU,已知邏輯段定義如下:
data segment stu_no db '20498329042' len = $ - stu_no data ends
在80×25彩色字元模式下,在螢幕最後一行正中間顯示學號。要求輸出視窗藍底,學號和兩側折線,以 白色前景色顯示。 注*: 1. 80×25彩色字元模式顯示緩衝區結構,參見教材「實驗9 根據材料程式設計」裡的說明。 2. 編寫程式實現時,將data段的學號換成自己的學號。 程式碼編寫: assume cs:code, ds:data
data segment
stu_no db '201983290153'
len = $ - stu_no
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax,0B800H
mov es,ax
mov cx,0780H
mov ah,10H
mov al,' '
mov bx,0
s: mov es:[bx],ax
add bx,2
loop s
mov cx,80
mov ah,17H
mov al,'-'
s1: mov es:[bx],ax
add bx,2
loop s1
mov cx,len
mov bx,0F44H
mov si,0
s2: mov al,[si]
mov es:[bx],ax
inc si
add bx,2
loop s2
mov ah, 4ch
int 21h
code ends
end start 效果演示: