2019級軟體學院演算法習題整理
一、實驗目的
1. 理解80×25彩色字元模式顯示原理
2. 理解轉移指令jmp, loop, jcxz的跳轉原理,掌握使用其實現分支和迴圈的用法
3. 理解轉移指令call, ret, retf的跳轉原理,掌握組合使用call和ret/retf編寫彙編子程式的方法,掌握 引數傳遞方式
4. 理解標誌暫存器的作用
5. 理解條件轉移指令je, jz, ja, jb, jg, jl等的跳轉原理,掌握組合使用匯編指令cmp和條件轉移指令實 現分支和迴圈的用法
6. 瞭解在visual studio/Xcode等環境或利用gcc命令列引數反彙編c語言程式的方法,理解編譯器生成 的反彙編程式碼
7. 綜合應用定址方式和彙編指令完成應用程式設計
二、實驗準備
實驗前,請複習/學習教材以下內容:
第9章 轉移指令的原理
第10章 call和ret指令
第11章 標誌暫存器
三、實驗內容
1. 實驗任務1 教材「實驗9 根據材料程式設計」(P187-189)
程式設計:在螢幕中間分別顯示綠色、綠底紅色、白底藍色的字串'welcome to masm!'。
程式碼如下:
assume cs:code, ds:data data segment db 'welcome to masm!' db 2,36,113 data ends code segment start: mov ax, data mov ds, ax mov ax,0b800h mov es,ax mov di,0720h mov cx,3 mov bx,0 mov si,0 s0: push cx mov cx,16 mov si,0 s1: mov al,ds:[si] mov ah,ds:[bx+16] mov es:[di],ax inc si add di,2 loop s1 inc bx pop cx add di,128 loop s0 mov ah,4ch int 21h code ends end start
執行截圖:
2. 實驗任務2
編寫子程式printStr,實現以指定顏色在螢幕上輸出字串。呼叫它,完成字串輸出。
使用任意文字編輯器,錄入彙編源程式task2.asm
程式碼如下:
assume cs:code, ds:data data segment str db 'try', 0 data ends code segment start: mov ax, data mov ds, ax mov si, offset str mov al, 2 call printStr mov ah, 4ch int 21h printStr: push bx push cx push si push di mov bx, 0b800H mov es, bx mov di, 0 s: mov cl, [si] mov ch, 0 jcxz over mov ch, al mov es:[di], cx inc si add di, 2 jmp s over: pop di pop si pop cx pop bx ret code ends end start
執行截圖:
對源程式做如下修改:
把line3改為:str db 'another try', 0
把line12改為:mov al, 4
對源程式修改後的執行結果截圖:
line19-22, line36-39,這組對稱使用的push、pop,這樣用的目的是什麼?
答:儲存各暫存器的值,防止在子程式中被修改。
line30的功能是什麼?
答:將字元與顏色資訊寫入視訊記憶體。
3. 實驗任務3
使用任意文字編輯器,錄入彙編源程式task3.asm。
程式程式碼:
assume cs:code, ds:data data segment x dw 1984 str db 16 dup(0) data ends code segment start: mov ax, data mov ds, ax mov ax, x mov di, offset str call num2str mov ah, 4ch int 21h num2str: push ax push bx push cx push dx mov cx, 0 mov bl, 10 s1: div bl inc cx mov dl, ah push dx mov ah, 0 cmp al, 0 jne s1 s2: pop dx or dl, 30h mov [di], dl inc di loop s2 pop dx pop cx pop bx pop ax ret code ends end start
反彙編:
使用g命令執行,並檢視結果:
子任務2:
程式碼如下:
assume cs:code, ds:data data segment x dw 1984 str db 16 dup(0) data ends code segment start: mov ax, data mov ds, ax mov ax, x mov di, offset str call num2str mov si, offset str mov al, 2 call printStr mov ah, 4ch int 21h num2str: push ax push bx push cx push dx mov cx, 0 mov bl, 10 s1: div bl inc cx mov dl, ah push dx mov ah, 0 cmp al, 0 jne s1 s2: pop dx or dl, 30h mov [di], dl inc di loop s2 pop dx pop cx pop bx pop ax ret printStr: push bx push cx push si push di mov bx, 0b800H mov es, bx mov di, 0 s: mov cl, [si] mov ch, 0 jcxz over mov ch, al mov es:[di], cx inc si add di, 2 jmp s over: pop di pop si pop cx pop bx ret code ends end start
結果截圖:
4. 實驗任務4
使用任意文字編輯器,錄入彙編源程式task4.asm。
程式碼:
assume cs:code, ds:data data segment str db 80 dup(?) data ends code segment start: mov ax, data mov ds, ax mov si, 0 s1: mov ah, 1 int 21h mov [si], al cmp al, '#' je next inc si jmp s1 next: mov cx, si mov si, 0 s2: mov ah, 2 mov dl, [si] int 21h inc si loop s2 mov ah, 4ch int 21h code ends end start
除錯結果:
line12-19實現的功能是?
答:若輸入#,跳轉至next;否則繼續迴圈。
line21-27實現的功能是?
答:輸出輸入的字元。
5. 實驗任務5
在visual studio整合環境中,編寫一個簡單的包含有函式呼叫的c程式。
程式碼如下:
#include <stdio.h> int sum(int, int); int main() { int a = 2, b = 7, c; c = sum(a, b); return 0; } int sum(int x, int y) { return (x + y); }
設定斷點:
反彙編: