組合語言第四次實驗
阿新 • • 發佈:2021-12-14
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 movdi, 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 incdi 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 6code 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指令跳轉到中斷處理程式執行。