查看: 44|回复: 0

汇编语言转移指令实例

[复制链接]

5

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2008-3-25
发表于 2020-2-18 16:56:00 | 显示全部楼层 |阅读模式

实验8 分析一个奇怪的程序

整理了一下对汇编语言第二版实验8的理解

涉及了转移指令,计算机组成原理的一些知识

 

首先我们来看一下代码

 1 assume cs:codesg
 2 codesg segment
 3     
 4     mov ax,4c00h
 5     int 21h
 6     
 7 start:mov ax,0
 8     s:  nop
 9         nop
10     
11     mov di,offset s
12     mov si,offset s2
13     mov ax,cs:[si]
14     mov cs:[di],ax
15     
16     s0: jmp short s
17     
18     s1: mov ax,0
19         int 21h
20         mov ax,0
21     
22     s2: jmp short s1
23         nop
24 codesg ends
25 end start

初略的查看代码发现

11 mov di,offset s
12 mov si,offset s2
13 mov ax,cs:[si]
14 mov cs:[di],ax

11.将s处的偏移地址传到di寄存器

12.将s2处的偏移地址传到si寄存器

13.将s2处的代码传到ax寄存器

14.再将ax中的数据传到s处

简单的将就是将s2处的代码移到s处

8 jmp short s1
9 nop

注意这里有点问题再汇编语言中offset s并不是汇编语言,只是有编译器进行解析

通过debug命令

我们来分析一下代码的具体过程

我们直接看到s2处的第一行

0770:0020 EBF6    JMP 0018

对应的汇编指令是jmp short s1

我们可以发现再EBF6中并没有出现18,而是使用位移量来确认地址

我们可以来计算一下为什么是F6

18-22=F6

18是s1处的地址,22是该指令的下一条指令的地址(这却决于计算机的设计,每执行一条指令前,ip会先加上该条指令的长度)

内存中存放的是二进制数据,而不是直接的jmp short s1

这意味着被复制到s处的指令也是EBF6

执行一下代码后跳转到s处继续执行

16 s0: jmp short s

此时s处的指令位EBF6,下图

可以算出当执行s处代码后,0A+F6=00,跳转到mov ax,4C00处执行,最后退出程序

 

个人的思路有些地方不严谨,有错误难免,还望指正!

 



来源:https://www.cnblogs.com/naturals/p/12324481.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部