实验4 8086标志寄存器及中断
1. 实验任务1
- task4_1.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
答:不可以,因为add有可能会改变进位标志位,在执行adc指令的时候结果就会出错。
- 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截
图。
在做相加之前的数据段截图

在做相加之后的数据段截图

2. 实验任务2
- 程序task4_2.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,实现的功能是?
答:调用int 21h的1号子功能,从键盘上输入单个字符,只要该字符不是#,将其ASCII码存入al。
② 汇编指令代码line20-22,实现的功能是?
答:调用int 21h的2号子功能,输出al存放ASCII对应的字符,即进行换行。
③ 汇编指令代码line24-30,实现的功能是?
答:循环调用int 21h的2号子功能,输出al存放ASCII对应的字符,即将刚刚输入[si]中的字符依次输出。
3. 实验任务3
- task4_3.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 db 16 dup(0) 10 stack ends 11 12 code segment 13 start: 14 mov ax, data 15 mov ds, ax 16 17 mov si,offset x 18 mov cx,5 19 20 s: 21 mov ax,[si] 22 call printNumber 23 call printSpace 24 25 inc si 26 inc si 27 loop s 28 29 mov ah, 4ch 30 int 21h 31 32 printNumber: 33 push bx 34 push di 35 push cx 36 mov cx,0 37 mov di,0 38 s1:mov dx,0 39 mov bx,10 40 div bx 41 or dl,30h 42 push dx 43 inc di 44 cmp ax,0 45 jne s1 46 mov cx,di 47 s2:pop dx 48 mov ah,2 49 int 21h 50 loop s2 51 52 pop cx 53 pop di 54 pop bx 55 56 ret 57 58 printSpace: 59 mov dl,' ' 60 int 21h 61 ret 62 63 64 code ends 65 end start
- 运行测试截图

4. 实验任务4
- task4_4源码
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 13 mov si,offset str 14 mov cx,len 15 16 s: 17 call strupr 18 inc si 19 loop s 20 21 mov ah, 4ch 22 int 21h 23 24 strupr: 25 mov al,[si] 26 cmp al,'a' 27 jb ok 28 cmp al,'z' 29 ja ok 30 and byte ptr ds:[si],11011111b 31 ok:ret 32 33 34 code ends 35 end start
- 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)


5. 实验任务5
- task4_5.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时在屏幕右下角输出yes,否则输出no
6. 实验任务6
- 通过此项实现任务,你对中断、软中断实现机制的理解
当产生中断信息时,CPU用8位的中断类型码通过中断向量包找到相应的中断处理程序入口地址。运用movsb指令,将代码送入0:200处,在写入中断向量表项中,使这段代码成为中断处理程序。当CPU收到对应的中断信息时,CPU就会帮我们把PC指针定位到异常向量表中某一个位置,这里实现地址的映射,指向什么函数入口,需要我们自己来实现。task6_1实现了向量表的设置,安装中断代码,task6_2则向CPU发出中断指令,于是实现了42号中断处理程序。

浙公网安备 33010602011771号