跳出范围解决方案以及不同指令如何影响范围

2024-01-08

我一直在与错误“jmp out of range”作斗争,很多时候我需要从代码的不同部分运行子程序,就像在 C++ 中运行函数一样。

我发现代码的两端都需要跳转到同一个地方,但两者却无法到达那里。

解决这个问题的办法是什么?

我还注意到

PRINT 'something'

似乎比使用占用更多的“空间”:

CALL PTHIS
DB 13, 10, 'something', 0

(如果我在两次跳跃之间放置一个 PRINT,我会跳出范围,但如果我用 PTHIS 替换它,就没有问题)

为什么是这样?


16 位汇编器中条件跳转指令的问题在于它们的偏移量限制为 +127 或 -128 字节。

第386章 介绍了jcc rel1616 位模式下可用的编码,但仅适用于 386 及更高版本。不同的汇编器有不同的选项来启用 16 位代码中的 386 条指令

有些还可以选择自动执行下述操作:jcc rel8 over a jmp rel16。例如,TASM 有/jJUMPS http://comp.lang.asm.x86.narkive.com/dnHzBFc1/locals-and-jumps.


假设你有这个:

    cmp al, '1'
    jnz ItsNot1
    ; lots of code here
ItsNot1:

如果出现跳转超出范围错误,您可以像这样重新编码:

    cmp al, '1'
    jz Its1
    jmp ItsNot1
Its1:
    ; lots of code here
ItsNot1:

我所做的只是改变比较的意义并跳过无条件跳转,将您带到备用代码路径。

如果你有很多条件跳转,有时会很烦人。您将重新编码其中一个,它会触发另一个。然后你重构代码并发现一些损坏的条件可以消失。通常我不会担心它,除非我非常担心代码大小。

一些汇编器有一个开关,可以为您自动调整跳转大小,以便您始终可以编写条件跳转代码,并且它们会自动执行跳转条件跳转技巧。

最有可能的区别是

PRINT 'something'

and

call PTHIS
db 13, 10, 'something'

第一个是一个宏,它扩展为用于打印某些内容的完整代码,加上您要打印的字符串。第二个是简单的call指令(3 个字节),加上字符串。或者,用 C++ 术语来说,PRINT宏就像一个内联函数,并且call PTHIS是一个普通的(非内联的)函数调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跳出范围解决方案以及不同指令如何影响范围 的相关文章

