实验结论
1.实验任务1
使用add,零标志位和进位标志位都发生了改变
使用inc,零标志位发生改变,进位标志位未改变
源码:
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
不可以,因为add指令会改变进位标志寄存器中的内容
运行截图:
程序运行前的数据段
下面运行到程序结束前
下面是运行后的数据段
可见加法运算正确
2.实验任务2
运行程序:
可见程序将从键盘输入的字符输出了
line 11~18功能:
不断循环,从键盘接受字符,并将接受的字符存入数据段,然后比较接受的字符是否为'#',是则停止循环
line 20~22功能:
输出一个换行
line 24~30功能:
将总字符数赋给cx,并循环从内存中拿取,输出字符
3.实验任务3
源代码:
1 assume cs:code, ds:data 2 data segment 3 x dw 91, 792, 8536, 65521, 2021 4 len equ $ - x 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov si, 0 12 mov ax, len 13 mov cl, 2 14 div cl 15 mov ah, 0 16 mov cx, ax 17 print: 18 mov ax, [si] 19 push cx 20 call printNumber 21 pop cx 22 call printSpace 23 add si, 2 24 loop print 25 26 mov ah, 4ch 27 int 21h 28 29 printNumber: 30 mov bx, 0 31 s: 32 mov dx, 0 33 mov cx, 10 34 div cx 35 push dx 36 inc bx 37 cmp ax, 0 38 jne s 39 40 mov cx, bx 41 printStack: 42 pop dx 43 add dl, '0' 44 mov ah, 2 45 int 21h 46 loop printStack 47 ret 48 49 printSpace: 50 mov ah, 2 51 mov dl, ' ' 52 int 21h 53 ret 54 code ends 55 end start
运行结果:
4.实验任务4
源代码:
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 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov cx, len 12 mov si, 0 13 call strupr 14 mov ah, 4ch 15 int 21h 16 strupr: 17 mov al, [si] 18 and al, 223 19 mov [si], al 20 inc si 21 loop strupr 22 ret 23 code ends 24 end start
调用前截图:
调用后截图:
可见数据段中的字符都被转换为大写
5.实验任务5
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的时候会输出yes,否则会输出no
6.实验任务6
执行task6_1
再执行task6_2
可见绿色的文字出现在屏幕上
中断是硬件上实现的功能,而软中断是通过编程来实现硬件没法直接实现功能的中断方式,它可以让中断的功能更加丰富和强大
实验总结
通过这次的实验,我主要学习了和标志寄存器有关的内容,标志寄存器和指令配合,可以实现非常强大的功能,它可以记载计算机的状态或者运算历史,以便程序可以按情况实现不同的功能。