0 前言

先给出源程序

assume cs:code
code segmentmov ax,4c00hint 21hstart:mov ax,0s:nopnopmov di,offset smov si,offset s2mov ax,cs:[si]mov cs:[di],axs0:jmp short ss1:mov ax,0int 21hmov ax,0s2:jmp short s1nopcode ends
end start

运行结果:本程序能够正常Return Operating System

1 程序运行分析

给出程序代码中重要的偏移地址

assume cs:code
code segment0000    mov ax,4c00hint 21hstart:
0005    mov ax,00008 s:nopnopmov di,offset smov si,offset s2mov ax,cs:[si]mov cs:[di],ax0016 s0:jmp short s0018 s1:mov ax,0int 21hmov ax,00020 s2:jmp short s1nopcode ends
end start

关键的代码:

mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax

这部分程序,将s2中的jmp short s1对应的2字节机器码,存放到了s中的2个nop对应的内存单元中。

这里有一个关键点,短转移机器码存放的是位移量,不是偏移地址,因此,原来s2跳转到s1是偏移-10个字节,存放到s的nop中,也将是偏移-10个字节,而不是跳转到s1。

偏移-10个字节,正好跳转到mov ax,4c00H,程序得以正常return operating system。

这里的误区的,从表面看,可能误以为是将跳转到s1这条指令进行拷贝了,实际上不是这样。

那么,为什么是-10而不是-8?因为这条指令本身占2个字节,执行指令前,IP = 0008,执行该指令,IP的变化为IP = IP + 2 - 10 = 0,也就跳转到了mov ax,4c00H了。

再关注一个细节,-10是以补码形式存储的,查看指令jmp short s1的机器码为EBF6F6也就是十进制的-10

我们来看一下IP的十六进制数的变化,指令执行前,IP = 0008,执行过程IP = 0008 + F6h + 2 = 0100h

咦?为什么不是0,而是0100h,回想一个知识,短转移的范围是-128~127,也就是00 - FFh,再进行机器数加法的时候,IP是按照一个字节进行的加法,因此100h将会丢失高位,变为00h,则IP = 0000h

如果偏移地址更大,比如-10000,对应D8F0,这个时候,就进行字运算,超过FFFF才会丢失。

【汇编语言】王爽实验8,分析一个奇怪的程序,学习笔记(20200517)相关推荐

  1. 汇编语言---王爽 (实验 8)分析一个奇怪的程序

    简介 : 分析下面的程序 , 在运行前思考 , 这个程序可以正常返回吗 ? 运行后再思考 , 为什么是这种结果 ? 通过这个程序加深对相关内容的理解 assume cs:code code segme ...

  2. 汇编语言:实验8分析一个奇怪的程序

    实验介绍 实验8 分析一个奇怪的程序 分析下面的程序,在运行前思考:这个程序可以正确返回吗? 运行后再思考:为什么是这种结果? 实验代码 ;实验8 分析一个奇怪的程序 ;分析下面的程序,在运行前思考: ...

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

    仔细阅读9.3节依据位移进行转移的jmp指令,然后理解下面的这个很奇怪的程序就容易多了,当然要看着机器码去分析. assume cs:codesgcodesg segmentmov ax, 4c00h ...

  4. 实验八 分析一个奇怪的程序

    ;分析下面的程序,在运行前仔细思考:这个程序可以正确的返回吗? 运行后在思考:为什么是这样的结果? 通过这个程序加深对相关内容的理解. assume cs:codesgcodesg segmentmo ...

  5. 汇编语言(第三版)王爽著(实验八)分析一个奇怪的程序

    实验内容.程序清单及运行结果 分析下面的程序,在运行前思考:这个程序可以正确返回吗? 运行后思考:为什么会是这种结果? 通过这个程序加深对相关内容的理解. assume cs:codesg codes ...

  6. (十三)《汇编语言(王爽)》 | 实验 8:分析一个奇怪的程序

    文章目录 1. 预备知识 2. 实验任务 3. 总结 1. 预备知识 汇编语言中的 nop 表示空指令,程序运行到此处时什么也不做,但会占用一个指令的时间. 操作符 offset 的功能是取得指定标号 ...

  7. 汇编语言王爽-实验9

    王爽汇编语言实验9 实验要求 参考资料 代码 assume cs:codedata segmentdb 'welcome to masm'db 02h, 24h, 71j data endscode ...

  8. 王爽汇编语言实验8:分析一个奇怪的程序

    好难的一个题,脑洞很大,同时也是对命令是用位移而不是用地址来定位的这一全新概念做的最好阐释. 再来看下题目: 先遵循正规的套路,先从start开始: (为了更好理解,先放出反汇编的代码:注意机器码对应 ...

  9. 汇编语言王爽 实验第四章

    实验一 :创建第一个源程序 在asm文件夹中创建一个名为t2的记事本 编写源文件,其次将其格式修改为asm文件 用masm t2;进行编译生成obj文件 然后用link t2;进行连接生成exe文件 ...

最新文章

  1. 香港深水埗一街道新春气氛浓厚
  2. leetcode--207. 课程表
  3. 一些服务器客户端的c例子
  4. Debian 9.6.0 + OpenMediaVault 4.x : 实机安装前的虚拟机试验
  5. 在iOS上使用AirPrint实现无线打印功能
  6. 2019web前端开发视频教程资料(汇总整理)
  7. 新趋势下的云计算安全行业前沿认证 | CCSK
  8. 13首唐诗五律,哪个是你心目中的“五律”第一?
  9. 功放的工作原理与作用
  10. vscode: Code Runner直接运行多文件C++程序
  11. 银行业务模拟系统(C/C++实现内含详细注释)
  12. Power BI中字体使用微软雅黑
  13. 如何利用python制作一个小游戏
  14. 4位共阴极数码管的动态扫描电路VHDL设计
  15. 前端学起来特别吃力,新人入前端怎么学?
  16. C#使用公共语言拓展(CLE)调用Python3(使用TensorFlow训练的模型)
  17. 声纹识别--基础学习笔记
  18. 证券交易的基本流程是怎样的?
  19. 一番星大厂面试经验分享第一弹
  20. 计算机教师简介50字,教师50字以内个人简介

热门文章

  1. rlwrap插件,实现sqlplus上下翻页
  2. jQuery触发a标签的点击事件无效
  3. 带分页功能的SSH整合,DAO层经典封装
  4. PowerShell_9_零基础自学课程_9_高级主题:静态类和类的操作
  5. Oracle ——如何确定性能差的 SQL
  6. 安卓java桌面图标程序_android如何定制默认桌面上应用程序和shortcut图标 | 学步园...
  7. 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图
  8. 《MySQL——查询长时间不返回的三种原因与查询慢的原因》
  9. leetcode 17. 电话号码的字母组合 思考分析
  10. fisher-yates_使用Fisher-Yates随机播放算法以O(n)时间随机播放给定数组