ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-10 17:02:33  阅读:130  来源: 互联网

标签:8086 code 中断 mov si 寄存器 ax data ds


1. 实验任务1

ZF:NZ->ZR

CF:NC->CY

ZF:NZ->ZR

CF没有变化

源码:

 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指令,能否替换成如下代码?你的结论的依据/理由是什么?

1 add si, 2
2 add di, 2

答:本题中数据没有进位问题可以替换,实际中不一定可以替换。

inc指令:

 add指令:

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

加之前:

 加之后:

 

2. 实验任务2

源码:

 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,实现的功能是?

:获取从键盘输入的字符串,并判断是不是#,是的话跳转到next段。

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

:有0ah和代码段功能知,是输出一个换行符。

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

:输出数据段中保存的字符串。

 

3. 实验任务3

源码:

 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 stack segment
 7     db 64 dup(0)
 8     top equ $+1
 9 stack ends
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov ax,stack
15     mov ss,ax
16     mov sp,top
17 
18     mov cx,len/2
19     mov bx,0
20 s1:  
21     mov ax,ds:[bx]
22     push bx
23     push cx
24     call printNumber
25     call printSpace
26     pop cx
27     pop bx
28     add bx,2
29     loop s1
30 
31     mov ah,4ch
32     int 21h
33 
34 printNumber:
35     ;ax dx
36     ;ax 被除数,直到
37     ;cx计有多少位,然后循环出栈输出
38     mov bx,10
39     mov cx,0
40 s2:
41     mov dx,0
42     div bx
43     ;ax 商
44     ;dx 余数
45     push dx
46     inc cx
47     cmp ax,0
48     jne s2
49 
50 s3:
51     mov ah,2
52     pop dx
53     or dl,30h
54     int 21h
55     loop s3
56     ret
57 
58 printSpace:
59     mov ah,2
60     mov dl,20h
61     int 21h
62     ret
63 
64 code ends
65 end start

结果

 

4. 实验任务4

 源码:

 1 assume cs:code,ds:data
 2 data segment
 3     str db "assembly language, it's not difficult but tedious"
 4     len = ($ - str)
 5 data ends
 6 stack segment
 7     db 128 dup(0)
 8     top equ $ + 1
 9 stack ends
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov ax,stack
15     mov ss,ax
16     mov sp,top
17 
18     mov si,0
19     mov cx,len
20     call strupr
21     mov ah,4ch
22     int 21h
23 strupr:
24 ;0100 0001 A
25 ;0110 0001 a
26 s:
27     cmp byte ptr ds:[si],61h
28     jb s1;无符号小于则跳转
29     cmp byte ptr ds:[si],7ah
30     ja s1;无符号大于则跳转
31     mov dl,ds:[si]
32     and dl,11011111B
33     mov ds:[si],dl
34 s1: 
35     inc si
36     loop s
37     ret
38 code ends
39 end start

调试截图

 call strupr 之前:

  call strupr 之后:

 

5. 实验任务5

源码:

 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 n 指令时,立即产生一个软件中断,中断的类型由指令中的n指明。因为指令中可以指定任何的类型号,故此指令可以方便地用来调试为外设编好的中断服务程序。

 

标签:8086,code,中断,mov,si,寄存器,ax,data,ds
来源: https://www.cnblogs.com/donaghy/p/15670990.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有