實驗4 8086標志寄存器及中斷


一、實驗目的

1. 理解標志寄存器用途,理解常用標志位CF, ZF, OF, SF, TF, IF的用途和意義。

2. 理解條件轉移指令je, jz, ja, jb, jg, jl等的跳轉原理,掌握組合使用匯編指令cmp和條件轉移指令實現 分支和循環的用法

3. 了解軟中斷指令的用法,體驗和理解中斷原理

4. 綜合應用尋址方式和匯編指令完成簡單應用編程

 

二、實驗准備

復習教材「第10章 call和ret指令」、「第11章 標志寄存器」

學習教材「第12章 內中斷 」、「第13章 int指令」

 

三、實驗內容

1. 實驗任務1

驗證性實驗:

有些匯編指令會影響到標志寄存器中的一個或多個狀態標志位。 在debug環境中,分別實踐、觀察:

① add指令對標志寄存器中的零標志位ZF(Zero Flag)、進位標志位CF(Carry Flag)是否有影響?

 

 如圖所示,在執行add指令ff+1之后,產生進位,進位標志為由NC變為CY,零標志位由NZ變為ZR。

② inc指令對標志寄存器中的零標志位ZF(Zero Flag)、進位標志位CF(Carry Flag)是否有影響?

 

 如圖所示,INC指令會影響零標志位,但不會影響進位標志位

 

 

assume cs:code, ds:data

data segment
   x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
   y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
data ends
code segment 
start:
    mov ax, data
    mov ds, ax
    mov si, offset x
    mov di, offset y
    call add128

    mov ah, 4ch
    int 21h

add128:
    push ax
    push cx
    push si
    push di

    sub ax, ax

    mov cx, 8
s:  mov ax, [si]
    adc ax, [di]
    mov [si], ax

    inc si
    inc si
    inc di
    inc di
    loop s

    pop di
    pop si
    pop cx
    pop ax
    ret
code ends
end start

其中: add128是子程序子程序。

功能:實現計算兩位128位數的加法

入口參數: ds:si指向存儲第一個128位數的存儲空間(因為一個數128位,需要8個字節的連續空間) ds:di指向存儲第二個128位數的存儲空間

出口參數: 加運算后的結果,保存在第一個數的存儲空間中,即:ds:si開始的連續8個字節空間 在代碼段種,調用add128實現對標號x和y處存儲的兩個128位數據相加,結果保存在x處的連續128個字 節中。

對程序進行匯編、鏈接,得到可執行程序task1.exe。在debug中調試程序,並回答問題。

① line31~line34的4條inc指令,能否替換成如下代碼?你的結論的依據/理由是什么?

能換成如下代碼

試:將代碼改成add指令

 

 

 

 驗證可以,因為這里不涉及到進位操作

② 在debug中調試,觀察數據段中做128位加之前,和,加之后,數據段的值的變化。

加之前:

 加之后:

 

 2. 實驗任務2

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 ah, 2
        mov dl, 0ah
        int 21h
        
        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

 對源程序task2.asm進行匯編、鏈接,得到可執行文件task2.exe。

運行程序,從鍵盤上輸入一串字符,以#結束(比如,輸入George Orwell, 1984#),觀察結果。

結合運 行結果,理解代碼並回答問題:

① 匯編指令代碼line11-18,實現的功能是?

讀入輸入的字符串,如果讀到#,表示讀結束,跳到next

② 匯編指令代碼line20-22,實現的功能是?

打印換行符

③ 匯編指令代碼line24-30,實現的功能是?

 依次打印剛剛存入的輸入字符,除了#,因為#並未存入到內存單元中。

 

3. 實驗任務3

assume cs:code, ds:data,ss:stack
data segment
        x dw 91,792,8536,65521,2021
        len equ $ - x
data ends

stack segment
    dw 8 dup(?)
stack ends

code segment
start:  
        mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,16
        mov cx,5;獲取數字的個數
        mov bx,10;16位的除數
        mov si,0

s:      
        push cx
        mov ax,word ptr [si];dx和ax存放32位被除數,dx存放高16位,ax存放低16位 

        call printNumber
        call printSpace
        add si,2
        pop cx;因為jmp指令里會改變cx的值
        loop s

        mov ah,4ch
        int 21h


printNumber:
        mov di,0
s1:    
         mov dx,0
         div bx
         push dx;把余數push進去
         inc di;數組的位數+1
         cmp ax,0
         je s2;商為0則打印
         jmp s1

s2:    mov cx,di

s3:    ;打印,並將其轉換成數字字符
        pop ax
        mov dl,al
        mov ah,2
        add dl,30h
        int 21h
        loop s3
        ret
        

printSpace:
        mov ah, 2
        mov dl, " ";打印ASCII碼值為10的換行符
        int 21h
        ret

       

code ends
end start

調試運行:

 

 

4. 實驗任務4

assume cs:code,ds:data

data segment
    str db "assembly language, it's not difficult but tedious"
    len equ $ - str
data ends

code segment
s:
    mov ax,data
    mov ds,ax
    mov cx,len
    mov si,0
    call strupr
    mov ah,4ch
    int 21h
    
strupr:
    mov al,[si]
    cmp al,' '
    je ok
    and byte ptr [si],11011111b
    

ok:    inc si
    loop strupr
    ret

code ends
end s

 

 

調用子程序之前

 

 調用子程序之后

 

 

 5. 實驗任務5

assume cs:code, ds:data

data segment
    str1 db "yes", '$'
    str2 db "no", '$'
data ends

code segment
start:
    mov ax, data
    mov ds, ax

    mov ah, 1   ;(1)
    int 21h   

    mov ah, 2  ;(2)
    mov bh, 0
    mov dh, 24
    mov dl, 70
    int 10h

    cmp al, '7'  ;(3)
    je s1
    mov ah, 9
    mov dx, offset str2
    int 21h

    jmp over

s1: mov ah, 9
    mov dx, offset str1
    int 21h
over:  
    mov ah, 4ch
    int 21h
code ends
end start

輸入7:

 

 輸入其他字符:

 

 觀察得,輸入7,則在屏幕24行70列顯示yes,輸入其他字符,則在屏幕24行70列顯示no。

程序分析

(1) 從鍵盤上輸入一個字符

(2) 設置光標位置:0頁24行70列

(3)若輸入字符等於'7',則跳轉到標號s1處,調用int 21h的9號子功能,顯示str1處的字符串"yes";

若不等於'7',則調用int 21h的9號子功能,顯示str2處的字符串"no"。

 

 6. 實驗任務6

task6_1.asm

assume cs:code

code segment
start:
    ; 42 interrupt routine install code
    mov ax, cs
    mov ds, ax
    mov si, offset int42  ; set ds:si

    mov ax, 0
    mov es, ax
    mov di, 200h        ; set es:di

    mov cx, offset int42_end - offset int42
    cld
    rep movsb

    ; set IVT(Interrupt Vector Table) 將程序裝到0:200的位置上
    mov ax, 0
    mov es, ax
    mov word ptr es:[42*4], 200h
    mov word ptr es:[42*4+2], 0

    mov ah, 4ch
    int 21h

int42: 
    jmp short int42_start
    str db "welcome to 2049!"
    len equ $ - str

    ; display string "welcome to 2049!"
int42_start:
    mov ax, cs
    mov ds, ax
    mov si, 202h

    mov ax, 0b800h
    mov es, ax
    mov di, 24*160 + 32*2

    mov cx, len
s:  mov al, [si]
    mov es:[di], al
    mov byte ptr es:[di+1], 2
    inc si
    add di, 2
    loop s

    iret
int42_end:
   nop
code ends
end start

task6_2.asm

assume cs:code

code segment
start:
    int 42    ;42*4-->ip 42*4+2-->CS

    mov ah, 4ch
    int 21h
code ends
end start

 

 理解

1、中斷、中斷信息和中斷處理程序:
中斷的意思是,CPU不再接着向下執行,而是轉去處理這個特殊信息。是指由於接收到外圍硬件(相對於CPU與內存而言)的異步信號或者來自軟件的同步信號而進行相應的硬件/軟件處理。

CPU接受到中斷信息后,可以立即對中斷信息進行處理,用來處理中斷信息的程序被稱為中斷處理程序。

2、中斷向量表:

CPU用8為的中斷類型碼通過中斷向量表找到相應的中斷處理程序的入口地址。中斷向量就是中斷處理程序的入口地址。

3、軟中斷:

由軟件本身發給操作系統內核的中斷信號。

4、中斷過程:
(1)從中斷信息中取得中斷類型碼;

(2)標志寄存器的值入棧(因為在中斷過程中要改變標志寄存器的值,所以先將其保存在棧中);

(3)設置標志寄存器的第8位TF和第9位IF的值為0;

(4)CS的內容入棧;

(5)IP的內容入棧;

(6)從內存地址為中斷類型碼*4和中斷類型碼*4+2的兩個子單元中讀取中斷處理程序的入口地址設置IP和CS。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM