实验4 8086标志寄存器及中断
实验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 28 s: mov ax, [si] 29 adc ax, [di] 30 mov [si], ax 31 32 inc si 33 inc si 34 inc di 35 inc di 36 loop s 37 38 pop di 39 pop si 40 pop cx 41 pop ax 42 ret 43 code ends 44 end start
- line31~line34的4条inc指令不能替换成如下代码:
1 add si, 2 2 add di, 2
原因:因为add指令对于标志寄存器中的零标志位ZF有影响,对进位标志位CF也有影响,而inc指令仅仅对ZF零标志位有影响,对进位标志位CF无影响。在此次实验中我们使用了adc指令,这是考虑到低位运算中的进位对高位运算的影响,如果使用add指令可能会对之前运算的进位标志位产生影响,进而使得最终的运算结果出错,所以这里的inc指令不能替换成add指令。
- 调试截图


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,实现的功能是读取一个用户输入的字符,将字符的ASCII值存放到数据段中,并判断用户输入的字符是否是‘#’,如果是则跳转到标号next处,否则跳转回标号s1处,继续读入字符。
②汇编指令代码line20-22,实现的功能是输出换行符。
③汇编指令代码line24-30,实现的功能是循环si次,将之前存放到数据段中的字符输出到屏幕上。
3.实验任务3
- task3.asm源码
1 assume ds:data, cs:code, ss:stack 2 3 data segment 4 x dw 91, 792, 8536, 65535, 2021, 0 5 len equ $ - x 6 data ends 7 8 stack segment 9 dw 8 dup(?) 10 stack ends 11 12 code segment 13 start: 14 mov ax, data 15 mov ds, ax 16 mov ax, stack 17 mov ss, ax 18 mov sp, 16 19 20 mov cx, len/2 21 s1: mov ax, word ptr ds:[di] 22 call printNumber 23 call printSpace 24 add di, 2 25 loop s1 26 27 mov ah, 4ch 28 int 21h 29 30 printNumber: 31 mov bx, 0 32 33 s2: mov bp, 10 34 mov dx, 0 35 div bp 36 push dx 37 inc bx 38 mov cx, ax 39 inc cx 40 loop s2 41 42 mov cx, bx 43 44 s3: pop dx 45 add dl, 30h 46 mov ah, 2 47 int 21h 48 loop s3 49 50 ret 51 52 printSpace: 53 mov ah, 2 54 mov dl, 20h 55 int 21h 56 ret 57 58 code ends 59 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, 0 13 mov cx, len 14 call strupt 15 16 mov si, 0 17 mov cx, len 18 mov ah, 2 19 20 s: mov dl, [si] 21 int 21h 22 inc si 23 loop s 24 25 mov ax, 4c00h 26 int 21h 27 28 strupt: 29 s0: cmp byte ptr [si], 'a' 30 jb s1 31 cmp byte ptr [si], 'z' 32 ja s1 33 sub byte ptr[si], 20h 34 s1: inc si 35 loop s0 36 ret 37 38 code ends 39 end start
- 在debug中调试截图(call strupr 调用之前,数据段的值,以及调用之后数据段的值)


5.实验任务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
- 程序运行测试截图(输入7,以及输入其他字符运行结果截图)


- 程序的功能是判断输入的字符是否为7,如果是7则在显存中第24行,第70列处输出yes,否则输出no。
6.实验任务6
- 运行截图



当cpu内部有某些事件发生时,会产生中断信息,比如执行int指令。cpu在收到中断信息后,引发中断过程,然后就会执行该中断信息对应的处理程序。中断向量表在内存中保存,其中存放256个中断源对应的中断处理程序入口。因此,根据中断码,就可以通过中断向量表得到对应处理程序的入口,从而执行中断处理程序。

浙公网安备 33010602011771号