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 ;将‘进位标志位’置为0 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, 2 add di, 2
不能,add可能改变进位标志位的值,从而影响 adc ax, [di] 的执行,而 inc 指令不会改变进位标志位的值。
但是本题数据特殊,add si, 2 与 add 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
运行测试截图:
回答问题:
① 汇编指令代码line11-18,实现的功能是:从键盘一个接一个的读入字符,判断是否为‘#’,若是则跳转到next处执行,若不是则计数并继续读入下一个字符
② 汇编指令代码line20-22,实现的功能是:换行
③ 汇编指令代码line24-30,实现的功能是:输出刚刚读入的一串字符,#不输出
3. 实验任务3
task3.asm源码
1 assume cs:code, ds:data 2 3 data segment 4 x dw 91, 792, 8536, 65521, 2021 5 len equ $ - x 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov si, offset x 13 mov cx, len/2 14 15 s: 16 mov ax, [si] ;数据低位(被除数) 17 mov dx, 0 ;数据高位(被除数) 18 push cx 19 call printNumber 20 call printSpace 21 pop cx 22 add si, 2 23 loop s 24 25 mov ah, 4ch 26 int 21h 27 28 printNumber: 29 mov di, 0 ;记录数据位数 30 mov bx, 10 ;除数为10 31 s1: 32 div bx 33 push dx 34 inc di 35 mov dx, 0 ;被除数要及时更新!!!!!! 36 cmp ax, 0 ;循环结束条件 37 je next 38 jmp s1 39 next: 40 mov cx, di 41 mov ah, 2 42 s2: 43 pop dx 44 or dl, 30h ;转换为10进制 45 int 21h 46 loop s2 47 ret 48 49 printSpace: 50 mov ah, 2 51 mov dl, ' ' 52 int 21h 53 ret 54 55 code ends 56 end start
运行测试截图
4. 实验任务4
task4.asm源码
1 assume cs:code, ds:data 2 3 data segment 4 str db "assembly language, it's not difficult but tedious" 5 len equ $ - str 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov si, offset str 13 mov cx, len 14 s: 15 call strupr 16 inc si 17 loop s 18 19 mov ah, 4ch 20 int 21h 21 22 strupr: 23 mov al, [si] 24 cmp al, 'a' 25 jb ok ;小于则返回 26 cmp al, 'z' 27 ja ok ;大于也返回 28 and al, 11011111b 29 mov [si], al 30 ok: ret 31 32 code ends 33 end start
call strupr 调用之前,数据段的值:
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',若为'7',在第0页第24行70列输出yes并退出,否则输出no并退出。
6. 实验任务6
运行结果:
中断是指由于接收到外围硬件(相对于CPU与内存而言)的异步信号或者来自软件的同步信号而进行相应的硬件/软件处理。 显然,外围硬件发给CPU或者内存的异步信号就是硬中断信号。由软件本身发给操作系统内核的中断信号,称之为软中断。
task6_1.exe,实现将 42号中断处理程序安装到0:200开始的连续内存空间,并设置中断向量表,使得将来通过 int 42 系统可以跳转到中断处理程序。
task6_2.exe,向CPU发出中断指令,实现了42号中断处理程序。