实验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指令会影响标志寄存器CF,而inc指令不会影响CF。

在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截
图。
开始前数据段:

做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,实现的功能是?
从屏幕中读入一段字符串,以 '#' 表示输入结束。结果保存在DS:[SI]中

② 汇编指令代码line20-22,实现的功能是?
打印一个换行符。
③ 汇编指令代码line24-30,实现的功能是?
输出用户输入的字符,即保存在DS:[SI]中的数据
说明:task2.asm中用到的两个DOS系统功能调用:
DOS系统功能调用int 21h的1号子功能
功能:从键盘上输入单个字符
入口参数:(ah) = 1
出口参数: (al)存放输入字符的ASCⅡ码 即:

DOS系统功能调用int 21h的2号子功能
功能:输出单个字符到屏幕上
入口参数:(ah) = 2, (dl) = 待输出的字符或其ascⅡ码
出口参数:无 即:

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 7 code segment 8 start: 9 mov ax,data 10 mov ds,ax 11 12 mov si,0 13 mov cx,len/2 14 15 s: 16 mov ax,word ptr[si] ;除数(低16位) 17 18 push cx ;保存主程序的cx(注:循环内保存) 19 20 call printNumber 21 call printSpace 22 23 pop cx ;取出cx 24 25 inc si 26 inc si 27 loop s 28 29 printNumber: 30 mov bx,10 ;除数 31 mov di,0 ;记录位数 32 33 s1: 34 mov dx,0 ;高16位置0 35 div bx 36 push dx ;保存余数 37 inc di ;位数加1 38 cmp ax,0 ;判断除数是否为0 39 jne s1 ;不为0继续 40 41 42 mov cx,di 43 print: ;打印保存的余数 44 pop dx 45 mov ah,2 46 or dl,30h ;将数字转为字符 47 int 21h 48 loop print 49 50 ret 51 52 printSpace: 53 mov ah,2 54 mov dl,' ' 55 int 21h 56 ret 57 code ends 58 end start
运行测试截图

4. 实验任务4
此部分书写内容:
task4.asm源码
assume cs:code,ds:data data segment str1 db "assembly language, it's not difficult but tedious" len equ $ - str1 data ends code segment start: mov ax,data mov ds,ax mov di,offset str1 mov cx,len call toUpper mov cx,len mov di,0 ;将di重新置0 s: call print inc di loop s mov ah, 4ch int 21h toUpper: ;转为大写(入口参数:ds:[di],cx循环次数) mov al,[di] cmp al,97 ;'a'的Ascall jb next ;<97 跳过 cmp al,122 ;'z'的Ascall ja next ;>122 跳过 and al,11011111b ;转为大写 mov [di],al ;保存到数据段 next: ;下一个字符 inc di loop toUpper ret print: ;打印(入口参数:ds:[di]) mov dl,[di] mov ah,2 int 21h ret code ends end start
在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)

5. 实验任务5
此部分书写内容:
task5.asm源码
assume cs:code, ds:data data segment str1 db "yes", '$' str2 db "no", '$' data ends code segment start: mov ax, data mov ds, ax mov ah, 1 int 21h ;接受一个数字存放在al中 mov ah, 2 ;设置光标位置 mov bh, 0 ;页号 mov dh, 24 ;行号 mov dl, 70 ;列号 int 10h cmp al, '7' ;输入的数字与'7'比较 je s1 ; == 跳转到 s1 mov ah, 9 ; 显示 ds:[dx] 即str2 处字符串 mov dx, offset str2 ;输入首字符的偏移地址 int 21h jmp over s1: mov ah, 9 ; 显示 ds:[dx] 即str1 处字符串 mov dx, offset str1 int 21h over: mov ah, 4ch int 21h code ends end start
程序运行测试截图(输入7,以及输入其他字符,运行结果截图)
输入7

输入其他字符

程序的功能是?
接受用户输入的一个字符,如果输入的字符为'7'则在第0页第24行第70列显示'yes'字符串
否则则显示'no'字符串。
6. 实验任务6
此部分书写内容:
通过此项实现任务,你对中断、软中断实现机制的理解
中断是指CPU在接收到外部发送的或内部产生的一种特殊信息时,会立即处理特殊信息;
中断是指CPU内部产生特殊信息(如除法错误、单步执行、执行into指令和执行int指令)时,立即处理该情况。
自己选一个未被使用的中断码,实现一个中断例程,并调用测试。
给出源码和运行测试截图。
task4_6_1.asm
assume cs:code code segment start: ; 42 interrupt routine install code mov ax, cs mov ds, ax mov si, offset int42 ; set ds:si mov ax, 0 mov es, ax mov di, 200h ; set es:di mov cx, offset int42_end - offset int42 cld rep movsb ; set IVT(Interrupt Vector Table) mov ax, 0 mov es, ax mov word ptr es:[42*4], 200h mov word ptr es:[42*4+2], 0 mov ah, 4ch int 21h int42: jmp short int42_start str1 db "welcome to 2049!" len equ $ - str1 ; display string "welcome to 2049!" int42_start: mov ax, cs mov ds, ax mov si, 202h mov ax, 0b800h mov es, ax mov di, 24*160 + 32*2 mov cx, len s: mov al, [si] mov es:[di], al mov byte ptr es:[di+1], 2 inc si add di, 2 loop s iret int42_end: nop code ends end start
task4_6_2.asm
assume cs:code code segment start: int 42 mov ah, 4ch int 21h code ends end start

(选做 *) 如选做,请说明你使用的中断码,并描述你实现的这个中断例程的功能。

浙公网安备 33010602011771号