四、实验结论
1. 实验任务1
① 源代码:
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
运行结果:

反汇编结果:

line27,汇编指令loop s1跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码为E2F2,分析得其跳转的位移量是 -14(补码表示为F2H)。
从CPU的角度,CS:IP指向line27所在的内存单元,读取loop s1指令进入指令缓冲器;
根据读取指令的长度,修改IP的值,(IP)=(IP)+所读取指令的长度,从而指向下一条指令;
执行loop s1指令,跳转到s1处,跳转的位移量为s1处的偏移地址减去当前IP所指向的内存单元的偏移地址。
②
反汇编结果:

line44,汇编指令loop s2跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码为E2F0,分析得其跳转的位移量是 -16(补码表示为F0H)。
从CPU的角度,CS:IP指向line44所在的内存单元,读取loop s2指令进入指令缓冲器;
根据读取指令的长度,修改IP的值,(IP)=(IP)+所读取指令的长度,从而指向下一条指令;
执行loop s2指令,跳转到s2处,跳转的位移量为s2处的偏移地址减去当前IP所指向的内存单元的偏移地址。
2. 实验任务2
源代码:
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
①根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) =0021 ,寄存器
(bx) =0026, 寄存器(cx) =076C 。
使用debug进行调试:

3. 实验任务3
源代码:
1 assume cs:code, ds:data 2 data segment 3 x db 99, 72, 85, 63, 89, 97, 55 4 len equ $- x 5 data ends 6 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 13 14 mov bx,0 15 call printNumber 16 mov ah, 4ch 17 int 21h 18 19 printNumber: 20 push ax 21 push bx 22 push cx 23 24 s: mov cl, [bx] 25 mov ch, 0 26 jcxz over 27 28 mov ah,0 29 mov al,ds:[bx] 30 mov dl,10 31 div dl ;将十位数和个位数分离 32 mov ds:[8],al ;商,十位数 33 mov ds:[9],ah ;余数,个位数 34 inc bx 35 36 mov ah,2 37 mov dl,ds:[8] 38 add dl,30h ;将整型转为字符型 39 int 21h ;输出十位数 40 41 mov ah,2 42 mov dl,ds:[9] 43 add dl,30h 44 int 21h ;输出个位数 45 call printSpace 46 jmp s 47 48 over: 49 pop cx 50 pop bx 51 pop ax 52 ret 53 54 printSpace: 55 mov ah,2 56 mov dl,0 57 int 21h 58 ret 59 60 code ends 61 end start
运行结果:

4. 实验任务4
源代码:
assume cs:code, ds:data data segment str db 'try' len equ $ - str data ends code segment start: mov ax, data mov ds, ax mov si, offset str mov bl, 2 ;设置前景色位绿色 mov di, 0 call printStr mov bl, 4 ;设置前景色为红色 mov di, 0f00h call printStr mov ah,4ch int 21h printStr: push ax push cx push si push di mov ax, 0b800h mov es, ax s: mov cl, [si] ;存放字符数据 mov ch, 0 jcxz over mov ch, bl ;存放字符颜色 mov es:[di], cx ;写入显存 inc si add di, 2 jmp s over: pop di pop si pop cx pop ax ret code ends end start
运行结果:

5. 实验任务5
源代码:
1 assume cs:code, ds:data 2 3 data segment 4 stu_no db '201983290095' 5 len = $ - stu_no 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 13 mov ax, 0b800h 14 mov es, ax 15 mov si, 0 16 mov bx, 0 17 mov cx, 1920 ;80*24=1920个字符 18 19 s1: mov ah, 00010111b ;蓝底白字 20 mov es:[di], ax ;用空格填充前24行 21 add di, 2 22 loop s1 23 24 mov cx, 34 25 s2: mov ah, 00010111b 26 mov al, 45 27 mov es:[di], ax ;第25行前34个字符填充"-" 28 loop s2 29 30 mov cx, 12 31 s3: mov ah, 00010111b 32 mov al, ds:[bx] 33 mov es:[di], ax ;中间12个字符填充学号 34 inc bx 35 add di, 2 36 loop s3 37 38 mov cx, 34 39 s4: mov ah, 00010111b 40 mov al, 45 41 mov es:[di], ax ;第25行后34个字符填充"-" 42 add di, 2 43 loop s4 44 45 mov ax, 4ch 46 int 21h 47 code ends 48 end start
运行结果:

浙公网安备 33010602011771号