实验结论
1.实验任务1
(1)给出程序task1.asm源码,及,运行截图
1 assume cs:code, ds:data 2 3 data segment 4 x db 1, 9, 3 5 len1 equ $ - x 6 7 y dw 1, 9, 3 8 len2 equ $ - y 9 data ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov si, offset x 17 mov cx, len1 18 mov ah, 2 19 s1:mov dl, [si] 20 or dl, 30h 21 int 21h 22 23 mov dl, ' ' 24 int 21h 25 26 inc si 27 loop s1 28 29 mov ah, 2 30 mov dl, 0ah 31 int 21h 32 33 mov si, offset y 34 mov cx, len2/2 35 mov ah, 2 36 s2:mov dx, [si] 37 or dl, 30h 38 int 21h 39 40 mov dl, ' ' 41 int 21h 42 43 add si, 2 44 loop s2 45 46 mov ah, 4ch 47 int 21h 48 code ends 49 end start
运行结果:
(2)回答问题①
① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机
器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。
答:汇编指令loop s1机器码:E2F2
1)F2是用十六进制补码表示的位移量,转化成十进制数值,跳转的位移量是-14。
2)(CS)=076B, (IP)=0019 , CS:IP指E2 F2 (loop s1的机器码);
读取指令码E2 F2进入指令缓冲器;
(IP)=(IP)+所读取指令的长度=(IP)+2=001BH, CS:IP指向MOV DL,0A;
CPU执行指令缓冲区中的指令E2 F2;
指令E2 F2执行后,(IP)=00 1BH+F2H=000DH ,最后得到了标号s1的偏移地址:000DH。
回答问题②
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机
器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。
答:汇编指令loop s2机器码:E2F0
1)F0是用十六进制补码表示的位移量,转化成十进制数值,跳转的位移量是-16。
2)(CS)=076B, (IP)=0037 , CS:IP指E2 F0 (loop s2的机器码);
读取指令码E2 F0进入指令缓冲器;
(IP)=(IP)+所读取指令的长度=(IP)+2=0039H, CS:IP指向MOV AH,4C;
CPU执行指令缓冲区中的指令E2 F0;
指令E2 F0执行后,(IP)=00 39H+F0H=0029H ,最后得到了标号s2的偏移地址:0029H。
问题③
③ 附上上述分析时,在debug中进行调试观察的反汇编截图
2.实验任务2
(1)给出程序task2.asm源码
1 assume cs:code, ds:data 2 3 data segment 4 dw 200h, 0h, 230h, 0h 5 data ends 6 7 stack segment 8 db 16 dup(0) 9 stack ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 16 mov word ptr ds:[0], offset s1 17 mov word ptr ds:[2], offset s2 18 mov ds:[4], cs 19 20 mov ax, stack 21 mov ss, ax 22 mov sp, 16 23 24 call word ptr ds:[0] 25 s1: pop ax 26 27 call dword ptr ds:[2] 28 s2: pop bx 29 pop cx 30 31 mov ah, 4ch 32 int 21h 33 code ends 34 end start
(2)给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) =? 寄存器(bx) = ? 寄存器(cx) = ?
答:Line13-Line18的功能是将s1、s2和cs存放到data段中。call word ptr ds:[0]指令执行时,进行两步操作:(1)将当前的IP压入栈中,此时IP的值是它的下一条指令pop ax的偏移地址。(2)转移,跳转到(IP)=(ds:[0])的位置。 由于ds:[0]中存放的是s1,所以执行pop ax指令。寄存器ax中存放的就是标号s1处的偏移地址。从上述截图中可得,AX=0021H。
call dword ptr ds:[2]指令执行时,也进行两步操作:(1)将当前的CS和IP依次压入栈中,此时IP的值是它的下一条指令pop bx的偏移地址。(2)转移,跳转到(IP)=(ds:[2])的位置,(CS)=(ds:[4])。 由于ds:[2]、ds[3]中存放的是s2,ds:[4]、ds[5]中存放的是CS, 所以CS:IP指向标号s2的位置。执行pop bx指令,寄存器bx中存放的就是标号s2处的偏移地址,寄存器s1中存放的是CS的地址。从上述截图中可得,BX=0026H, CX=076CH。
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论分析结果是否一致。
使用debug调试,观察、验证调试结果与理论分析结果一致。
3.实验任务3
(1)给出程序源码task3.asm
1 assume cs:code, ds:data 2 3 data segment 4 x db 99,72,85,63,89,97,55 5 len equ $- x 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 13 mov cx, len 14 mov di, offset x 15 mov bl, 10 16 17 s: 18 mov ah, 0 19 mov al, [di] 20 call printNumber 21 call printSpace 22 inc di 23 loop s 24 25 mov ax,4c00h 26 int 21h 27 28 printNumber: 29 div bl 30 mov dl, al 31 or dl, 30H 32 mov bh, ah 33 34 mov ah, 2 35 int 21h 36 37 mov dl, bh 38 or dl, 30H 39 int 21h 40 ret 41 42 printSpace: 43 mov ah, 2 44 mov dl, ' ' 45 int 21h 46 ret 47 48 code ends 49 end start
(2)运行测试截图:
4.实验任务4
(1)给出程序源码task4.asm
1 assume cs:code, ds:data 2 3 data segment 4 str db 'try' 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,0 14 mov cx, len 15 mov bl, 02h 16 mov bh,0 17 call printStr 18 19 mov si,0 20 mov cx, len 21 mov bl, 04h 22 mov bh,24 23 call printStr 24 25 mov ax,4c00h 26 int 21h 27 28 printStr: 29 mov ax,0b800h 30 mov es,ax 31 mov ax,00a0h 32 mul bh 33 mov di,ax ;di是行首的偏移地址 34 35 s: 36 mov al,[si] 37 mov es:[di],al 38 inc si 39 inc di 40 mov es:[di],bl 41 inc di 42 loop s 43 ret 44 code ends 45 end start
(2)运行测试截图
5.实验任务5
(1)给出程序源码task5.asm
1 assume cs:code, ds:data 2 3 data segment 4 stu_no db '201983290223' 5 len = $ - stu_no 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 13 mov bl,16 14 call printBlueBg 15 16 17 mov si,0 18 mov bl, 23 19 mov bh,24 20 call printStr 21 22 mov ax,4c00h 23 int 21h 24 25 26 printBlueBg: 27 mov ax,0b800h 28 mov es,ax 29 30 mov cx,25*80 31 mov al,' ' 32 mov di,0 33 t: 34 mov es:[di],al 35 inc di 36 mov es:[di],bl 37 inc di 38 loop t 39 ret 40 41 printStr: 42 43 mov ax,0b800h 44 mov es,ax 45 mov ax,00a0h 46 mul bh 47 mov di,ax ;di是行首的偏移地址 48 49 mov cx,(80-len)/2 50 s1: 51 mov al,'-' 52 mov es:[di],al 53 inc di 54 mov es:[di],bl 55 inc di 56 loop s1 57 mov cx,len 58 s: 59 mov al,[si] 60 mov es:[di],al 61 inc si 62 inc di 63 mov es:[di],bl 64 inc di 65 loop s 66 mov cx,(80-len)/2 67 s2: 68 mov al,'-' 69 mov es:[di],al 70 inc di 71 mov es:[di],bl 72 inc di 73 loop s2 74 ret 75 76 code ends 77 end start
(2)运行测试截图