随机推荐

  • MySQL SELECT INTO 等效吗?

    在 SQL Server 中 我可以使用以下命令将表或临时表复制到新表 SELECT INTO syntax 有人知道如何在 MySQL 中执行相同的操作吗 See 创建表 作为选择 http dev mysql com doc refma
  • 按行数设置 TableView 高度

    我有TableView in the MainstoryBoard并且行数每次都是随机的 我想要整体的高度TableView灵活 我的意思是 例如 如果我有 4 行TableView和每个TableView行高是 22 所以TableVie
  • 为什么 JSON.parse 会抛出跨域错误?

    如果没有 JSON parse 以下代码可以正常工作 如果我尝试解析或字符串化我的数据对象 我会收到跨源错误 为什么会发生这种情况以及如何解决它 我在 Title js 中有以下代码 const name show title JSON p
  • EF 6 参数嗅探

    我有一个动态查询太大 无法放在这里 可以肯定地说 在其当前形式中 它利用 CLR 过程根据传递的搜索参数数量动态构建联接 然后获取该结果并将其联接到更详细的表中 以带回对最终用户重要的属性 我已将整个查询转换为 LINQ to Entiti
  • Java - 创建内部时钟

    我希望计算从Java中的特定时间开始经过的时间 以毫秒为单位 经典的使用方式System currentTimeMillis 作为开始时间 然后再次将其与前一个时间一起使用来获取经过的时间 我希望做类似的事情 但不依赖系统时间 如果我依赖系
  • 如何测试 Aural 样式表/CSS3 语音?

    我正在窥探网站代码并注意到他们使用 media aural 这让我想起了它的存在 所以 我想我会玩玩 但后来意识到我不知道如何测试它们 我不希望我的网站听起来像施瓦辛格一家在吃圣诞晚餐 如何通过浏览器测试听觉或语音以确保听起来没问题 听觉和
  • 为什么我们需要 ASP .NET 5 wwwroot 中的 web.config?

    在 ASP NET 5 中 配置 http aspnetmvc readthedocs org projects mvc en latest migration migratingconfig html正在发生巨大的变化 我们不再有web
  • 如何将表格放入帮助模式?

    我正在尝试将 Delphi 2010 中的表单置于 帮助模式 中 我有一个用户单击的按钮 我希望光标更改为帮助光标 然后当用户单击控件时 显示控件的帮助 我可以发送窗口消息吗 Send a WM SYSCOMMAND http msdn m
  • 更新到 Android Studio 3.5 版本后出现的新问题。运行应用程序时不会出现 ADB 设备选择屏幕 (SHIFT-F10) [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 新问题 在 Android Studio 3 5 上运行应用程序时 不再出现设备选择屏幕 它默认为 随机 设备 尝试在谷歌上寻找答案 不去
  • BadZipFile:通过导入 keras 文件不是 zip

    当我运行这段代码时 我得到以下结果error https i stack imgur com YJbTE png 我尝试过不同的技术来解决这个问题 但没有成功 我可以请求有人可以帮助我解决这个问题吗 对于同一问题有一些解决方案 但我无法得到
  • 什么是 pycryptodomex?它与 pycryptodome 有什么不同?

    今天我看到 PySNMP 安装 pycryptodomex 这x这个名字看起来既可疑又令人惊讶 我试图追踪它 但看起来两者都是密码球 https pypi org project pycryptodome and pycryptodox h
  • 为什么Intellij IDEA说已使用的属性未使用?

    我的 Java Maven 项目中有一个属性文件 我有一个类加载这些属性并将它们存储为常量 Constants java file has this code Properties properties new Properties bla
  • 测试假存储库有什么意义?

    当我在家开发时 我一直在努力让自己的心态更加面向 TDD 和一点 DDD 我不明白的一件事是为什么你要创建一个假存储库来测试 我还没有真正研究过它 但测试的想法肯定是帮助解耦你的代码 给你更多的灵活性 减少所需的代码并减少错误的数量 那么有
  • 从数据库中选择、分组和求和结果

    我有一个数据库 其中有一些我想求和的字段 但这不是大问题 我想按这些字段的创建月份对它们进行分组 ActiveRecord 自动创建一个名为 created at 的字段 所以我的问题是 如何按月对结果进行分组 然后对每个月的字段求和 更新
  • Android 应用程序中的布局充气器是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 中的 Layout Inflater 是做什么的 https stackoverflow com questions 3477422 what does layout inflater
  • 检查文件扩展名是否为图像的好方法

    我有这个文件类型过滤器 public const string Png PNG Portable Network Graphics png png public const string Jpg JPEG File Interchange
  • 为什么是“特质T”? C级; class X extends (C with T)` 无法编译?

    斯卡拉代码 trait T class C type W C with T class X extends W W是一个类型别名 但我想定义一个类来扩展它 为什么以及如何解决它 我很难以一种很好的方式构建我的答案 但这里仍然试图解释正在发生
  • Perseo fe docker 实例无法启动

    我面临以下问题 我正在尝试将 FIWARE Perseo 作为 docker 实例部署到我的 Centos 7 服务器 尽管 perseocore 实例运行没有问题 但 perseo 前端的情况却不同 它已创建但无法启动 从日志中可以清楚地
  • PHP 致命错误:调用布尔值上的成员函数 format()

    崩溃于 PHP 致命错误 调用布尔值上的成员函数 format 但对于其他日期效果很好 格式错误 这两个示例都不起作用 因为您有多个错误 您忘记了第二个参数Datet
  • 跳出范围解决方案以及不同指令如何影响范围

    我一直在与错误 jmp out of range 作斗争 很多时候我需要从代码的不同部分运行子程序 就像在 C 中运行函数一样 我发现代码的两端都需要跳转到同一个地方 但两者却无法到达那里 解决这个问题的办法是什么 我还注意到 PRINT