实验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
可以,本题data段数据共占32字节,di,si最大取值为20h,10h,均不超过16位寄存器上限,不会产生溢出,不会影响到cf标志位,故此题中可以将inc指令替换为add指令
- 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。
相加之前

相加之后

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
- 运行测试截图

- 回答问题 运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结果。结合运行结果,理解代码并回答问题:
① 汇编指令代码line11-18,实现的功能是?
调用1号子功能获取用户输入并判断,若为#则停止读取并跳转到标号next处,否则si加一,继续读取输入
② 汇编指令代码line20-22,实现的功能是?
调用2号子功能在屏幕数打印一个空格
③ 汇编指令代码line24-30,实现的功能是?
调用2号子功能,将先前读取的用户输入按原序输出
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 stack segment 8 dw 5 dup(0) 9 stack ends 10 code segment 11 start: 12 mov ax,stack 13 mov ss,ax 14 15 mov ax,data 16 mov ds,ax 17 mov si,0 18 s0: ;从data读取数据 19 mov sp,0ch 20 mov ax,ds:[si] 21 ;输出该数 22 call printNumber 23 inc si 24 inc si 25 cmp si,len 26 jb s0 27 28 mov ah,4ch 29 int 21h 30 printNumber: 31 ;循环除bl(10)取余 32 mov bl,0ah 33 mov cx,0 34 s1: mov dx,0 35 div bx 36 inc cx 37 ;余数入栈 38 push dx 39 ;商小于10则停止 40 cmp ax,0ah 41 jae s1 42 mov dl,al 43 mov ah,2 44 add dl,'0' 45 int 21h 46 ;出栈输出 47 s2: pop dx 48 49 add dl,'0' 50 int 21h 51 loop s2 52 ;空格 53 mov dl,' ' 54 int 21h 55 ret 56 57 code ends 58 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 strupr 15 16 mov ah,4ch 17 int 21h 18 strupr: 19 ;判断是否为小写字母 20 cmp ds:[si],byte ptr 'a' 21 jb s1 22 cmp ds:[si],byte ptr 'z' 23 ja s1 24 ;位运算取反,转换为大写 25 xor ds:[si],byte ptr 020h 26 s1: inc si 27 loop strupr 28 ret 29 code ends 30 end start
- 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)
call strupr调用之前

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

输入2

输入a

- 程序的功能是?
判断键盘输入是否为7,并依据结果在屏幕第24行70列输出yes或no
6. 实验任务6
此部分书写内容:
- 通过此项实现任务,你对中断、软中断实现机制的理解

在6_1运行结束后,6_2还可以调用6_1设置的42号中断,中断可以看做常驻内存的一段程序
- 自己选一个未被使用的中断码,实现一个中断例程,并调用测试。给出源码和运行测试截图。(选做 *) 如选做,请说明你使用的中断码,并描述你实现的这个中断例程的功能。
选用的中断码为f1,实现的功能为实验2中的第2个实验任务,在屏幕最下方输出红色爱心
task6.asm
1 assume cs:code 2 3 code segment 4 start: 5 ;ds[si]指向程序中要复制的指令 6 mov ax,cs 7 mov ds,ax 8 mov si,offset intf1 9 ;es[di]指向目标处 10 mov ax,0 11 mov es,ax 12 mov di,200h 13 mov cx,offset intf1End - offset intf1 14 cld 15 rep movsb 16 ;向量表 17 mov ax,0 18 mov es,ax 19 mov word ptr es:[241*4],200h 20 mov word ptr es:[241*4+2],0 21 22 mov ah,4ch 23 int 21h 24 25 intf1: 26 mov ax,0b800h 27 mov ds,ax 28 mov bx,0f00h 29 30 mov cx,0a0h 31 mov si,0 32 s: mov ax,0403h 33 mov [bx+si],ax 34 inc si 35 inc si 36 loop s 37 38 iret 39 intf1End: 40 nop 41 code ends 42 end start
task6_2.asm
1 assume cs:code 2 3 code segment 4 start: 5 int 0f1h 6 7 mov ah, 4ch 8 int 21h 9 code ends 10 end start
输出截图

五、实验总结(选)
中断相当于一段常驻内存的程序,要自定义中断只需将对应的代码复制到内存空间中,并将起始地址设置到中断向量表中对应处

浙公网安备 33010602011771号