实验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, 2add di, 2
不可以。
-
在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,实现的功能是?② 汇编指令代码line20-22,实现的功能是?③ 汇编指令代码line24-30,实现的功能是?
①从键盘接收一个字符。若字符是’#’则接收结束。
②输出换行符。
③向屏幕显示输入的字符。
3.实验任务3
- task3.asm源码
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 ;不断除以10,得到对应位的数字 36 ;ax保存被除数 37 mov bx,10 38 mov cx,0 39 s2: 40 mov dx,0 41 div bx 42 push dx 43 inc cx 44 cmp ax,0 45 jne s2 46 47 s3: 48 mov ah,2 49 pop dx 50 or dl,30h 51 int 21h 52 loop s3 53 ret 54 55 printSpace: 56 mov ah,2 57 mov dl,20h 58 int 21h 59 ret 60 61 code ends 62 end start
- 运行测试截图
4.实验任务4
- task4.asm源码
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 stack segment 8 db 8 dup(?) 9 stack ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 mov si, 0 16 mov cx, len 17 call strupr 18 call printStr 19 20 mov ax, 4c00h 21 int 21h 22 23 strupr: 24 push cx 25 push si 26 s: 27 mov al, ds:[si] 28 cmp al, 97 29 jl c 30 cmp al, 122 31 jg c 32 and al, 0dfh 33 mov ds:[si], al 34 c: 35 inc si 36 loop s 37 38 pop si 39 pop cx 40 ret 41 42 43 printStr: 44 push cx 45 push si 46 s2: 47 mov ah, 2 48 mov dl, ds:[si] 49 int 21h 50 inc si 51 loop s2 52 53 pop si 54 pop cx 55 ret 56 57 code ends 58 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,若不是则在第24行70列输出no。
6.实验任务6
- task6_1.asm
1 assume cs:code 2 3 code segment 4 start: 5 ; 42 interrupt routine install code 6 mov ax, cs 7 mov ds, ax 8 mov si, offset int42 ; set ds:si 9 10 mov ax, 0 11 mov es, ax 12 mov di, 200h ; set es:di 13 14 mov cx, offset int42_end - offset int42 15 cld 16 rep movsb 17 18 ; set IVT(Interrupt Vector Table) 19 mov ax, 0 20 mov es, ax 21 mov word ptr es:[42*4], 200h 22 mov word ptr es:[42*4+2], 0 23 24 mov ah, 4ch 25 int 21h 26 27 int42: 28 jmp short int42_start 29 str db "welcome to 2049!" 30 len equ $ - str 31 32 ; display string "welcome to 2049!" 33 int42_start: 34 mov ax, cs 35 mov ds, ax 36 mov si, 202h 37 38 mov ax, 0b800h 39 mov es, ax 40 mov di, 24*160 + 32*2 41 42 mov cx, len 43 s: mov al, [si] 44 mov es:[di], al 45 mov byte ptr es:[di+1], 2 46 inc si 47 add di, 2 48 loop s 49 50 iret 51 int42_end: 52 nop 53 code ends 54 end start
- task6_2.asm
1 assume cs:code 2 3 code segment 4 start: 5 int 42 6 7 mov ah, 4ch 8 int 21h 9 code ends 10 end start
- 通过此项实现任务,你对中断、软中断实现机制的理解
中断是CPU中断当前运行的程序,改变CS:IP,去执行其他的程序。执行完成后,又返回原先被中断的程序继续运行。
软中断是CPU内部产生的中断信号,CPU保存当前的执行环境。