实验3 转移指令跳转原理及其简单应用编程

一、实验结论

1、实验任务1

  • 给出程序task1.asm源码,及运行截图
 1 assume cs:code, ds:data
 2 data segment
 3 x db 1, 9, 3
 4 len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3
 5 y dw 1, 9, 3
 6 len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9
 7 data ends
 8 code segment
 9 start:
10 mov ax, data
11 mov ds, ax
12 mov si, offset x ; 取符号x对应的偏移地址0 -> si
13 mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx
14 mov ah, 2
15 s1:mov dl, [si]
16 or dl, 30h
17 int 21h
18 mov dl, ' '
19 int 21h ; 输出空格
20 inc si
21 loop s1
22 mov ah, 2
23 mov dl, 0ah
24 int 21h ; 换行
25 mov si, offset y ; 取符号y对应的偏移地址3 -> si
26 mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx
27 mov ah, 2
28 s2:mov dx, [si]
29 or dl, 30h
30 int 21h
31 mov dl, ' '
32 int 21h ; 输出空格
33 add si, 2
34 loop s2
35 mov ah, 4ch
36 int 21h
37 code ends
38 end start
  • 回答问题①line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。 

 

 答:通过反汇编可查看指令loop s1的机器码为E2F2,其中F2是以补码形式表示的位移量,F2H=[11110010]补=[10001110]原=-14,因此其位移量为-14。在执行指令loop s1时的IP为0019,IP+2即为001B,在此基础上加上位移量-14后的IP为000D,从而实现跳转。

  • 回答问题②line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。

  答:通过反汇编可查看指令loop s2的机器码为E2F0,其中是F0以补码形式表示的位移量,F0H=[11110000]补=[10010000]原=-16,因此其位移量为-16。在执行指令loop s2时的IP为0037,IP+2即为0039,在此基础上加上位移量-16后的IP为0029,从而实现跳转。 

2、实验任务2

  • 给出程序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
  • 给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。
    • ① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器(bx) = ? 寄存器(cx) = ?

 答:寄存器(ax)=s1代码段的起始地址,寄存器(bx)=S2代码段的起始地址,寄存器(cx)=cs中存的地址。 执行call word ptr ds:[0]时,IP为下一条指令的起始地址,即IP为s1代码段的起始地址。此时,将IP=0021压入栈中。随后指令跳转到ds:[0]存放的地址,即s1代码段,此时执行出栈操作,将栈中的0021赋值给ax。所以ax的值就是s1的起始地址。 执行call dword ptr ds:[2]类似,但是压入栈中的变为CS和IP,出栈时,先出栈IP,再出栈CS,因此将IP的值赋给bx,将cs的值赋给cx。所以,bx的值是s2代码起始地址的IP值,cx的值是s2代码段的cs值。

    • ② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论分析结果是否一致。 

 

 答:调试结果与理论分析一致。

3、实验任务3

  • 给出程序源码task3.asm
 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 code segment
 7 start:
 8     mov ax,data
 9     mov ds,ax
10     mov byte ptr ds:[len],10
11     mov cx,7
12     mov bx,0
13 s:  mov al,ds:[bx]
14     mov ah,0
15     inc bx
16     call printNumber
17     call printSpace
18     loop s
19     mov ah,4ch
20     int 21h
21 printNumber:
22     div byte ptr ds:[len]
23     mov dx,ax
24     mov ah,2
25     or dl,30h
26     int 21h
27     mov ah,2
28     mov dl,dh
29     or dl,30h
30     int 21h
31     ret
32 printSpace:
33     mov dl,' '
34     mov ah,2
35     int 21h
36     ret
37 code ends
38 end start
  • 运行测试截图

4、实验任务4

  • 给出程序源码task4.asm
 1 assume ds:data, cs:code
 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 bh,0
16     mov bl,00000010B
17     call printStr
18 
19     mov si,0
20     mov cx,len
21     mov bh,24
22     mov bl,00000100B
23     call printStr
24 
25     mov ax,4c00h
26     int 21h
27 
28 
29     printStr:
30     mov ax,0b800h
31     mov es,ax
32 
33     mov al,bh
34     mov bh,0a0h
35     mul bh
36     mov bp,ax
37     s:
38     mov ah,ds:[si]
39     mov es:[bp],ah
40     inc bp
41     mov es:[bp],bl
42     inc bp
43     inc si
44     loop s
45     ret
46 
47 code ends
48 end start
  • 运行测试截图

 

5、实验任务5

  • 给出程序源码task5.asm
 1 assume ds:data, cs:code
 2 
 3 data segment
 4 stu_no db '201983290054'
 5 len = $ - stu_no
 6 data ends
 7 
 8 code segment
 9 start:
10     mov ax,0b800h
11     mov es,ax
12     mov bp,1
13     mov cx,8000h
14 
15     first:
16     mov byte ptr es:[bp],00011111B
17     add bp,2
18     loop first
19 
20     mov ax,data
21     mov ds,ax
22     mov ax,0050h
23     sub ax,len
24     mov bh,02h
25     div bh
26     mov bl,al
27     mov bh,0
28 
29     mov ax,0b800h
30     mov es,ax
31     mov bp,0F00h
32     mov cx,bx
33 
34     s:
35     mov byte ptr es:[bp],'-'
36     inc bp
37     inc bp
38     loop s
39 
40     mov cx,len
41     mov di,0
42 
43     s1:
44     mov al,ds:[di]
45     mov es:[bp],al
46     inc bp
47     inc bp
48     inc di
49     loop s1
50 
51     mov cx,bx
52 
53     s2:
54     mov byte ptr es:[bp],'-'
55     inc bp
56     inc bp
57     loop  s2
58 
59     mov ax,4c00h
60     int 21h
61 
62 code ends
63 end start
  • 运行测试截图

 

posted @ 2021-11-30 20:50  olivia余一  阅读(58)  评论(3)    收藏  举报