实验4 8086标志寄存器及中断
实验结论
一、实验任务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的结果:

add的结果:

由于所给代码中的数据没有产生进位,因此显示结果相同。
接下来,修改数据段,如下所示:
data segment
x dw 8020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
y dw 9210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
data ends
inc的结果:

add的结果:

可以发现修改数据后,结果发生了变化。
由于修改后的数据产生了进位,而后16位的运算需要用到前16位的进位值,因此不能使用add,add会对CF标志寄存器产生影响,而inc不会。
- 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。
二、实验任务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
- 运行测试截图

- 回答问题
运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结果。结合运行结果,理解代码并回答问题:

① 汇编指令代码line11-18,实现的功能是?
答:从键盘输入一个字符,并将其存入数据段中偏移地址为si的位置。每输入一个字符,si就进行自增运算,并且无条件地跳转到标记s1处,直至输入字符为“#”时,执行je next指令,跳转到标记next处。
② 汇编指令代码line20-22,实现的功能是?
答:0AH是换行符的十六进制ASCII码值,因此功能是输出换行符。
③ 汇编指令代码line24-30,实现的功能是?
答:将数据段中长度为si的字符串输出。
三、实验任务3
- task3.asm源码
assume cs:code,ds:data data segment x dw 91, 792, 8536, 65521, 2021 len equ $ - x data ends stack segment db 64 dup(0) top equ $+1 stack ends code segment start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,top mov cx,len/2 mov bx,0 s1: mov ax,ds:[bx] push bx push cx call printNumber call printSpace pop cx pop bx add bx,2 loop s1 mov ah,4ch int 21h printNumber: mov bx,10 mov cx,0 s2: mov dx,0 div bx push dx inc cx cmp ax,0 jne s2 s3: mov ah,2 pop dx or dl,30h int 21h loop s3 ret printSpace: mov ah,2 mov dl,' ' int 21h ret code ends end start
- 运行测试截图

四、实验任务4
- 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 stack segment 8 db 16 dup(0) 9 stack ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov cx, len 17 mov si, offset str 18 call strupr 19 20 mov ah, 4ch 21 int 21h 22 strupr: 23 s: mov al, byte ptr ds:[si] 24 cmp al, 'a' 25 jb next 26 cmp al, 'z' 27 ja next 28 29 mov ah, 2 30 and al, 11011111b 31 mov dl, al 32 int 21h 33 inc si 34 loop s 35 36 cmp cx, 0 37 je return 38 39 next: mov ah, 2 40 mov dl, al 41 int 21h 42 inc si 43 loop s 44 return: 45 ret 46 code ends 47 end start
- 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

五、实验任务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,若是,则输出yes;若不是,则输出no。
六、实验任务6
- task6_1.asm源码
1 assume cs:code 2 3 code segment 4 start: 5 ; 42 interrupt routine install code 6 mov ax, cs 7 mov ds, ax 8 mov si, offset int42 ; set ds:si 9 10 mov ax, 0 11 mov es, ax 12 mov di, 200h ; set es:di 13 14 mov cx, offset int42_end - offset int42 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:[42*4], 200h 22 mov word ptr es:[42*4+2], 0 23 24 mov ah, 4ch 25 int 21h 26 27 int42: 28 jmp short int42_start 29 str db "welcome to 2049!" 30 len equ $ - str 31 32 ; display string "welcome to 2049!" 33 int42_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*160 + 32*2 41 42 mov cx, len 43 s: mov al, [si] 44 mov es:[di], al 45 mov byte ptr es:[di+1], 2 46 inc si 47 add di, 2 48 loop s 49 50 iret 51 int42_end: 52 nop 53 code ends 54 end start
- task6_2.asm
1 assume cs:code 2 3 code segment 4 start: 5 int 42 6 7 mov ah, 4ch 8 int 21h 9 code ends 10 end start
- 运行结果

- 通过此项实现任务,对中断、软中断实现机制的理解。
答:中断也是异常的一种,中断有硬中断(由硬件产生的中断)和软中断(软件产生的中断)之分。ARM有七种不同的中断源,在中断向量表中对应的地址范围是 0X00 ~ 0X1C。CPU在执行程序时,是否响应中断要取决于以下三个条件能否同时满足:①有中断请求;②允许CPU接受中断请求;③一条指令执行完,下一 条指令还没有开始执行。
软中断执行由SWI指令产生,用于用户模式下的程序调用特权操作指令。是通过int指令引起的中断处理,不需要识别总线周期,中断号在指令中给出。
task6_1实现了向量表的设置,安装中断代码,task6_2向CPU发出中断指令,因此实现了42号中断处理程序。
- 自己选一个未被使用的中断码,实现一个中断例程,并调用测试。给出源码和运行测试截图。(选做 *)
- 如选做,请说明你使用的中断码,并描述你实现的这个中断例程的功能。

浙公网安备 33010602011771号