【汇编实验】实验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指令,能否替换成如下代码?
add si, 2 add di, 2你的结论的依据/理由是什么?
不可以,因为使用add可能会产生进位,这样就影响到了line28的adc指令运行
在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截 图。
在做运算之前的数据段。
做完运算之后的数据段,可以发现076a0~076af是已经加完之后的结果。
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,实现的功能是?
调用int 21h 的一号子功能,从键盘上输入字符并将其ASCII码存放在al中,一直做循环直到输入#作为结束标志。
② 汇编指令代码line20-22,实现的功能是?
调用int 21h 的二号子功能,并向dl中存放换行符的ASCII码,在屏幕上输出换行符,为接下来重复输出这个字符串做准备。
③ 汇编指令代码line24-30,实现的功能是?
重复调用int 21h 的二号子功能,输出之前输入的字符串
3. 实验任务3
task3.asm源码
1 assume ds:data, cs:code, ss:stack 2 data segment 3 x dw 91, 792, 8536, 65521, 2021 4 len equ $ - x 5 data ends 6 stack segment 7 dw 8 dup(0) 8 stack ends 9 10 code segment 11 start: 12 mov ax, data 13 mov ds, ax 14 mov ax, stack 15 mov ss, ax 16 mov sp, 16 17 mov si, offset x 18 mov cx, len/2 ; 19 s: 20 mov ax, [si] 21 mov dx, 0 22 call printNumber 23 call printSpace 24 inc si 25 inc si 26 loop s 27 mov ah, 4ch 28 int 21h 29 30 printNumber: 31 push cx 32 mov cx, 0 33 s1: 34 mov dx, 0 35 mov bx, 10 36 div bx 37 push dx 38 inc cx 39 cmp ax, 0 40 jne s1 41 s2: 42 pop dx 43 or dl, 30h 44 mov ah, 2 45 int 21h 46 loop s2 47 pop cx 48 ret 49 50 printSpace: 51 mov dl, ' ' 52 mov ah, 2 53 int 21h 54 ret 55 56 code ends 57 end start
运行测试截图
4. 实验任务4
task4.asm源码
1 assume cs:code, ss:stack, 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 8 dup(0) 9 stack ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 mov ax, stack 16 mov ss, ax 17 mov sp, 8 18 mov si, 0 19 mov cx, len 20 call strupr 21 call printStr 22 23 mov ax, 4c00h 24 int 21h 25 strupr: 26 push cx 27 push si 28 trans: 29 mov al, ds:[si]; 30 cmp al, 'a' 31 jl next 32 cmp al, 'z' 33 jg next 34 and al, 0dfh 35 mov ds:[si], al 36 next: 37 inc si 38 loop trans 39 pop si 40 pop cx 41 ret 42 printStr: 43 push cx 44 push si 45 print: 46 mov ah, 2 47 mov dl, ds:[si] 48 int 21h 49 inc si 50 loop print 51 pop si 52 pop cx 53 ret 54 code ends 55 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的话在24行70列输出yes,否则输出no
6. 实验任务6
通过此项实现任务,你对中断、软中断实现机制的理解
中断过程可表示为:
(1)取得中断类型码N;
(2)pushf
(3)TF=0,IF=0 (防止陷入一直处理单步中断处理程序的第一条指令的死循环)
(4)push CS
(5)push IP
(6)(IP)=(N*4),(CS)=(N*4+2)
之后CPU开始执行中断处理程序,中断处理程序的执行过程可表示为:
(1)保存用到的寄存器;
(2)处理中断;
(3)恢复用到的寄存器;
(4)用iret指令返回。