文章目录
前言
一、题目
二、分析
1.初始时指令存储情况
2.运行时指令存储情况
总结
前言
本文是学习王爽老师《汇编语言》(第四版)第九章 实验8 分析一个奇怪的程序 时的相关代码及分析。
一、题目
分析程序,思考程序是否可以正确返回;运行后再思考,为何是这种结果。
assume cs:code
code segment
mov ax,4c00H
int 21H
start:
mov ax,0
s:
nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0:
jmp short s
s1:
mov ax,0
int 21H
mov ax,0
s2:
jmp short s1
nop
code ends
end start
二、分析
1.初始时指令存储情况
在debug中运行前,使用U命令查看指令以及对应的十六进制数据,结果如下。
下面以表格的形式进行整理。
初始时指令在内存中的存储情况
下面分析这些指令。
0016H处的指令,是jmp跳转指令。 当前jmp指令的偏移地址是0016H,下一条指令的偏移地址是0018H,而要跳转到的标号s的偏移地址是0008H。“jmp short 标号”指令中存储的应当是地址的位移,而不是目标地址。因而位移是 0008H - 0018H = -0010H = -16(十进制)。
由于计算机使用反码表示数字,于是就将-0010H转为反码。根据反码规则,10H的二进制为0001 0000 B,取反加一得 1111 0000 B,即F0H,这就是-0010H的反码。因而内存中的数据为“EBF0”,其中“EB表示跳转”,“F0”就是要跳转的16进制位移量。
同理,0020处的指令,位移量应当是 0018H - 0022H = -000AH ,用反码表示为 F6 H。因此此处的数据为“EBF6”,即跳转程序且位移量为F6H(反码)。
2.运行时指令存储情况
下面以表格形式逐条分析指令。
关键点在于,要理解0020H处的指令,并不是“跳转到0018H处”,而是“跳转程序,位移量为F6H”。
原文链接:https://blog.csdn.net/Dr_Cheeze/article/details/127489914