1. 实验任务1
ZF:NZ->ZR
CF:NC->CY
ZF:NZ->ZR
CF没有变化
源码:
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
答:本题中数据没有进位问题可以替换,实际中不一定可以替换。
inc指令:
add指令:
② 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。
加之前:
加之后:
2. 实验任务2
源码:
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
测试截图:
① 汇编指令代码line11-18,实现的功能是?
答:获取从键盘输入的字符串,并判断是不是#,是的话跳转到next段。
② 汇编指令代码line20-22,实现的功能是?
答:有0ah和代码段功能知,是输出一个换行符。
③ 汇编指令代码line24-30,实现的功能是?
答:输出数据段中保存的字符串。
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 stack segment 7 db 64 dup(0) 8 top equ $+1 9 stack ends 10 code segment 11 start: 12 mov ax,data 13 mov ds,ax 14 mov ax,stack 15 mov ss,ax 16 mov sp,top 17 18 mov cx,len/2 19 mov bx,0 20 s1: 21 mov ax,ds:[bx] 22 push bx 23 push cx 24 call printNumber 25 call printSpace 26 pop cx 27 pop bx 28 add bx,2 29 loop s1 30 31 mov ah,4ch 32 int 21h 33 34 printNumber: 35 ;ax dx 36 ;ax 被除数,直到 37 ;cx计有多少位,然后循环出栈输出 38 mov bx,10 39 mov cx,0 40 s2: 41 mov dx,0 42 div bx 43 ;ax 商 44 ;dx 余数 45 push dx 46 inc cx 47 cmp ax,0 48 jne s2 49 50 s3: 51 mov ah,2 52 pop dx 53 or dl,30h 54 int 21h 55 loop s3 56 ret 57 58 printSpace: 59 mov ah,2 60 mov dl,20h 61 int 21h 62 ret 63 64 code ends 65 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 = ($ - str) 5 data ends 6 stack segment 7 db 128 dup(0) 8 top equ $ + 1 9 stack ends 10 code segment 11 start: 12 mov ax,data 13 mov ds,ax 14 mov ax,stack 15 mov ss,ax 16 mov sp,top 17 18 mov si,0 19 mov cx,len 20 call strupr 21 mov ah,4ch 22 int 21h 23 strupr: 24 ;0100 0001 A 25 ;0110 0001 a 26 s: 27 cmp byte ptr ds:[si],61h 28 jb s1;无符号小于则跳转 29 cmp byte ptr ds:[si],7ah 30 ja s1;无符号大于则跳转 31 mov dl,ds:[si] 32 and dl,11011111B 33 mov ds:[si],dl 34 s1: 35 inc si 36 loop s 37 ret 38 code ends 39 end start
调试截图:
call strupr 之前:
call strupr 之后:
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
运行结果:
对中断、软中断实现机制的理解
答:
中断:中断是使CPU暂时挂起当前正在进行的工作并转向某紧急事件的服务与处理程序(该服务与处理程序称为中断服务程序),在执行完中断服务程序后再返回到被中止的原有工作处的过程。中断按其产生的方式可分为硬件中断和软件中断。硬件中断又分为内部和外部两种。
软中断:软件中断是内部中断的一种,是由软件引起的非屏蔽型中断。CPU执行 INT n 指令时,立即产生一个软件中断,中断的类型由指令中的n指明。因为指令中可以指定任何的类型号,故此指令可以方便地用来调试为外设编好的中断服务程序。