实验4 8086标志寄存器及中断
实验任务1
答案
-
可以替换:
-
运行源程序:
可见成功地获得了存储在x段的结果。
-
运行修改过的程序:

获得了同样的结果
-
功能性上获得相同数据,可见可以替换
-
-
经过调试,发现数据段中x段随着程序的运行,其中数据依次变为原数据与y段相应数据之和,最后获得题目要求效果。
实验任务2
答案
-
可以看到,程序复制输出了输入的字符串(除#以外)

-
line 11-18 实现的功能是:
- 不断接受键盘上输入的字符,并且将这些字符存储到预先定义好的数据段中
- 判断输入的字符是否为 “#” ,如果为 “#” 则调用 next 函数为输出数据做准备
-
line 20-22 实现的功能是:
- 首先向屏幕输出一个换行符
- 将目前的 si 转移到 cx 作为输出字符个数
- 初始化 si 使其指向数据段首部
-
line 24-30 实现的功能是
- 循环输出数据段中的字符
- 输出完以后程序调用返回dos的中断以结束程序
实验任务3
代码
assume cs:code,ds:data
data segment
x dw 91,792,8536,65521,2001
len equ $-x
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,offset x
mov cx,len/2
s:
mov ax,ds:[si]
call printNumber
call printSpace
add si,2
loop s
mov ah,4ch
int 21h
printNumber:
push cx
mov bx,10
mov di,0
;进行循环将数字一遍遍除以10,直到最终被除数为0
p: mov dx,0
div bx
push dx;dx存放余数(当前最低位)
inc di
cmp ax,0;判断当前待除区还有没有数
jne p;循环将大数字拆成多为零散数字并压入栈
mov cx,di
mov ah,2
m: pop dx
or dl,30h;ascii转换
int 21h
loop m
pop cx
ret
printSpace:
mov ah,2
mov dl,20h;空格键的ASCII
int 21h
ret
code ends
end start
运行结果

可见成功运行。
实验4
代码
assume cs:code,ds:data
data segment
str db "assembly language, it's not difficult but tedious"
len equ $ - str
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,offset str
mov cx,len
s: call strupr
inc si
loop s
mov ah,4ch
int 21h
strupr:
mov bl,[si]
cmp bl,61h;将字母跟小写a比较
jb exit;小于小写a的ascii即退出
cmp bl,7ah;将字母与z比较debug
ja exit;大于z即退出
sub bl, 32
mov [si],bl
exit:
mov ah,2
mov dl,bl
int 21h
ret
code ends
end start
运行结果
- 为了方便观察,为程序添加了回显功能

可见符合要求
实验5
运行结果
根据观察:
-
当向屏幕输入 7 时,屏幕将于24行70列显示yes

-
输入非 7 时,屏幕将于相同位置显示no
分析
- 当代码运行至
je s1时,若 al 等于 7 时,将跳转到段 s1 ,s1 调用了int 21h的九号子功能,显示了str 2处的以“$”为结尾的字符串yes。 - 显示no同理。
实验6
实验与代码
-
对两个程序进行编译运行,成功在屏幕上获得回显。

-
编写程序以完成以下内容:
- 自定义114号中断,实现在屏幕上打印闪烁的字符串
assume cs:code
code segment
start:
mov ax, cs
mov ds, ax
mov si, offset int114
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset int114_end - offset int114
cld
rep movsb
; set IVT(Interrupt Vector Table)
mov ax, 0
mov es, ax
mov word ptr es:[114*4], 200h
mov word ptr es:[114*4+2], 0
int 114
mov ah, 4ch
int 21h
int114:
jmp short int114_start
str db "root@Lihewin:/home# apt-get moo"
len equ $ - str
str1 db "...Have you mooed today?..."
len1 equ $ - str1
int114_start:
mov ax, cs
mov ds, ax
mov si, 202h
mov ax, 0b800h
mov es, ax
mov di, 0e60h
mov cx, len
s: mov al, [si]
mov es:[di], al
mov byte ptr es:[di+1], 7
inc si
add di, 2
loop s
mov di,0e9eh
mov al,5fh
mov es:[di], al
mov al,8ch
mov es:[di+1], al
mov di, 0f00h
mov cx, len1
s1: mov al, [si]
mov es:[di], al
mov byte ptr es:[di+1], 2
inc si
add di, 2
loop s1
iret
int114_end:
nop
code ends
end start
运行截图

成功运行。
总结
本章实验主要涉及了条件跳转与中断的定义与调用的知识点。

浙公网安备 33010602011771号