实验4 8086标志寄存器及中断

四、实验结论

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
View Code

 

回答问题

line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?

   不能,add指令会影响标志寄存器CF,而inc指令不会影响CF。

 

在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截

图。

  开始前数据段:

 

 

   做128位加之后:

 

 

 2. 实验任务2

此部分书写内容:

程序task2.asm源码运行测试截图

 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
View Code

 

 

回答问题

运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结 果。结合运行结果,理解代码并回答问题:

① 汇编指令代码line11-18,实现的功能是?

  从屏幕中读入一段字符串,以 '#' 表示输入结束。结果保存在DS:[SI]中

 

② 汇编指令代码line20-22,实现的功能是?

  打印一个换行符。

③ 汇编指令代码line24-30,实现的功能是?

  输出用户输入的字符,即保存在DS:[SI]中的数据

说明:task2.asm中用到的两个DOS系统功能调用:

DOS系统功能调用int 21h的1号子功能

功能:从键盘上输入单个字符

入口参数:(ah) = 1

出口参数: (al)存放输入字符的ASCⅡ码 即:

 

 

 DOS系统功能调用int 21h的2号子功能

功能:输出单个字符到屏幕上

入口参数:(ah) = 2, (dl) = 待输出的字符或其ascⅡ码

出口参数:无 即:

3. 实验任务3

此部分书写内容:

task3.asm源码

 1 assume cs:code, ds:data
 2 data segment
 3     x dw 91, 792, 8536, 65521, 2021
 4     len equ $ - x
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax,data
10     mov ds,ax
11         
12     mov si,0
13     mov cx,len/2
14     
15 s:
16     mov ax,word ptr[si]     ;除数(低16位)
17         
18     push cx     ;保存主程序的cx(注:循环内保存)
19     
20     call printNumber
21     call printSpace
22 
23     pop cx      ;取出cx
24     
25     inc si
26     inc si 
27     loop s
28 
29 printNumber:
30     mov bx,10   ;除数   
31     mov di,0    ;记录位数
32 
33 s1:
34     mov dx,0    ;高16位置0
35     div bx
36     push dx     ;保存余数
37     inc di      ;位数加1
38     cmp ax,0    ;判断除数是否为0
39     jne s1      ;不为0继续
40    
41    
42     mov cx,di
43 print:          ;打印保存的余数
44     pop dx   
45     mov ah,2
46     or dl,30h   ;将数字转为字符
47     int 21h
48     loop print
49 
50     ret
51 
52 printSpace:
53     mov ah,2
54     mov dl,' '
55     int 21h
56     ret
57 code ends
58 end start
View Code

 

运行测试截图

 

 4. 实验任务4

此部分书写内容:

task4.asm源码

assume cs:code,ds:data
data segment
    str1 db "assembly language, it's not difficult but tedious"
    len equ $ - str1
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    
    mov di,offset str1
    mov cx,len
    
    call toUpper
    
    
    mov cx,len
    mov di,0        ;将di重新置0
s:
    call print
    inc di
    loop s
        
    mov ah, 4ch
    int 21h
    
toUpper:            ;转为大写(入口参数:ds:[di],cx循环次数)
    mov al,[di]
    
    cmp al,97        ;'a'的Ascall
    jb next            ;<97 跳过
    cmp al,122        ;'z'的Ascall
    ja next            ;>122 跳过
        
    and al,11011111b    ;转为大写
    mov [di],al        ;保存到数据段
    
next:                ;下一个字符
    inc di
    loop toUpper    
    ret

print:                ;打印(入口参数:ds:[di])
    mov dl,[di]
    mov ah,2
    int 21h
    
    ret
    

code ends
end start
View Code

 

在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

 

 

 

 5. 实验任务5

此部分书写内容:

task5.asm源码

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
    int 21h            ;接受一个数字存放在al中

    mov ah, 2        ;设置光标位置    
    mov bh, 0        ;页号
    mov dh, 24        ;行号
    mov dl, 70        ;列号
    int 10h

    cmp al, '7'        ;输入的数字与'7'比较
    je s1            ; == 跳转到 s1
    mov ah, 9        ; 显示 ds:[dx] 即str2 处字符串
    mov dx, offset str2        ;输入首字符的偏移地址
    int 21h

    jmp over

s1: mov ah, 9        ; 显示 ds:[dx] 即str1 处字符串
    mov dx, offset str1 
    int 21h
over:  
    mov ah, 4ch
    int 21h
code ends
end start
View Code

 

 

程序运行测试截图(输入7,以及输入其他字符,运行结果截图)

输入7

 

输入其他字符

 

 

程序的功能是?

  接受用户输入的一个字符,如果输入的字符为'7'则在第0页第24行第70列显示'yes'字符串

否则则显示'no'字符串。

6. 实验任务6

此部分书写内容:

通过此项实现任务,你对中断、软中断实现机制的理解

  中断是指CPU在接收到外部发送的或内部产生的一种特殊信息时,会立即处理特殊信息;

中断是指CPU内部产生特殊信息(如除法错误、单步执行、执行into指令和执行int指令)时,立即处理该情况。

自己选一个未被使用的中断码,实现一个中断例程,并调用测试。

给出源码和运行测试截图。

task4_6_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)
    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
    str1 db "welcome to 2049!"
    len equ $ - str1

    ; 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
View Code

 

task4_6_2.asm

assume cs:code

code segment
start:
    int 42

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

 

(选做 *) 如选做,请说明你使用的中断码,并描述你实现的这个中断例程的功能。

posted @ 2021-12-13 21:59  /muteall  阅读(122)  评论(1)    收藏  举报