1. 程式人生 > 其它 >frappe-charts圖表外掛

frappe-charts圖表外掛

一、實驗目的


  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和rat指令
第11章 標誌暫存器

三、實驗內容


1.實驗任務1

教材【實驗9 根據材料程式設計】(P187-189)

程式設計:在螢幕中間分別顯示綠色、綠底紅色、白底藍色的字串'welcome to masm!'。

實驗程式碼:

assume cs:codesg, ds:datasg, ss:stacksg

datasg segment
    db 'welcome to masm!'                     
    db 02H, 0A4H, 71H, 0, 0, 0, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0 dw 12*160+64, 13*160+64, 14*160+64, 0, 0, 0, 0, 0 datasg ends stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends codesg segment start: mov ax, stacksg mov ss, ax mov sp, 16 mov ax, datasg mov ds, ax mov ax, 0B800H mov es, ax mov cx, 3
mov bx, 16 mov di, 32 s0: push cx mov cx, 16 mov bp, [di] mov si, 0 s1: mov al, [si] mov ah, [bx] mov es:[bp], ax add bp,2 add si,1 loop s1 pop cx add bx, 1 add di, 2 loop s0 mov ax,4c00H int 21H codesg ends end start
  • edit命令進入檔案編輯

  • 彙編、連結、執行

2.實驗任務2

編寫子程式printStr,實現以指定顏色在螢幕上輸出字串,呼叫它,完成字串輸出。

子程式printStr
  • 功能:以指定顏色在螢幕上(從螢幕左上角開始)輸出字串
  • 要求:字串以0結尾
  • 入口引數
    • 字串的起始地址——>ds:si(其中,字串所在段的段地址——>ds,字串的起始地址的偏移地址——>si)
    • 字串的顏色——>ai
  • 出口引數:無

使用任意文字編輯器,錄入彙編源程式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 ; 設定入口引數si
mov al, 2 ; 設定入口引數al
call printStr
mov ah, 4ch
int 21h
printStr:
push bx
push cx
push si
push di
mov bx, 0b800H
mov es, bx
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
  • 使用edit命令編輯test4-2.asm

  • 彙編、連結、執行

對源程式做以下修改:

把line3改為:

1 str db 'another try', 0

把line12改為:

1 mov al, 4

再次彙編、連結、執行,檢視結果:

問題分析:

  1. push、pop對稱的使用是避免程式碼區域性的更改會對演算法產生影響,臨時儲存資料進行資料保護。
  2. line30的功能:將目標值儲存到目標地址內,顯示的字元和它的顏色屬性值佔兩個位元組,所以每次偏移地址di需要每次+2

3.實驗任務3

使用任意文字編輯器,錄入彙編源程式task3.asm。

子程式num2str
  • 功能:把0~2559之間的任意整數轉換成數字字串,例如,把1984轉換成'1984'
  • 入口引數
    • 要轉換的整數 —> ax
    • 數字字串的起始地址 —> ds:di (其中:數字字串所在段的段地址—> ds,字串 起始地址的偏移地址—>di)
  • 出口引數:無
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

閱讀原始碼,理解子程式num2str的彙編實現。

  • 子任務1

對task3.asm進行彙編、連結,得到可執行程式後,在debug中使用u命令反彙編,使用g命令執行 到line15(程式退出之前),使用d命令檢視資料段內容,觀察是否把轉換後的數字字串'1984'存放 在資料段中str標號後面的單元。

可以看到1984確實是存入str標號後面的單元了。

  • 子任務2

對task3.asm原始碼進行修改、完善,把task2.asm中用於輸出以0結尾的字串的子程式加進來, 實現對轉換後的字串進行輸出。

4.實驗任務4

使用任何文字編輯器,錄入彙編程式段test4-4.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
  • 使用edit命令編輯test4-4.asm檔案

  • 彙編、連結、執行

問題分析:

  • line12-19:定義“#“作為輸入結束的標誌;利用int 21h從鍵盤輸入單個字元,然後通過cmp判斷輸入的字元是否為終止字元”#“
  • line21-27:讀取si的值cx,迴圈輸出輸入的值。

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

在line7, line13分別設定斷點,在除錯模式下,檢視反彙編程式碼。 分析反彙編程式碼,從彙編的角度,觀察高階語言中引數傳遞和返回值是通過什麼實現的,以及,引數入 棧順序,返回值的帶回方式,等等。

  • 編寫程式,設定斷點

  • 反彙編