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


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

使用任意文本编辑器,录入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
② 在debug中调试,观察数据段中做128位加之前,和,加之后,数据段的值的变化。

不能,add和sub对进位都有影响,替换后进位将无法被处理。

实验任务2

汇编指令代码line11-18,实现的功能是?
判断输入的字符是否为#,如果是的话跳出s1循环
2.
换行
3.
输出长为si的字符串

试验任务3

assume cs:code, ds:data
data segment
        x dw 91, 792, 8536, 65521, 2021
        len equ $ - x
data ends
 
stack segment
        db 16 dup(0)
stack ends
 
code segment
start:
        mov ax, data
        mov ds, ax
 
        mov cx, 5
        mov si, offset x
s:      mov ax, ds:[si]
        call printNumber
        call printSpace
        inc si
        inc si
        loop s
 
        mov ah, 4ch
        int 21h
 
printNumber:
        mov bx, 0AH     ;除数
        mov dx, 0       ;高位置为0,记录余数
        mov di, 0
        push cx
 s1:    div bx
        push dx         ;余数入栈
        inc di
        mov dx, 0
        cmp ax, 0       ;被除数为0时结束
        je next
        jmp s1
next:   mov ah, 2
        mov cx, di
s2:     pop dx
        or dl, 30H      ;数字转字符
        int 21h
        loop s2
 
        pop cx
        ret
 
printSpace:
        mov dl, ' '
        mov ah, 2
        int 21h
        ret
code ends
end start

试验任务4

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

stack segment
db 16 dup(0)
stack ends

code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov si,offset str1
mov cx,len
call strupr

mov ah,4ch
int 21h

strupr:
s:
mov al,ds:[si]

cmp al,'a'
jb next
cmp al,'z'
ja next

and al,0dfh;1101 1111
mov ds:[si],al

next:
inc si
loop s
ret

code ends
end start

试验任务5




试验任务 6

中断是指CPU不再接着向下执行,而是转去处理这个特殊信息。
CPU接受到中断信息后,可以立即对中断信息进行处理,用来处理中断信息的程序被称为中断处理程序。

软中断是指由软件本身发给操作系统内核的中断信号。

中断过程是先从从中断信息中取得中断类型码,然后令标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中),并设置标志寄存器的第8位TF和第9位IF的值为0。CS的内容入栈,IP的内容入栈。最后从内存地址为中断类型码4和中断类型码4+2的两个子单元中读取中断处理程序的入口地址设置IP和CS。
好文要顶


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM