1. 程式人生 > 實用技巧 >2019級軟體學院演算法習題整理

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);
}

  設定斷點:

反彙編: