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

实验1

使用任何一款文本编辑器,录入8086汇编程序源码task1.asm。

 

ask1.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其后指令的偏移地址的。

跳转的位移量为 -14

因为cpu执行E2F2,F2是十进制-14的补码,即ip向前移动14个字节到076B:000D处。

 

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

跳转位移量:-16

CPU执行的是十进制-16的补码,即ip向前移动16个字节到076B:000D处。

 

③    附上上述分析时,在debug中进行调试观察的反汇编截图

 

 

 

 

 

 

实验任务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

① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器(bx) = ? 寄存器(cx) = ?

     寄存器(ax) = 0021H寄存器 (bx) =0026H  寄存器(cx) =076CH

截图如下:

 

 

 

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

 

 

 

 

试验任务3

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 
14     mov cx,len
15     mov si,0
16 
17 s:  mov ah,0
18     mov al,[si]
19     mov bx,offset printnumber
20     call bx
21     mov bx,offset printSpace
22     call bx
23     inc si
24     loop s
25      
26 
27     mov ah, 4ch
28     int 21h
29 
30 printnumber:
31     mov bl,10
32     div bl
33     
34 
35     mov bx,ax
36     mov ah,2
37     
38     mov dl,bl
39     or dl,30h
40     int 21h
41     
42     mov dl,bh
43     or dl,30h
44     int 21h
45     ret
46 
47 printSpace:
48     mov ah,2
49     mov dl,' '
50     int 21h
51     ret
52 code ends
53 end start

运行结果如下:

 

 

 

实验任务4

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     mov ax,0B800H
13     mov es,ax
14     
15 
16     mov si,offset printStr
17     mov ah,2
18     mov bx,0
19     call si
20     
21     mov si,offset printStr
22     mov ah,4
23     mov bx,0F00H
24     call si
25     
26     mov ah, 4ch
27     int 21h
28 
29 printStr:
30     mov cx,len
31     mov si,0
32 s:  mov al,[si]
33     mov es:[bx+si],ax
34     inc si
35     inc bx
36     loop s
37     ret
38 
39 code ends
40 end start

运行结果如下:

 

 

 

实验任务5

task5.asm代码如下:

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     stu_no db '20192308060' 
 5     len = $ - stu_no
 6 data ends
 7 
 8 code segment
 9 start:  
10     mov ax, data
11     mov ds, ax
12     mov ax,0B800H
13     mov es,ax
14 
15     mov cx,0780H
16     mov ah,10H
17     mov al,' '
18     mov bx,0
19 
20 s:  mov es:[bx],ax
21     add bx,2
22     loop s
23     
24 
25     mov cx,80
26     mov ah,17H
27     mov al,'-'
28 
29 s1: mov es:[bx],ax
30     add bx,2
31     loop s1
32 
33     mov cx,len
34     mov bx,0F44H
35     mov si,0
36 
37 s2: mov al,[si]
38     mov es:[bx],ax
39     inc si
40     add bx,2
41     loop s2
42 
43     mov ah, 4ch
44     int 21h
45 
46 code ends
47 end start

运行结果如下:

 

posted @ 2021-11-29 18:15  无心12  阅读(22)  评论(2编辑  收藏  举报