实验4 8086标志寄存器及中断
答: 由图可知,add指令对标志寄存器中的零标志位ZF有影响,对进位标志位CF也有影响。
答: 由图可知,inc指令对标志寄存器中的零标志位ZF有影响,对进位标志位CF没有影响。
使用任意文本编辑器,录入8086汇编源码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
① 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]中的值输出。
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 ) 字符串首地址的段地址和偏移地址分别送至ds和si
(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
实验任务1、2、3、5中使用了不少系统提供的中断例程。本实验任务中,要求自行实现一个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检测到中断信息,它将在不再接着刚执行完
的指令向下执行,而是转去处理这个中断信息,即执行中断处理程序。

浙公网安备 33010602011771号