硬编码实例

硬编码实例出处 http www groad net bbs read php tid 3000 html nbsp 有增删 nbsp nbsp nbsp 对于 CPU 来说 它对指令和数据本质上是不区分的 数据也可以当成是指令执行 nbsp 在硬编码的一个简单示例里 揭示了这一点 nbsp nbsp nbsp 下面是一个普通的汇编程序 nbsp section text global start start nop

      出处:http://www.groad.net/bbs/read.php?tid-3000.html  有增删

    对于 CPU 来说,它对指令和数据本质上是不区分的。数据也可以当成是指令执行。 在硬编码的一个简单示例里,揭示了这一点。 

   下面是一个普通的汇编程序: 

 .section .text .global _start _start: nop nop jmp start_of_setup nop nop nop start_of_setup: movl $42, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80

   这里,我们只关心 jmp 这条指令,上面的应用跳转到 start_of_setup 这条标号下执行指令。通过 objdump 查看编译后生成的目标文件:

$ objdump -d hcode.o hcode.o: file format elf32-i386 Disassembly of section .text: 00000000 <_start>: 0: 90 nop 1: 90 nop 2: eb 03 jmp 7 4: 90 nop 5: 90 nop 6: 90 nop 00000007 : 7: ba 2a 00 00 00 mov $0x2a,%edx c: cd 80 int $0x80 e: b8 01 00 00 00 mov $0x1,%eax 13: bb 00 00 00 00 mov $0x0,%ebx 18: cd 80 int $0x80

    可以看到 jmp start_of_setup 的指令码为两个字节:eb 03 。其中 eb 是 jmp 指令本身的指令码;03 则是跳转的偏移,也就是说 jmp 的跳转地址是从紧随其后的那条 nop 指令处开始计算的,偏移 3 个字节后的那条,即 mov $0x2a, %edx。

    现在我们用硬编码来实现这个跳转。所谓的硬编码,通俗的讲,就是直接用指令码来表示。修改上面的程序:

.section .text .global _start _start: nop nop .byte 0xeb .byte start_of_setup-4 nop nop nop start_of_setup: movl $42, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80


   上面直接将原来程序中的 jmp 指令处用两个 .byte 的定义来取代。对于一般场合来说,.byte 会用来指定一个字节数据,而它也就仅会当成数据来使用。但在这里,它就变成了指令。再用 objdump 看一下,发现指令码和第一个程序中的是一模一样的,也就是我们在此处使用了硬编码。另外,.byte start_of_setup实际上计算的也就是 start_of_setup 和 .byte start_of_setup之间的距离(3个nop,3个字节)。

 那么,既然可以用指令来完成的事情,为什么非要用硬编码的方式做呢?这样做有什么好处呢?我们来看下arch/x86/boot/header.S中的一段注释:

 硬编码实例

硬编码实例



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177967.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:20
下一篇 2026年3月26日 下午6:20


相关推荐

  • 学习使用templete.js

    学习使用templete.js2019独角兽企业重金招聘Python工程师标准>>>…

    2025年6月8日
    7
  • 高效工作指南

    高效工作指南

    2021年9月9日
    53
  • 详解机器学习中的数据处理(一)——缺失值处理(附完整代码)

    详解机器学习中的数据处理(一)——缺失值处理(附完整代码)摘要 在机器学习中 我们的数据集往往存在各种各样的问题 如果不对数据进行预处理 模型的训练和预测就难以进行 这一系列博文将介绍一下机器学习中的数据预处理问题 以 UCI 数据集为例详细介绍缺失值处理 连续特征离散化 特征归一化及离散特征的编码等问题 同时会附上处理的 Matlab 程序代码 这篇博文先介绍缺失值的处理 要点如下 处理缺失值的方法 读取数据集文件 查找 替换缺失数据

    2025年11月21日
    5
  • mapbox绘制航线图

    mapbox绘制航线图mapbox 先上效果图再来一段官网描述 MapboxGLJS 是一个 JavaScript 库 它使用 WebGL 以 vectortiles 和 Mapboxstyles 为来源 将它们渲染成互动式地图 它是 MapboxGL 生态系统的一部分 其中还包括 MapboxMobile 它是一个用 C 编写的兼容桌面和移动平台的渲染引擎 P S mapbox 地图展示的大部分信息可以在地图样式里面配置 包括平常的河流 土地 天空等颜色 还有各种建筑是否显示地区名字 中英文等 代码

    2026年3月17日
    1
  • 失去焦点和获得焦点发生事件(js)「建议收藏」

    失去焦点和获得焦点发生事件(js)「建议收藏」失去焦点:onblur=”hanshu(this)”获得焦点:onfocus=”hanshu(this)”{     alert(‘请确认您输入格式是否正确!’);   }//函数名:chksafe//功能介绍:检查是否含有,//,///参数说明:要检查的字符串//返回值:0:是 1:不是functionchksafe(a)

    2022年6月30日
    27
  • Platform SDK installed

    Platform SDK installedQT在跨平台时,安装后出现PlatformSDKinstalled错误解决

    2022年5月4日
    90

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号