实验4 8086标志寄存器及中断
实验结论
1.实验任务1
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
回答问题:
①line31-line34的4条inc指令,可以替换如下代码
1 add si, 2 2 add di, 2
理由:inc操作不会对进位标志位CF产生影响,而add指令会对它产生影响。在add128的循环中有一个指令:adc ax,[di],该指令会被进位标志符CF影响。
但是,8次循环,每次循环值加2,最后才产生进位,所以对结果是没有影响的。
②debug调试,观察做128位加之前和之后的变化。

line31-line34的4条inc指令替换为add si,2 add di,2之后:

结果没有变化。

2.实验任务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
运行测试截图:

回答问题:
①line11-18,实现的功能:从键盘获取单个字符,输入到data段中保存,与‘#’比较,若相等跳转到next,否则继续循环。
②line20-22,实现的功能:输出一个Ascii码为0ah的符号,即换行符。
③line24-30,实现的功能:从data段中输出刚刚保存的字符。
3.实验任务3
task3.asm源码
1 assume cs:code,ds:data 2 3 data segment 4 x dw 91, 792, 8536, 65521, 2021 5 len equ $ - x 6 data ends 7 8 stack segment 9 dw 32 dup(0) 10 stack ends 11 12 code segment 13 start: 14 mov ax,data 15 mov ds,ax 16 mov cx,len/2 17 mov di,offset x 18 mov bx,10 19 mov ax,stack 20 mov ss,ax 21 mov sp,32 22 s: 23 mov ax,[di] 24 push cx 25 call printNumber 26 call printSpace 27 pop cx 28 add di,2 29 loop s 30 31 mov ax,4c00h 32 int 21h 33 34 printNumber: 35 36 mov cx,0 37 s2: 38 mov dx,0 ;被除数是dx+ax,除之前要将dx清空 39 div bx ;余数在dx,商在ax 40 push dx 41 inc cx 42 cmp ax,0 43 je s3 44 jmp s2 45 46 s3: 47 pop dx 48 or dl,30h 49 mov ah,2 50 int 21h 51 loop s3 52 53 ret 54 printSpace: 55 mov ah,2 56 mov dl,020h 57 int 21h 58 ret 59 60 code ends 61 end start
截图

4.实验任务4
task4.asm源码
1 assume cs:code, ds:data 2 3 data segment 4 str db "assembly language, it's not difficult but tedious" 5 len equ $ - str 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 mov si,offset str 13 mov cx,len 14 call strupr 15 16 mov ah, 4ch 17 int 21h 18 strupr: 19 s: 20 mov bl,[si] 21 cmp bl,'a' 22 jb next 23 cmp bl,'z' 24 ja next 25 and bl,11011111B 26 next: 27 mov [si],bl 28 inc si 29 loop s 30 code ends 31 end start
debug调试截图

5.实验任务5
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
程序运行测试截图

程序的功能:判断输入的字符,输入7时,输出yes,其他输出no。输出的位置是在24行70列。
6.实验任务6
通过此项任务,对中断,软中断实现机制的理解:
用int指令来实现软中断,感觉和call指令区别不大,call 后面是地址,而int 后面是一个中断类型码,引发一个n号中断的中断过程。在进入中断前,将标志寄存器,当前的CS、IP保存在栈中。执行完该中断后用iret恢复。

浙公网安备 33010602011771号