ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-11-30 15:04:29  阅读:143  来源: 互联网

标签:di 编程 mov 指令 跳转 ax data ds


实验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 '201983290152'
 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
  • 运行测试截图

 

标签:di,编程,mov,指令,跳转,ax,data,ds
来源: https://www.cnblogs.com/Strawberries/p/15594352.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有