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

四、实验结论


 1. 实验任务1

此部分书写内容:

给出程序task1.asm源码,及,运行截图

task1.asm源码:

运行截图:

回答问题①

① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机

器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明

是如何计算得到跳转后标号s1其后指令的偏移地址的。

debug反汇编:

 

line27的机器码: E2F2

跳转的位移量: -14 (0Dh - 1Bh = 13 - 27 = -14)

1.执行机器码 E2F2后,CS:IP 指向标号s1处的指令

2.CPU读取标号s1处的指令进入指令缓冲器

3.(IP) = (IP) + 标号s1处指令的长度,得到s1其后的指令的偏移地址

 

回答问题②

② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机

器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明

是如何计算得到跳转后标号s2其后指令的偏移地址的。

debug反汇编:

 

 

 line44机器码:E2F0

跳转的位移量:  -16 (29h - 39h = -10h )

1.执行机器码 E2F0后,CS:IP 指向标号s2处的指令

2.CPU读取标号s2处的指令进入指令缓冲器

3.(IP) = (IP) + 标号s2处指令的长度,得到s2其后的指令的偏移地址

问题③

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

第①题的调试截图:

 

 第②题调试截图:

2. 实验任务2

此部分书写内容:

给出程序task2.asm源码

 

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

? 寄存器(bx) = ? 寄存器(cx) = ?

(ax) =  offset s1

(bx) = offset s2

(cx) = cs

② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试

结果与理论分析结果是否一致。

 

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

3. 实验任务3

此部分书写内容:

给出程序源码task3.asm

 1 data segment
 2      x db 99, 72, 85, 63, 89, 97, 55 
 3      len equ $- x
 4 data ends
 5 
 6 code segment
 7 start:
 8     mov ax,data
 9     mov ds,ax
10     
11     mov di,0        ;指向第一个数据    
12     mov cx,7            
13     
14 s:    mov ah,0        ;将高位置0
15     mov al,[di]
16     mov bl,10        ;除数10(十进制)
17         
18     call printNumber
19     call printSpace
20     inc di
21     
22     loop s
23     
24     mov ah,4ch
25     int 21h
26     
27 printNumber:       
28     div bl    
29     mov bx,ax
30         
31     mov ah,2
32     
33     or bl,00110000b         ;bl 商    
34     mov dl,bl
35     int 21h    
36     
37     or bh,00110000b        ;bh 余数 
38     mov dl,bh    
39     int 21h
40     ret
41      
42 printSpace:    
43     mov ah,2
44     mov dl,' '
45     int 21h
46     ret
47     
48     
49 code ends
50 end start

 

运行测试截图

 

4. 实验任务4

此部分书写内容:

给出程序源码task4.asm

 1 assume ds:data, cs:code
 2 data segment
 3     x db 'try'
 4     len equ $ - x
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax,data
10     mov ds,ax
11     
12     mov si,0        ;指向数据
13     mov di,0        ;屏幕第一行
14     mov cx,len
15     
16 s:    mov    bl,[si]        ;低位存放数据
17     mov bh,02        ;黑底绿字    
18     call printStr
19     inc si
20     loop s
21     
22     mov si,0
23     mov di,0F00h    ;屏幕最后一行
24     mov cx,len
25     
26 s1:    mov    bl,[si]        
27     mov bh,04        ;黑底红字    
28     call printStr
29     inc si
30     loop s1
31     
32     mov ah,4ch
33     int 21h
34 
35 
36 printStr:
37     mov ax,0b800h
38     mov es,ax
39     
40     mov es:[di],bx    
41     add di,2
42     ret
43     
44 code ends
45 end start

 

运行测试截图

 

 

 

 

5. 实验任务5

此部分书写内容:

给出程序源码task5.asm

 1 assume ds:data, cs:code
 2 data segment
 3     stu_no db '201983290103'
 4     len = $ - stu_no
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax,data
10     mov ds,ax
11     
12     mov ax,0b800h        
13     mov es,ax            ;设置显示缓冲区
14     mov di,0            ;指向data数据
15     mov cx,2000            ;80×25 屏幕中所有字符
16     mov si,0            ;遍历整个屏幕
17     
18     mov bh,00010111b    ;设置蓝底白字
19     mov bl,0            ;清除bl中杂乱信息
20 s:    call print
21     loop s
22     
23     mov cx,80
24     mov si,0f00h        ;指向最后一行第一个字符
25     mov bl,'-'            ;设置最后一行全为'-'
26 s1: call print
27     loop s1
28     
29     mov cx,len
30     mov si,0f44h
31     
32 s2:    mov bl,[di]
33      call print
34     inc di
35     loop s2
36     mov ah,4ch
37     int 21h
38 print:
39     mov es:[si],bx
40     add si,2
41     ret
42 
43 
44 code ends
45 end start

 

运行测试截图

 

posted @ 2021-11-28 23:02  /muteall  阅读(92)  评论(0编辑  收藏  举报