Sola!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

四、实验结论

 


 

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

 

 

 

 

运行结果:

 

 

posted on 2021-11-22 20:13  Sola!  阅读(23)  评论(2)    收藏  举报