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, 2
add di, 2
不能替换,用add指令对si,di操作可能会影响CF位,CF位被影响后,adc命令中会产生错误的结果,而inc命令并不会影响CF位。
- 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。
做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,实现的功能是?
从键盘上读入字符,存入到data段中,若输入字符为‘#’,则跳到next标号执行程序。
② 汇编指令代码line20-22,实现的功能是?
在屏幕上打印换行符,实现换行。
③ 汇编指令代码line24-30,实现的功能是?
将data段中的内容打印到屏幕上。
3. 实验任务3
此部分书写内容:
- task3.asm源码
1 assume cs:code 2 data segment 3 x dw 91, 792, 8536, 65521, 2021 4 len equ $ - x 5 data ends 6 stack segment 7 db 16 dup(0) 8 stack ends 9 code segment 10 start: 11 mov ax,data 12 mov ds,ax 13 mov ax,stack 14 mov ss,ax 15 mov sp,16 16 mov di,offset x 17 18 mov ax,len ;长度为10,执行5次循环,除2 19 mov bl,2 20 div bl 21 mov ah,0 22 23 mov cx,ax 24 s1:mov ax,[di] ;将data段里的值赋值给ax 25 mov bx,10 ;除数放在bx中 26 mov si,0 27 call printNumber 28 call printSpace 29 add di,2 30 loop s1 31 32 mov ah,4ch 33 int 21h 34 35 36 printNumber:mov dx,0 37 div bx 38 push dx ;余数存放在dx中 39 inc si ;入栈次数 40 cmp ax,0 ;商存放在ax中 41 je pp 42 jmp printNumber 43 pp:pop dx 44 mov ah,2 45 or dl,30h 46 int 21h 47 48 dec si ;si减1 49 cmp si,0 50 je s 51 jmp pp 52 53 s:ret 54 55 printSpace:mov ah,2 56 mov dl, ' ' 57 int 21h 58 ret 59 60 code ends 61 end start
- 运行测试截图
4. 实验任务4
此部分书写内容:
- task4.asm源码
1 assume cs:code 2 data segment 3 str db "assembly language, it's not difficult but tedious" 4 len equ $ - str 5 data ends 6 code segment 7 start:mov ax,data 8 mov ds,ax 9 mov si,0 10 mov cx,len 11 s:call strupr 12 inc si 13 loop s 14 15 mov ah,4ch 16 int 21h 17 18 strupr:mov dl,[si] 19 cmp dl,97 20 jb s1 ;小于97-a则跳出 21 cmp dl,122 22 ja s1 ;大于122-z则跳出 23 sub dl,32 24 jmp s1 25 26 s1:mov ah,2 27 int 21h 28 ret 29 30 code ends 31 end start
- 在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)
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,则将数据段中str1的内容显示,否则显示str2的内容,显示位置为第24行的第70列。
6. 实验任务6
此部分书写内容:
- 通过此项实现任务,你对中断、软中断实现机制的理解
执行task6_2的int 42命令后,cpu取得中断类型码42,并将IP设为42*4,CS设为42*4+2,由于执行task6_1后,系统中
0:42*4+2所在地址的值已变为0,0:42*4所在地址的值已变为200h,所以程序将跳转到0:200h的地址处执行,
该地址处存放的内容即时打印“welcome to 2049!”的代码,所以cpu会执行该处代码,显示打印内容。