1. 程式人生 > 其它 >組合語言第四次實驗

組合語言第四次實驗

1. 實驗任務1

  • task1.asm原始碼
 1 assume cs:code, ds:data
 2 
 3 data segment
 4    x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
 5    y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
 6 data ends
 7 code segment 
 8 start:
 9     mov ax, data
10     mov ds, ax
11     mov si, offset x
12     mov
di, offset y 13 call add128 14 15 mov ah, 4ch 16 int 21h 17 18 add128: 19 push ax 20 push cx 21 push si 22 push di 23 24 sub ax, ax 25 26 mov cx, 8 27 s: mov ax, [si] 28 adc ax, [di] 29 mov [si], ax 30 31 inc si 32 inc si 33 inc di 34 inc
di 35 loop s 36 37 pop di 38 pop si 39 pop cx 40 pop ax 41 ret 42 code ends 43 end start
  • 回答問題

add指令會影響標誌暫存器的值,這裡會使記錄進位值的CF位置0。從而丟失了低位加法的進位,導致計算結果錯誤。因此不能替換。

  • 除錯截圖

2. 實驗任務2

  • task2原始碼
 1 assume cs:code, ds:data
 2 data segment
 3         str db 80 dup(?)
 4 data ends
 5 
 6
code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov si, 0 11 s1: 12 mov ah, 1 13 int 21h 14 mov [si], al 15 cmp al, '#' 16 je next 17 inc si 18 jmp s1 19 next: 20 mov ah, 2 21 mov dl, 0ah 22 int 21h 23 24 mov cx, si 25 mov si, 0 26 s2: mov ah, 2 27 mov dl, [si] 28 int 21h 29 inc si 30 loop s2 31 32 mov ah, 4ch 33 int 21h 34 code ends 35 end start
  • 執行測試截圖
  • 回答問題
    • line11-18,實現的功能是接收從鍵盤上輸入的一串字元,以#結束。
    • line20-22,實現的功能是輸出ASCII碼為0a(h)的字元,即換行符。
    • line24-30,實現的功能是依次輸出先前接收的字串(#除外)。

3. 實驗任務3

  • task3.asm原始碼
 1 assume cs:code, ds:data, es:extra
 2 data segment
 3     x dw 91, 792, 8536, 65521, 2021
 4     len equ $ - x 
 5 data ends
 6 
 7 extra segment
 8     db 16 dup(0)
 9 extra ends
10 
11 code segment
12 start:mov ax,extra
13     mov es,ax
14     mov ax,data
15     mov ds,ax
16     mov si,offset x
17     mov cx,len/2
18     call printNumber
19     mov ah, 4ch
20     int 21h
21 
22 printNumber:mov ax,[si]
23     mov word ptr es:[0],0
24 ddiv:mov dx,0
25     mov bx,10
26     div bx
27 
28     or dl,30h
29     push dx
30     mov bx,es:[0]
31     add bx,1
32     mov es:[0],bx
33 
34     cmp ax,0
35     jne ddiv
36 
37     mov es:[2],cx
38     mov cx,es:[0]
39     mov ah,02h
40   s:pop dx
41     int 21h
42     loop s
43     mov cx, es:[2]
44 
45     call printSpace
46     add si,2
47     loop printNumber
48     ret
49 
50 printSpace:
51     mov dl, ' '
52     int 21h
53     ret
54 code ends
55 end start
  • 執行測試截圖

4. 實驗任務4

  • task4.asm原始碼
 1 assume cs:code, ds:data
 2 data segment
 3     str db "assembly language, it's not difficult but tedious"
 4     len equ $ - str
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax,data
10     mov ds,ax
11     mov si,offset str
12     mov cx,len
13     call strupr
14     
15     mov ah,4ch
16     int 21h
17 
18 strupr:mov al,[si]
19     cmp al,97
20     jb next
21     cmp al,122
22     ja next
23     and al,0dfh
24     mov [si],al
25 next:inc si
26     loop strupr
27     ret
28 code ends
29 end start
  • 除錯截圖

call strupr呼叫前後分別檢視資料段的值,發現strupr函式確實將小寫字母轉換成了大寫。

5. 實驗任務5

  • task5.asm原始碼
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     str1 db "yes", '$'
 5     str2 db "no", '$'
 6 data ends
 7 
 8 code segment
 9 start:
10     mov ax, data
11     mov ds, ax
12 
13     mov ah, 1
14     int 21h
15 
16     mov ah, 2
17     mov bh, 0
18     mov dh, 24
19     mov dl, 70
20     int 10h
21 
22     cmp al, '7'
23     je s1
24     mov ah, 9
25     mov dx, offset str2
26     int 21h
27 
28     jmp over
29 
30 s1: mov ah, 9
31     mov dx, offset str1
32     int 21h
33 over:  
34     mov ah, 4ch
35     int 21h
36 code ends
37 end start
  • 程式執行測試截圖
  • 程式的功能

程式的功能是檢測鍵盤輸入的字元,若為7則輸出yes,否則輸出no。

6. 實驗任務6

  • 對中斷的理解

CPU可以在執行完當前執行的指令後,檢測到從CPU外部發送過來的或內部產生的中斷資訊,包括int指令資訊。通過將中斷處理程式安裝到記憶體空間並設定中斷向量表,可以使將來通過int指令跳轉到中斷處理程式執行。