|
实验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处
注意这里有点问题再汇编语言中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处继续执行
此时s处的指令位EBF6,下图
可以算出当执行s处代码后,0A+F6=00,跳转到mov ax,4C00处执行,最后退出程序
个人的思路有些地方不严谨,有错误难免,还望指正!
来源:https://www.cnblogs.com/naturals/p/12324481.html |