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

实验任务1

验证性实验:有些汇编指令会影响到标志寄存器中的一个或多个状态标志位。 在debug环境中,分别实践、观察: ① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响? 对 ZF 和 CF 标志位都有影响     ② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响? 对 ZF 标志位有影响,但是对 CF 标志位没有影响

 

① line31~line34 的 4 条 inc 指令,能否替换成

add si, 2

add di, 2

你的结论的依据 / 理由是什么?

不能改为add __, 2,因为add影响到了标志位,而ADC正是用到标志位的指令

 前:

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

 

后:

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

 

 

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


运行程序,从键盘上输入一串字符,以 #结束(比如,输入 George Orwell, 1984#),观察结果: 实验4 8086标志寄存器及中断

 

  运行程序,从键盘上输入一串字符,以 #结束(比如,输入 George Orwell, 1984#),观察结果。结合运行结果,理解代码并回答问题: ① 汇编指令代码 line11-18,实现的功能是? 调用int 21h的1号输入功能,从键盘上读入一个不是 #的字符存入 al。 ② 汇编指令代码 line20-22,实现的功能是? 调用int 21h的2号输出功能,输出dl存放的换行。 ③ 汇编指令代码 line24-30,实现的功能是? 调用int 21h的2号输出功能,输出dl存放的字符 

实验任务3

 

针对8086CPU,已知逻辑段定义如下:

1 data segment
2 x dw 91, 792, 8536, 65521, 2021
3 len equ $ - x
4 data ends

编写8086汇编源程序task3.asm,在屏幕上以十进制形式输出data段中这一组连续的数据,数据和数据 之间以空格间隔。

要求:

编写子程序printNumber

功能:以十进制形式输出一个任意位数的整数(整数范围0 ~ 65535)

入口参数:寄存器ax(待输出的数据 --> ax)

出口参数:无

编写子程序printSpace

功能:打印一个空格

入口参数:无

出口参数:无

在主体代码中,综合应用寻址方式和循环,调用printNumber和printSpace, 实现题目要求。

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     x    dw  91, 792, 8536, 65521, 2021
 5     len  equ $- x
 6 data ends
 7 
 8 stack segment
 9           db 16 dup(0)
10 stack ends
11 
12 code segment
13 start:      
14         mov  ax, data
15         mov  ds, ax
16 
17         mov  si,offset x
18         mov  cx,5
19 
20 s:          
21         mov  ax,[si]
22         call printNumber
23         call printSpace
24 
25         inc  si
26         inc  si
27         loop s
28 
29         mov  ah, 4ch
30         int  21h
31 printNumber:
32         push bx
33         push di
34         push cx
35 
36         mov  cx,0
37         mov  di,0
38 to10:       
39         mov  dx,0 ;除 余数推 栈
40         mov  bx,10
41         div  bx
42         or   dl,30h
43         push dx
44         inc  di
45         cmp  ax,0
46         jne  to10
47         mov  cx,di
48 cout:       
49         pop  dx 
50         mov  ah,2
51         int  21h
52         loop cout
53 
54         pop  cx
55         pop  di
56         pop  bx
57         ret
58 
59 printSpace: 
60         mov  dl,' '
61         int  21h
62         ret
63 code ends
64 end start

 

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

 

实验任务4

针对8086CPU,已知逻辑段定义如下:

1 data segment
2 str db "assembly language, it's not difficult but tedious"
3 len equ $ - str
4 data ends

编写8086汇编源程序task4.asm,将data段中字符串里的小写字符转换成大写。

要求:

编写子程序strupr

功能:将包含任意字符的字符串中的小写字母变成大写

入口参数

   (ds:si ) 字符串首地址的段地址和偏移地址分别送至ds和si

   (cx) 字符串的长度

出口参数:无

在主体代码中,设置入口参数,调用strupr, 实现题目要求。

 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 code segment
 7 start:
 8     mov ax,data
 9     mov ds,ax
10     mov si,offset str
11     mov cx,len
12     call strupr
13     mov ah,4ch
14     int 21h
15 strupr:
16     mov ax,0
17     mov al,ds:[si]
18     cmp al,61h
19     jb continue
20     sub al,20h
21     mov ds:[si],al
22     continue:
23         inc si
24         loop strupr
25         ret
26 code ends
27 end start

运行结果,正常

运行前

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

 

 运行后

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

实验任务5

使用任意文本编辑器,录入8086汇编源码task5.asm。

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

 

对源程序task5.asm进行汇编、链接,得到可执行文件task5.exe。

运行程序,输入7,观察结果。输入其他字符,观察结果。结合运行结果和注释,理解代码实现的功能。

说明:task5.asm中,使用用到的DOS系统功能调用和BIOS中断例程

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

 

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

 

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

程序功能:键盘输入一个字符,若是”7”,则在第24行,第70列显示字符串”yes”,否则,在第24行,第70列显示字符串”no”。

 

实验任务6

实验任务1、2、3、5中使用了不少系统提供的中断例程。本实验任务中,要求自行实现一个42号软中断 例程,使得通过 int 42 或 int 2ah 软中断调用,实现在屏幕最下方中间以黑底绿字打印"welcome to 2049!"。

建议配合教材第12章学习理解并实践。

task6_1.asm

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

 

 

 

上一篇:实验4 8086标志寄存器及中断


下一篇:Vue.extend 编写 Toast