三、实验内容
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
(2)回答问题 :line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
add si, 2 add di, 2
不能替换,程序中有adc指令需要使用cf标志位参与运算,inc指令不会影响cf的值,而add指令会使cf标志位发生变化。
(3)
相加前:
相加后:
2.实验任务2
(1)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
(2)运行测试截图
(3)回答问题:
① 汇编指令代码line11-18,实现的功能是?
让 用户输入一个字符,将其按顺序存放到data段,如果输入字符等于#则转移到next程序段,不等于则循环让用户继续输入下一个字符。
② 汇编指令代码line20-22,实现的功能是?
输出一个换行。
③ 汇编指令代码line24-30,实现的功能是?
循环输出data段里存放的所有字符
3.实验任务3
(1)task3.asm源码
1 assume ds:data,cs:code 2 data segment 3 x dw 91,792,8536,65521,2021 4 len equ $ - x 5 data ends 6 7 stack segment 8 db 16 dup(0) 9 stack ends 10 11 code segment 12 start: mov ax,data 13 mov ds,ax 14 15 mov ax,stack 16 mov ss,ax 17 mov sp,10h 18 19 mov si,0 20 mov cx,len/2 ;word型数据 长度除2 21 s: push cx 22 mov ax,[si] 23 call printNumber 24 call printSpace 25 add si,2 26 pop cx 27 loop s 28 29 mov ah,4ch 30 int 21h 31 32 printNumber: 33 mov di,0 34 s1: mov dx,0 35 mov bx,0ah 36 div bx 37 push dx 38 inc di 39 cmp ax,0h 40 je s2 41 jmp s1 ;此处不要使用loop指令 会自动cx-1 但该程序段未使用cx 所以会受主程序里cx值的影响 42 43 s2: mov cx,di 44 s3: pop ax 45 or al,30h 46 mov ah,2 47 mov dl,al 48 int 21h 49 loop s3 50 ret 51 52 printSpace: 53 mov ah,2 54 mov dl,20h 55 int 21h 56 ret 57 code ends 58 end start
(2)运行测试截图
4.实验任务4
(1)task4.asm源代码
1 assume ds:data,cs:code 2 data segment 3 str db "assembly language, it's not difficult but tedious" 4 len equ $ - str 5 data ends 6 7 code segment 8 start: mov ax,data 9 mov ds,ax 10 11 mov si,offset str 12 mov cx,len 13 call strupr 14 mov ah,4ch 15 int 21h 16 17 strupr: cmp byte ptr [si],61h 18 jb s 19 cmp byte ptr [si],86h 20 ja s 21 and byte ptr [si],11011111b 22 loop strupr 23 ret 24 25 s: inc si 26 loop strupr 27 code ends 28 end start
(2)运行测试截图
5.实验任务5
(1)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
(2)程序运行测试截图(输入7,以及输入其他字符,运行结果截图)
(3)程序的功能是?
用户从键盘输入7时,会在屏幕第24行70列打印yes字符串,当输入其他字符时打印no.
6.实验任务6
(1)通过此项实现任务,你对中断、软中断实现机制的理解
软中断即是程序中通过 int 指令引起的,当设置一种中断程序时需要将其加入中断向量表,即该程序的入口地址,当程序执行时遇到int指令引发中断,cpu会获得中断号,再根据中断号×4即可得到中断程序段入口的段地址和偏移地址,进而执行中断程序。