实验4
实验任务1
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
在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。
做128位加之前的数据段的值截图:

做128位加之后的数据段的值截图:

line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
1 add si, 2 2 add di, 2
答:能,因为 add命令虽然会影响标志寄存器的值,但本题中的数据并没有在每次循环中进位,进位标志位一直为0,而add si, 2和add di, 2也正好不会产生进位影响进位标志位的值,因此不影响adc命令时的结果。
下为将inc指令改为add命令后 做128位加之后的数据段的值截图:

可见与inc指令的结果一致。
实验任务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
运行测试截图

运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结果。结合运行结果,理解代码并回答问题:
① 汇编指令代码line11-18,实现的功能是?
答:读取当前屏幕上输入的字符并将该字符的ascii码存入al,将al内容写入data段中,再去判断al是否为‘#’,如果是IP就跳到next段,如果不是则si指向下一个内存单元,IP调到s1开始
② 汇编指令代码line20-22,实现的功能是?
答:0AH是换行符的ASCII码,这三行的功能就是在屏幕上输出换行符。
③ 汇编指令代码line24-30,实现的功能是?
偏移地址从0到si的大小(si的大小即为存入内存单元的字符个数 注意!不包括'#') ,将每一个内存单元的内容输出到屏幕上。
实验任务3
1 assume cs:code, ds:data 2 3 4 data segment 5 x dw 91, 792, 8536, 65521, 2021 6 len equ $ - x 7 data ends 8 9 code segment 10 start: 11 mov ax, data 12 mov ds, ax 13 14 mov si, offset x ; 取符号x对应的偏移地址0 -> si 15 16 mov cx, len 17 mov bx, 10 18 19 s1: 20 mov al, [si] 21 inc si 22 mov ah, [si] 23 inc si 24 dec cx 25 call printNumber 26 call printSpace 27 loop s1 28 29 mov ah, 4ch 30 int 21h 31 32 printNumber: 33 push cx 34 mov cx, 0 35 s2: 36 sub ax, 0 37 jz s3 38 mov dx, 0 39 div bx 40 push dx 41 inc cx 42 jmp s2 43 44 s3: 45 pop dx 46 or dl, 30H;将数字转换为字符 47 mov ah, 2 48 int 21h 49 loop s3 50 51 pop cx 52 ret 53 54 printSpace: ;输出空格 55 mov ah, 2 56 mov dl, ' ' 57 int 21h 58 ret 59 60 code ends 61 end start
运行测试截图

实验任务4
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 13 mov si, offset str 14 mov cx, len 15 call strupr 16 17 mov ah, 4ch 18 int 21h 19 strupr: 20 s1: 21 mov al, [si] 22 cmp al, 97 23 jb s2 24 cmp al, 122 25 ja s2 26 and al, 0dfH 27 mov [si], al 28 29 s2: 30 inc si 31 loop s1 32 ret 33 34 code ends 35 end start
call strupr 调用之前,数据段的值

call strupr 调用之后,数据段的值

实验任务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,以及输入其他字符,运行结果截图)


程序的功能是?
答:读取从键盘输入单个字符,然后设置光标位置在第0页,第24行 第70列,如果是7则在此处输出yes否则在此处输出no
实验任务6
两个程序正确编写、汇编、链接,运行后,得到结果如下:


浙公网安备 33010602011771号