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

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

 答: 由图可知,add指令对标志寄存器中的零标志位ZF有影响,对进位标志位CF也有影响。

② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
截图:

  答: 由图可知,inc指令对标志寄存器中的零标志位ZF有影响,对进位标志位CF没有影响。

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

 task1.asm
 
assume cs:code, ds:data

data segment
   x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
   y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
data ends
code segment 
start:
    mov ax, data
    mov ds, ax
    mov si, offset x
    mov di, offset y
    call add128

    mov ah, 4ch
    int 21h

add128:
    push ax
    push cx
    push si
    push di

    sub ax, ax

    mov cx, 8
s:  mov ax, [si]
    adc ax, [di]
    mov [si], ax

    inc si
    inc si
    inc di
    inc di
    loop s

    pop di
    pop si
    pop cx
    pop ax
    ret
code ends
end start
其中:
add128是子程序子程序。
功能:实现计算两位128位数的加法
入口参数:
ds:si指向存储第一个128位数的存储空间(因为一个数128位,需要8个字节的连续空间)
ds:di指向存储第二个128位数的存储空间
出口参数:
加运算后的结果,保存在第一个数的存储空间中,即:ds:si开始的连续8个字节空间 
在代码段种,调用add128实现对标号x和y处存储的两个128位数据相加,结果保存在x处的连续128个字
节中。
对程序进行汇编、链接,得到可执行程序task1.exe。在debug中调试程序,并回答问题。
汇编、链接截图:

 

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

add si, 2 
add di, 2

替换之前的截图:

 

替换之后的截图:

 

答:

不能,因为add可能改变进位标志位的值,从而影响 adc ax, [di] 的执行,而 inc 指令不会改变进位标志位的值。

但是在本题中,add si, 2 与 add di, 2并不会产生进位,所以替换代码之后程序的执行结果并不会改变。

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

已在上一小问中回答,截图已给出。

 

2. 实验任务2

assume cs:code, ds:data
data segment
        str db 80 dup(?)
data ends

code segment
start:  
        mov ax, data
        mov ds, ax
        mov si, 0
s1:        
        mov ah, 1
        int 21h
        mov [si], al
        cmp al, '#'
        je next
        inc si
        jmp s1
next:
        mov ah, 2
        mov dl, 0ah
        int 21h
        
        mov cx, si
        mov si, 0
s2:     mov ah, 2
        mov dl, [si]
        int 21h
        inc si
        loop s2

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

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

运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结果。

结合运行结果,理解代码并回答问题:

① 汇编指令代码line11-18,实现的功能是?
答:实现的功能是将输入的值赋值给ds:[si] 。判断是否为 “#”,如果是则跳转至next,如果不是则继续该循环。

② 汇编指令代码line20-22,实现的功能是?
答:实现的功能是换行。

③ 汇编指令代码line24-30,实现的功能是?
输出字符串,但不包含#。从si=0开始,将ds:[si]中的值输出。

 
3. 实验任务3
编写8086汇编源程序task3.asm,在屏幕上以十进制形式输出data段中这一组连续的数据,数据和数据
之间以空格间隔。
要求:
编写子程序printNumber
功能:以十进制形式输出一个任意位数的整数(整数范围0 ~ 65535)
入口参数:寄存器ax(待输出的数据 --> ax)
出口参数:无
编写子程序printSpace
功能:打印一个空格
入口参数:无
出口参数:无
在主体代码中,综合应用寻址方式和循环,调用printNumber和printSpace, 实现题目要求。
assume cs:code,ds:data

data segment 
    x dw 91, 792, 8536, 65521, 2021 
    len equ $ - x 
data ends

code segment
start:
   mov ax,data
   mov ds:data
   mov si,offset x
   
   mov cx,len/2
s: mov ax,[si]
   call printNumber
   call printSpace
   inc si
   inc si
   loop s
   mov ax,4c00h
   int 21h

printNumber:
    push cx
    mov cx,0
s1:mov dx,0
    mov bx,10
    div bx
    push dx
    inc cx
    cmp ax,0
    jne s1
    mov ah,2
s2:pop dx
    add dx,48
    int 21h
    loop s2
    pop cx
    ret
printSpace:
    mov ah,2
    mov dl,20h
    int 21h
    ret
code ends
end start

截图:

 

4. 实验任务4
编写8086汇编源程序task4.asm,将data段中字符串里的小写字符转换成大写。
要求:
编写子程序strupr
功能:将包含任意字符的字符串中的小写字母变成大写
入口参数
(ds:si ) 字符串首地址的段地址和偏移地址分别送至dssi
(cx) 字符串的长度
出口参数:无
在主体代码中,设置入口参数,调用strupr, 实现题目要求。

 代码:

assume cs:code,ds:data

data segment
    str db "assembly language,it's not difficult but tedious"
    len equ $ - str
data

code segment
start:
   mov ax,data
   mov ds,ax
   mov cx,len
   mov si,0
   call strupr
   mov ax,4c00h
   int 21h
strupr:
s:
   mov al,[si]
   cmp al,'a'
   jb next
   cmp al,'z'
   ja next
   sub al,32
   mov [si],al
next:
   inc si
   loop s
   ret
code ends
end start

子函数调用之前的截图:

子函数调用之后的截图:

 

 5. 实验任务5
对源程序task5.asm进行汇编、链接,得到可执行文件task5.exe

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

    mov ah, 2
    mov bh, 0
    mov dh, 24
    mov dl, 70
    int 10h

    cmp al, '7'
    je s1
    mov ah, 9
    mov dx, offset str2
    int 21h

    jmp over

s1: mov ah, 9
    mov dx, offset str1
    int 21h
over:  
    mov ah, 4ch
    int 21h
code ends
end start

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

截图:

 答:本题代码功能是判断输入是不是7,是则输出yes,否则no。

 

6. 实验任务6
实验任务1235中使用了不少系统提供的中断例程。本实验任务中,要求自行实现一个42号软中断
例程,使得通过 int 42 或 int 2ah 软中断调用,实现在屏幕最下方中间以黑底绿字打印"welcome to
2049!"
对汇编源程序task6_1.asm进行汇编、链接,得到可执行程序task6_1.exe。运行task6_1.exe,实现将
42号中断处理程序安装到0:200开始的连续内存空间,并设置中断向量表,使得将来通过 int 42 ,系统
可以跳转到中断处理程序。
对汇编源程序task6_2.asm进行汇编、链接,得到可执行程序task6_2.exe。运行task6_2.exe

结果截图:

答:本题中,程序将编写的程序送到指定位置,并设置中断向量表给出程序入口来实现自定义的软中断。

中断可分为内中断(软中断)与外中断(硬中断),当CPU检测到中断信息,它将在不再接着刚执行完

的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。

 

 

 

 

posted @ 2021-12-13 15:11  freddy2002  阅读(116)  评论(3)    收藏  举报