ICode9

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

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

2021-11-28 13:02:14  阅读:101  来源: 互联网

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


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

 

运行测试截图

 

 

 

 

 

 

 

 

 

标签:code,编程,mov,si,指令,跳转,ax,data,ds
来源: https://www.cnblogs.com/Yurnero-/p/15614794.html

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

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

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

ICode9版权所有