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

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

 

实验任务一:

  • 给出程序test1.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

运行结果:

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

                   

答:loop指令的机器码是E2F2,此时loop中存储的000D就是需要跳转的偏移地址000D,则CPU执行loop指令时,会直接改变IP为000D,然后CPU根据CS:IP得到下一指令的物理地址076B:000D,完成跳转。

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

                     

答:loop指令的机器码是E2F0,此时loop中存储的0029就是需要跳转的偏移地址0029,则CPU执行loop指令时,会直接改变IP为0029,然后CPU根据CS:IP得到下一指令的物理地址076B:0029,完成跳转。

 

实验任务二:

  • 给出程序test2.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) = ?

答:通过学习可以知道call的跳转原理是将对应的IP或者CS:IP压入栈中,在程序退出前,执行了两次call指令,第一次call指令将ds:[0]的字数据,即IP压入栈中,则ax=0021。第二次call指令将ds:[2]的双字数据,即DS:IP压入栈中,DS压入CX,IP压入BX,则bx=0026,cx=076C。

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

               

               

 

实验任务三:

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

 

  • 运行测试截图

 

 

 

 

 

实验任务四:

  • 给出程序源码test4.asm

 1 assume cs:code, ds:data
 2 data segment
 3     str db 'try'
 4     len equ $ - str
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax, data
10     mov ds, ax
11     mov si, 0      
12     mov cx, len    
13     mov bl, 02h    
14     mov bh, 0     
15     mov ax, 0b800h  
16     mov es, ax     
17     mov di, 0      
18     mov al, 0a0h   
19     call printStr   
20     mov si, 0       
21     mov di, 0
22     mov bl, 04h
23     mov bh, 18h
24     mov ax, 0b800h
25     mov es, ax
26     mov cx, len
27     mov al, 0a0h
28     call printStr
29     jmp exit
30     
31 printStr:   
32     mul bh          
33     add di, ax      
34 s:  mov al, [si]        
35     mov es:[di], al   
36     mov al, bl
37     mov es:[di+1], al 
38     inc si             
39     add di, 2          
40     loop s
41     ret
42 
43 exit:
44     mov ah, 4ch
45     int 21h
46 code ends
47 end start
  • 运行测试截图

 

 

 

实验任务五:

  • 给出程序源码test5.asm

 1 assume cs:code, ds:data
 2 data segment
 3     stu_no db '201983290493'
 4     len = $ - stu_no
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax, data
10     mov ds, ax
11     mov ax, 0b800h
12     mov es, ax
13     mov bl, 017h        
14     mov si, 0           
15     mov di, 0           
16     mov al, 050h        
17     mov bh, 18h         
18     mul bh              
19 
20     mov cx, ax         
21 s:  mov es:[di+1], bl    
22     add di, 2
23     loop s
24 
25     mov cx, 022h        
26 s1: mov byte ptr es:[di], '-'
27     mov es:[di+1], bl
28     add di, 2
29     loop s1
30 
31     mov cx, len          
32 s2: mov al, [si]
33     mov es:[di], al
34     mov es:[di+1], bl
35     inc si
36     add di, 2
37     loop s2
38 
39     mov cx, 023h            
40 s3: mov byte ptr es:[di], '-'
41     mov es:[di+1], bl
42     add di, 2
43     loop s3
44 
45 code ends
46 end start
  • 运行测试截图

 

 

posted @ 2021-11-30 14:49  半点  阅读(86)  评论(2编辑  收藏  举报