实验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

 

 

  • 回答问题

 

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

  add si, 2

  add di, 2

  不能替换,用add指令对si,di操作可能会影响CF位,CF位被影响后,adc命令中会产生错误的结果,而inc命令并不会影响CF位。

 

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

 

  做128位加之前,数据段值:

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

  做128位加之后,数据段值:

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

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
  • 运行测试截图

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

  • 回答问题

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

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

  从键盘上读入字符,存入到data段中,若输入字符为‘#’,则跳到next标号执行程序。

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

  在屏幕上打印换行符,实现换行。

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

  将data段中的内容打印到屏幕上。

3. 实验任务3

此部分书写内容:

  • task3.asm源码
 1 assume cs:code
 2 data segment 
 3     x dw 91, 792, 8536, 65521, 2021 
 4     len equ $ - x 
 5 data ends
 6 stack segment
 7 db 16 dup(0)
 8 stack ends
 9 code segment
10 start:
11     mov ax,data
12     mov ds,ax
13     mov ax,stack
14     mov ss,ax
15     mov sp,16
16     mov di,offset x
17 
18     mov ax,len ;长度为10,执行5次循环,除2
19     mov bl,2
20     div bl
21     mov ah,0
22 
23     mov cx,ax
24     s1:mov ax,[di] ;将data段里的值赋值给ax
25        mov bx,10 ;除数放在bx中
26        mov si,0
27        call printNumber
28        call printSpace
29        add di,2
30        loop s1
31 
32     mov ah,4ch
33     int 21h
34 
35 
36 printNumber:mov dx,0
37         div bx 
38         push dx ;余数存放在dx中
39         inc si ;入栈次数
40         cmp ax,0 ;商存放在ax中
41         je pp
42         jmp printNumber
43 pp:pop dx
44    mov ah,2
45    or dl,30h
46    int 21h
47 
48    dec si ;si减1
49    cmp si,0
50    je s
51    jmp pp
52 
53 s:ret
54 
55 printSpace:mov ah,2
56        mov dl, ' '
57        int 21h
58        ret
59     
60 code ends
61 end start
  • 运行测试截图

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

4. 实验任务

此部分书写内容:

  • task4.asm源码
     1 assume cs:code
     2 data segment
     3     str db "assembly language, it's not difficult but tedious" 
     4     len equ $ - str 
     5 data ends
     6 code segment
     7 start:mov ax,data
     8       mov ds,ax
     9       mov si,0
    10       mov cx,len
    11       s:call strupr
    12         inc si
    13         loop s
    14 
    15       mov ah,4ch
    16       int 21h
    17 
    18 strupr:mov dl,[si]
    19        cmp dl,97
    20        jb s1 ;小于97-a则跳出
    21        cmp dl,122
    22        ja s1 ;大于122-z则跳出
    23        sub dl,32
    24        jmp s1
    25 
    26 s1:mov ah,2
    27    int 21h
    28    ret
    29 
    30 code ends
    31 end start
  • 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

 

  call strupr调用前,数据段的值:

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

  call strupr 调用后,数据段的值:

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

 

 

   运行结果如图:

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

 

 

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,以及输入其他字符,运行结果截图)

 

  输入7:

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

  输入其他字符:

 

 

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

  • 程序的功能是?

  输入一个字符,若输入字符为7,则将数据段中str1的内容显示,否则显示str2的内容,显示位置为第24行的第70列。

 

6. 实验任务6

 

此部分书写内容:

 

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

 

  执行task6_2的int 42命令后,cpu取得中断类型码42,并将IP设为42*4,CS设为42*4+2,由于执行task6_1后,系统中

  0:42*4+2所在地址的值已变为0,0:42*4所在地址的值已变为200h,所以程序将跳转到0:200h的地址处执行,

  该地址处存放的内容即时打印“welcome to 2049!”的代码,所以cpu会执行该处代码,显示打印内容。

 

上一篇:欧几里得算法解二元一次不定方程总结


下一篇:汇编语言.实验4