实验4 8086标志寄存器及中断
实验内容
实验任务1
在debug环境中,分别实践、观察:
① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
答:add指令对ZF和CF都有影响,因为从上图中可以看出ZF标志位从NZ变成了ZR(从0变成1),CF标志位从NC变成了CY(从0变成1)
② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?

答:inc指令对ZF有影响,对CF没有影响。ZF位从NZ变成了ZR(从0变成1),CF标志位没有改变
task1.asm源码:
1 assume cs:code, ds:data 2 3 data segment 4 x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h 5 y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h 6 data ends 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov si, offset x 12 mov di, offset y 13 call add128 14 15 mov ah, 4ch 16 int 21h 17 18 add128: 19 push ax 20 push cx 21 push si 22 push di 23 24 sub ax, ax 25 26 mov cx, 8 27 s: mov ax, [si] 28 adc ax, [di] 29 mov [si], ax 30 31 inc si 32 inc si 33 inc di 34 inc di 35 loop s 36 37 pop di 38 pop si 39 pop cx 40 pop ax 41 ret 42 code ends 43 end start
对程序进行汇编链接,在debug中调试结果:
① line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
1 add si, 2 2 add di, 2
答: 可以替换成上述代码。虽然add指令对CF位有影响,但是在本题中si的范围在0000~000f,di范围在0010~001f,不产生进位。因此,无论用add还是inc指令,CF位不会发生变化,因此效果一致,可以替换。
② 在debug中调试,观察数据段中做128位加之前,和,加之后,数据段的值的变化。
答:见上图,可以看出在前16位中存放了相加前和相加后的结果。
实验任务2
task2.asm源码:
1 assume cs:code, ds:data 2 data segment 3 str db 80 dup(?) 4 data ends 5 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov si, 0 11 s1: 12 mov ah, 1 13 int 21h 14 mov [si], al 15 cmp al, '#' 16 je next 17 inc si 18 jmp s1 19 next: 20 mov ah, 2 21 mov dl, 0ah 22 int 21h 23 24 mov cx, si 25 mov si, 0 26 s2: mov ah, 2 27 mov dl, [si] 28 int 21h 29 inc si 30 loop s2 31 32 mov ah, 4ch 33 int 21h 34 code ends 35 end start
对task2.asm进行汇编链接,运行task2.exe得出结果如下:

① 汇编指令代码line11-18,实现的功能是?
答:line11-18实现了读取字符并写入到data段,同时判断读取字符是否是“#”,如果是,则停止读取并转移到next开始的位置执行,如果不是,则继续读取字符。
② 汇编指令代码line20-22,实现的功能是?
答:line20-22实现了输出一个换行符,0ah对应十进制数10,换行符的ASCII码值为10,因此是输出一个换行符。
③ 汇编指令代码line24-30,实现的功能是?
答:line24-30实现了将读取在data段中的字符进行输出。
实验任务3
task3.asm源码编写如下:
1 assume cs:code, ds:data 2 data segment 3 x dw 91, 792, 8536, 65521, 2021 4 len equ $ - x 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov si, offset x 12 mov cx, 5 13 14 s: push cx 15 mov cx, 0 16 mov al, ds:[si] 17 mov ah, ds:[si + 1] 18 call printNumber 19 call printSpace 20 pop cx 21 loop s 22 23 mov ah, 4ch 24 int 21h 25 26 printNumber: 27 mov bx, 10 28 mov dx, 0 29 div bx 30 inc cx 31 push dx 32 cmp ax, 0 33 jne printNumber 34 35 s1: mov ah, 2 36 pop dx 37 or dl, 30h 38 int 21h 39 loop s1 40 inc si 41 inc si 42 ret 43 44 printSpace: 45 mov ah, 2 46 mov dl, ' ' 47 int 21h 48 ret 49 50 code ends 51 end start
对源码进行汇编链接,运行后结果如下:

task4.asm源码编写如下:
1 assume cs:code, ds:data 2 data segment 3 str db "assembly language, it's not difficult but tedious" 4 len equ $ - str 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov si, offset str 12 mov cx, len 13 14 s: mov al, ds:[si] 15 call strupr 16 inc si 17 loop s 18 19 mov ah, 4ch 20 int 21h 21 22 strupr: 23 cmp al, 97 24 jb s1 25 cmp al, 122 26 ja s1 27 and al, 11011111B 28 jmp s1 29 30 s1: 31 mov ah, 2 32 mov dl, al 33 int 21h 34 ret 35 36 37 38 code ends 39 end start
对源码进行汇编链接,运行后结果如下:

实验任务5
task5.asm源码:
1 assume cs:code, ds:data 2 3 data segment 4 str1 db "yes", '$' 5 str2 db "no", '$' 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 13 mov ah, 1 14 int 21h 15 16 mov ah, 2 17 mov bh, 0 18 mov dh, 24 19 mov dl, 70 20 int 10h 21 22 cmp al, '7' 23 je s1 24 mov ah, 9 25 mov dx, offset str2 26 int 21h 27 28 jmp over 29 30 s1: mov ah, 9 31 mov dx, offset str1 32 int 21h 33 over: 34 mov ah, 4ch 35 int 21h 36 code ends 37 end start
对源码进行汇编链接,运行结果如下:

实验任务6
task6_1.asm,task6_2.asm运行结果如下:

中断又分为软中断和硬中断,软中断是由程序执行的中断,硬中断是由硬件执行的中断。
在此例中,执行task6_2的int 42命令后,cpu取得中断类型码42,并将IP设为42*4,CS设为42*4+2,由于执行task6_1后,系统中CS地址的值已变为0,IP地址的 值已变为200h,所以程序将跳转到0:200h的地址处执行,打印内容。
2.自己选一个未被使用的中断码,实现一个中断例程,并调用测试(使用230中断码)
1 assume cs:code 2 3 code segment 4 start: 5 ; 230 interrupt routine install code 6 mov ax, cs 7 mov ds, ax 8 mov si, offset int230 ; set ds:si 9 10 mov ax, 0 11 mov es, ax 12 mov di, 200h ; set es:di 13 14 mov cx, offset int230_end - offset int230 15 cld 16 rep movsb 17 18 ; set IVT(Interrupt Vector Table) 19 mov ax, 0 20 mov es, ax 21 mov word ptr es:[230*4], 200h 22 mov word ptr es:[230*4+2], 0 23 24 mov ah, 4ch 25 int 21h 26 27 int230: 28 jmp short int230_start 29 str db "welcome to lcx201983290409!" 30 len equ $ - str 31 32 ; display string "welcome to lcx201983290409!" 33 int230_start: 34 mov ax, cs 35 mov ds, ax 36 mov si, 202h 37 38 mov ax, 0b800h 39 mov es, ax 40 mov di, 24*80 + 32*2 41 42 mov cx, len 43 s: mov al, [si] 44 mov es:[di], al 45 mov byte ptr es:[di+1], 1 46 inc si 47 add di, 2 48 loop s 49 50 iret 51 int230_end: 52 nop 53 code ends 54 end start
1 assume cs:code 2 3 code segment 4 start: 5 int 230 6 7 mov ah, 4ch 8 int 21h 9 code ends 10 end start
使用230中断码结果如图:

浙公网安备 33010602011771号