汇编语言转移指令实例
实验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处执行,最后退出程序

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

浙公网安备 33010602011771号