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

2021/11/28 14:12:00

本文主要是介绍实验3 转移指令跳转原理及其简单应用编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

实验任务1

给出程序task1.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其后指令的偏移地址的。

 机器码为E2F2,F2的八位二进制形式为11110010,其补码为10001110,十进制形式为-14,即位移量为14

CPU:首先通过读取指令的长度修改ip的值,ip=ip+指令长度,然后执行loop s1,跳转到s1处,位移量等于s1处的偏移地址减去当前ip指向地址的偏移地址

回答问题② ② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s2其后指令的偏移地址的。 line44 loop命令的机器码为E2F0,F0的八位二进制形式为11110000,补码为10010000,十进制形式为-16,即位移量为16 CPU:首先通过读取指令的长度修改ip的值,ip=ip+指令长度,然后执行loop s2,跳转到s2处,位移量等于s2处的偏移地址减去当前ip指向地址的偏移地址 问题③ ③ 附上上述分析时,在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
给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器(bx) = ? 寄存器(cx) = ?  call word ptr ds:[0] 短转移, 将下一条指令偏移地址(ip)压入栈, 并转移至 ds:[0]地址即 s1 处, 此后的 pop ax 将该内容出栈给ax;
 call dword ptr ds:[2]为段间转移, 将下一条指令基址和偏移地址(cs 和 ip)压入栈, 并转移至 ds:[2] 地址即 s2 处, 此后的 pop bx 将ip出栈给bx, pop cx 将 cs 出栈给 cx. AX=0021 BX=0026 CX=076C ② 对源程序进行汇编、链接,得到可执行程序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         mov cx, len
14         mov si, 0
15     print:
16         mov al, [si]
17         mov ah, 0
18         call printNumber
19         call printSpace
20         inc si
21         loop print
22  
23         mov ah, 4ch
24         int 21h
25 
26     printNumber:
27         mov bl, 10
28         div bl
29         mov bx, ax
30         
31         mov ah, 2
32  
33         mov dl, bl    ; 打印商
34         or dl, 30h
35         int 21h
36  
37         mov dl, bh    ; 打印余数
38         or dl, 30h
39         int 21h
40         ret
41              
42     printSpace:
43         mov ah, 2
44         mov dl, ' '
45         int 21h
46         ret
47  
48 code ends
49 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 
13     mov bh, 0   ;指定第一行
14     mov bl, 2    ;黑底绿字
15     call printStr
16 
17     mov bh, 24   ;指定最后1行
18     mov bl, 4    ;黑底红字
19     call printStr
20 
21     mov ah, 4ch
22     int 21h
23 
24 printStr:
25    mov al,0ah  ;每行160字节
26    mul bh       ;与行号相乘获得行起始地址
27    add ax, 0b800h
28    mov es,ax
29 
30     mov cx, len     ;字符串长度
31     mov si, offset str
32     mov di, si
33 s:
34     mov al, [si]
35     mov ah, bl    ;把颜色属性传入
36     mov es:[di], ax       ;把要显示的字符送入显存
37     inc si
38     add di, 2
39     loop s
40     ret
41 code ends
42 end start

 

运行测试截图

 

 

实验任务5 此部分书写内容: 给出程序源码task5.asm
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     stu_no db '201983290032' 
 5     len = $ - stu_no 
 6 data ends
 7 
 8 code segment
 9 start:
10     mov ax, data
11     mov ds, ax
12     mov di, 0
13 
14     call printStuNum
15     
16     mov ah, 4ch
17     int 21h
18 
19 printStuNum:
20     mov ax, 0b800h
21     mov es, ax
22     mov si, 1
23 
24     mov al, 24
25     mov dl, 80
26     mul dl
27     
28     mov cx, ax
29     printBlue:
30         mov al, 17h    ;00010111
31         mov es:[si], al    ;填充颜色
32         add si, 2
33     loop printBlue
34 
35     sub si, 1
36     mov ax, 80
37     sub ax, len
38     mov dl, 2
39     div dl
40     mov dx, ax    ;保存-的长度
41 
42     mov cx, dx
43     call printheng
44 
45     mov cx, len
46     printStu:    ;输出学号
47         mov al, ds:[di]
48         mov ah, 17h
49         mov word ptr es:[si], ax
50         inc di
51         add si, 2
52     loop printStu
53 
54     mov cx, dx
55     call printheng
56 
57     ret
58     
59 printheng:
60     mov al, '-'
61     mov ah, 17h
62     mov word ptr es:[si], ax
63     add si, 2
64     loop printheng
65     ret
66      
67 code ends
68 end start

 

运行测试截图

 

 

 

 

 

 

 

 



这篇关于实验3 转移指令跳转原理及其简单应用编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程