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

1、实验任务1

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

 

不可以替换,因为add语句会产生进位,影响CF标志位的值,导致计算结果出错。
 
之前:
  

之后:

  

2、实验任务2

task2.asm源码:

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

 

 

  运行截图:

  

 

 
 
(1).将al中的输入字符存到si中,并与‘#’进行比较,若相同,跳出循环,若反之,则继续循环。
(2).输出换行符,进行换行。
(3).输出除‘#’以外的所有输入字符,因为‘#’并没有令si增一,循环输出时的次数是si,所以不会输出‘#’
 
 

3、实验任务3

task3.asm源码:

assume cs:code,ds:data

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

stack segment
dw 32 dup(0)
stack ends

code segment
start:
mov ax,data
mov ds,ax
mov cx,len/2
mov di,offset x
mov bx,10
mov ax,stack
mov ss,ax
mov sp,32
s:
mov ax,[di]
push cx
call printNumber
call printSpace
pop cx
add di,2
loop s

mov ax,4c00h
int 21h

printNumber:

mov cx,0
s1:
mov dx,0
div bx
push dx
inc cx
cmp ax,0
je s2
jmp s1

s2:
pop dx
or dl,30h
mov ah,2
int 21h
loop s2

ret
printSpace:
mov ah,2
mov dl,020h
int 21h
ret

code ends
end start

 

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 ax, stack
mov ss, ax
mov sp, 16
mov si, offset x

mov cx, 5

s:
mov ax, ds:[si]
call printNumber
call printSpace
add si, 2
loop s

mov ah, 4ch
int 21h


printNumber:
push cx
mov cx, 0
s2:
mov bx, 10
mov dx, 0
div bx
push dx
inc cx
cmp ax, 0
jne s2

s3:
pop bx
or bl, 30h
mov ah, 2
mov dl, bl
int 21h
loop s3
pop cx
ret

 

printSpace:
mov ah, 2
mov dl, 20h
int 21h
ret


code ends
end start

   

4、实验任务4

task4.asm源码:

 

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

task5.asm源码:

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后,在屏幕24行70列显示yes, 若输入其他字符,则在屏幕24行70列显示no。该程序设置了光标位置为:0页24行70列。当输入字符为7时,跳转到标号s1处,调用int 21h的子功能,在设置的光标位置显示字符串"yes";若不为7,调用int 21h的子功能,在设置的光标位置显示字符串"no"。
 

6、实验任务6

 

中断是指CPU不再接着向下执行,而是转去处理这个特殊信息。是指由于接收到外围硬件(相对于CPU与内存而言)的异步信号或者来自软件的同步信号而进行相应的硬件/软件处理。CPU接受到中断信息后,可以立即对中断信息进行处理,用来处理中断信息的程序被称为中断处理程序。软中断是指由软件本身发给操作系统内核的中断信号。
中断过程是先从从中断信息中取得中断类型码,然后令标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中),并设置标志寄存器的第8位TF和第9位IF的值为0。CS的内容入栈,IP的内容入栈。最后从内存地址为中断类型码*4和中断类型码*4+2的两个子单元中读取中断处理程序的入口地址设置IP和CS。
posted @ 2021-12-19 20:39  溯光7  阅读(72)  评论(1)    收藏  举报