1. 程式人生 > 其它 >實驗四 8086標誌暫存器及中斷

實驗四 8086標誌暫存器及中斷

實驗任務1

(1)

答:對ZF和CF都有影響。

(2)

答:對ZF有影響,對CF無影響。

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 si, 2
add di, 2 12

改前

改後

結果一樣說明可以換,因為雖然adc會加上CF,但本實驗中的128位加法中的每個字都未產生進位,所以可以替換,沒有錯誤發生。
② 在debug中除錯,觀察資料段中做128位加之前,和,加之後,資料段的值的變化
加之前:

加之後:



實驗任務2
assume cs:code, ds:data
data segment
    strr 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.exe。 執行程式,從鍵盤上輸入一串字元,以#結束(比如,輸入George Orwell, 1984#),觀察結果。結合運 行結果,理解程式碼並回答問題: ① 彙編指令程式碼line11-18,實現的功能是? ② 彙編指令程式碼line20-22,實現的功能是? ③ 彙編指令程式碼line24-30,實現的功能是?

答:
①接收使用者輸入直到使用者輸入了一個'#',存入資料段
②換行
③逐個列印資料段中字元,除了最後一個

DOS系統功能呼叫int 21h的1號子功能
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 1234567891011121314151617181920212223242526272829303132333435
功能:從鍵盤上輸入單個字元
入口引數:(ah) = 1
出口引數: (al)存放輸入字元的ASCⅡ碼

mov ah, 1 int 21h ; (al) <-- 輸入字元的ascⅡ碼
DOS系統功能呼叫int 21h的2號子功能
功能:輸出單個字元到螢幕上
入口引數:(ah) = 2, (dl) = 待輸出的字元或其ascⅡ碼
出口引數:無
即:
mov ah, 2 mov dl, ×× ; ××是待輸出的字元,或,其ascⅡ碼 int 21h

實驗任務3

針對8086CPU,已知邏輯段定義如下:

data segment x
	dw 91, 792, 8536, 65521, 2021
	len equ $ - x
data ends

編寫8086彙編源程式task3.asm,在螢幕上以十進位制形式輸出data段中這一組連續的資料,資料和資料之間以空格間隔。
要求:

  • 編寫子程式printNumber
    • 功能:以十進位制形式輸出一個任意位數的整數(整數範圍0 ~ 65535)
    • 入口引數:暫存器ax(待輸出的資料 --> ax)
    • 出口引數:無
  • 編寫子程式printSpace
    • 功能:列印一個空格
    • 入口引數:無
    • 出口引數:無
  • 在主體程式碼中,綜合應用定址方式和迴圈,呼叫printNumber和printSpace, 實現題目要求。

點選檢視task3.asm

結果:

實驗任務4

針對8086CPU,已知邏輯段定義如下:

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

編寫8086彙編源程式task4.asm,將data段中字串裡的小寫字元轉換成大寫.
要求:

  • 編寫子程式strupr
    • 功能:將包含任意字元的字串中的小寫字母變成大寫
    • 入口引數
      • (ds:si ) 字串首地址的段地址和偏移地址分別送至ds和si
      • (cx) 字串的長度
    • 出口引數:無
  • 在主體程式碼中,設定入口引數,呼叫strupr, 實現題目要求。

點選檢視task4.asm

結果:

實驗任務5

使用任意文字編輯器,錄入8086彙編原始碼task5.asm。

點選檢視task5.asm
執行程式,輸入7,觀察結果。輸入其他字元,觀察結果。結合執行結果和註釋,理解程式碼實現的功能。 說明:task5.asm中,使用用到的DOS系統功能呼叫和BIOS中斷例程

DOS系統功能呼叫int 21h的9號子功能
功能:顯示字串
入口引數:(ah) = 9,(ds:dx) = 字串的首地址的段地址和偏移地址
出口引數: 無
其它要求:字串必須以$結束
即:
mov ah, 9 mov ds, ×× ; ××是待輸出字串所在段的段地址 mov dx, ×× ; ××是待輸出字串第一個字元的偏移地址 int 21h
BIOS中斷例程int 10h的2號子功能
功能:設定游標位置
入口引數:(ah) = 2, (bh) = 頁號(預設取0), (dh) = 行號, (dl) = 列號
出口引數:無
即:
mov ah, 2 mov bh, ×× ; ××是頁號 mov dh, ×× mov dl, ×× ; ××是列號 int 10h

結果:

經過嘗試,該程式的功能就是判斷使用者輸入是否為'7',是就列印'yes',不是就列印'no'。

實驗任務6

實驗任務1、2、3、5中使用了不少系統提供的中斷例程。本實驗任務中,要求自行實現一個42號軟中斷例程,使得通過 int 42 或 int 2ah 軟中斷呼叫,實現在螢幕最下方中間以黑底綠字列印"welcome to 2049!"。

點選檢視task6_1.asm 點選檢視task6_2.asm
對彙編源程式task6_1.asm進行彙編、連結,得到可執行程式task6_1.exe。執行task6_1.exe,實現將42號中斷處理程式安裝到0:200開始的連續記憶體空間,並設定中斷向量表,使得將來通過 int 42 ,系統可以跳轉到中斷處理程式。
通過此項實現任務,你對中斷、軟中斷的理解:

    1. 在電腦科學中,中斷是指由於接收到外圍硬體(相對於CPU與記憶體而言)的非同步訊號或者來自軟體的同步訊號而進行相應的硬體/軟體處理。
    2. 由軟體本身發給作業系統核心的中斷訊號,稱之為軟中斷。通常是由硬中斷處理程式或程序排程程式對作業系統核心的中斷,也就是我們常說的系統呼叫(System Call)了。