Intel 64架构中CALLF(Far Call)可以有64位地址内存操作数吗?

2024-02-06

在 Intel 32 位架构中,我可以使用 ModR/M 字节调用 32 位地址位置。根据英特尔手册,我需要 /2 (010B) 用于操作码扩展,00B 用于 Mod,101B 允许我拥有 32 位位移。

如果我想在 64 位架构中进行远调用,以便有空间容纳 64 位地址,我知道我可以 /3 (011B) 进行操作码扩展。然而,仍然只提供 32 位位移。有没有办法将目标指定为 64 位地址?

主要是,我想知道如何在给定该位置的 64 位地址的情况下进行呼叫。


你问的是不是call far [64_bit_absolute]是可编码的吗?要获取m16:64来自 64 位绝对地址的 80 位操作数?

No, call far [mem] https://www.felixcloutier.com/x86/CALL.html并不特殊,ModRM 只能做[disp32] or [RIP+rel32],或涉及寄存器的寻址模式。 引用内存位置的内容。 (x86 寻址模式) https://stackoverflow.com/questions/34058101/referencing-the-contents-of-a-memory-location-x86-addressing-modes

Only mov al/ax/eax/rax, [abs64]可使用 64 位绝对地址进行编码,使用特殊形式moffs不使用 ModRM 字节的 MOV。这对你来说毫无用处:在寄存器中包含段或偏移量对你没有帮助。

但你可以使用mov r64, imm64将地址放入寄存器中。例如

mov  rax, absolute_address      ; where seg:off are stored
call far [rax]

或者,如果您的静态地址是 64 位,但您的汇编器 + 链接器知道它在call操作说明,call far [rel seg_and_offset]可以使用RIP相对寻址模式。


否则,也许您将 seg:off 调用目标与其存储的位置混淆了?在 64 位模式下,call ptr16:64(直接远调用)不可用,因此您始终需要内存中的 seg:offcall获取。但它可以在堆栈上或其他地方,例如

push 0x23        ; new CS value ends up in the low 2 bytes of a qword
push rax         ; new offset.  It goes at a lower address because x86 is little-endian
call far [rsp]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intel 64架构中CALLF(Far Call)可以有64位地址内存操作数吗? 的相关文章

  • 如何在 VC++ 中使用 _W64 和 __w64?

    有这样的事情 w64 http msdn microsoft com en us library s04b5w00 VS 71 aspx在 Visual C 9 中 我在尝试将本机 C DLL 移植到 64 位时遇到了它 特别是在crtde
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 汇编中如何计算负数

    我是汇编新手 我有一个关于如何表示负数的问题 我有三个 DWORDS 变量 比方说 result DWORD 0 i DWORD 3 j DWORD 5 我想计算这个公式 结果 i j 8 但是 当我执行 i j 时 由于符号 结果将是一个
  • 在汇编中显示两位数? [复制]

    这个问题在这里已经有答案了 我对汇编编程完全陌生 在课堂作业的示例中 需要将两个数字相加并显示总和 我发现神秘的是当其是两位数时显示总和 这是我的代码 mov al num1 mov bl num2 add al bl add ax 303
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • AVX512 掩码寄存器(k1...k7)的 GNU C 内联 asm 输入约束?

    AVX512 为其算术命令引入了 opmask 功能 一个简单的例子 上帝螺栓 org https godbolt org z P7xWD8 include
  • 即使我确实为变量设置了初始值,数据段也没有被初始化

    我已经编写了一个代码 该代码应该生成某种数字列表 但是即使我为它们分配了初始值 我的数据段变量也没有被初始化 This is how DS 0000 looks when I run it 这是我的代码 但数据段只保留垃圾值 MODEL s
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 有 64 位 Ruby 吗?

    似乎人们正在为 64 位平台编译 MRI Ruby 1 8 7 我已经搜索和阅读了一段时间 但没有真正得到我想要的答案 我想知道的是 你们中是否有人真的在 Ruby 中使用了超过 4GB 的内存 如果这样编译 Ruby 真的是 64 位吗
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 在 C++ 中将 64 位值左移 64 位给出奇怪的结果[重复]

    这个问题在这里已经有答案了 可能的重复 64位移位问题 https stackoverflow com questions 1024968 64bit shift problem 我在 Windows 8 64 位上使用 Visual St
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 如何在命令行中使用 Visual Studio 编译 x64 代码?

    我想使用 Windows 命令行编译一个简单的 hello world 风格的程序 cl file name c 很容易 现在我想在 64 位中做同样的事情 我应该怎么办 您需要使用发出 x64 代码的 cl exe 编译器版本 哪一个有点
  • 当我没有指定 x64 平台而不是 AnyCPU 时,MSBuild 如何或为何选择 x64 平台?

    我在跑msbuild exe通过常规 PowerShell 控制台的 Rake 这是从诊断级别运行打印的命令 C Windows Microsoft NET Framework v4 0 30319 msbuild exe D Projec
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include

随机推荐

  • 在 Razor 组件 (Blazor) 中渲染 Razor 部分视图

    我最近发现了 Blazor 并且一直在尝试一些测试项目 以更好地评估如何将其包含在未来的项目中 由于具有 MVC 背景 我从一个 MVC 项目开始 并向其中添加了 Razor 组件 并将其嵌套在标准 MVC razor 页面中 反过来可能吗
  • Windows 会清除内存页吗?

    我知道 Windows 有一个选项可以清除页面文件当它关闭时 当实际物理 虚拟内存进入或超出范围时 Windows 是否会对实际物理 虚拟内存执行任何特殊操作 例如 假设我运行应用程序 A 它将可识别的字符串写入内存中的变量 然后关闭该应用
  • 使用参数调用事件处理程序

    Visual Studio 2008 C 3 0 我有一个调用事件处理程序的方法 我想将该方法接收到的两个参数传递给事件处理程序 我想做这样的事情 wc DownloadDataCompleted wc DownloadedDataComp
  • 计算进行时显示进度条

    我正在编写代码来计算 Pi 的值 有时可能需要很长时间才能计算 我添加了一个进度条来显示进度 但代码完全按照我的指示执行 它在计算后打开进度条 然后立即关闭它 当值达到 100 时它会关闭 我试图将进度条的代码粘贴到循环中 但很快我意识到这
  • HighcharteR:绘图带和绘图线不起作用

    我正在尝试在 highcharteR 中绘制每日值系列 在图表中标记垂直线 绘图线 和日期周期 绘图带 我研究了几个SO问题并达到了这个脚本 但我发现了以下问题 1 未绘制绘图区 2 未绘制情节 3 x轴应该是以我不理解的方式转换的日期 我
  • FormControl uniqueUntilChanged() 不起作用

    我很难做distinctUntilChanged在下一个场景中工作 我制作了一个异步验证器 它使用服务来检查给定用户名的用户是否存在 该验证器作为指令绑定到输入 class ValidateUniqueUsernameDirective i
  • 可以配置 Tmux 加载 ~/.bashrc 而不是 ~/.bash_profile 吗?

    现在 当我登录 Tmux 时 仅 bash profile被加载 我想要 bashrc改为被呼叫 那可能吗 这个问题与以下无关tmux 要解决它 请确保添加source bashrc to bash profile就是这样 您可以了解更多有
  • dynamoDB - 通过主键数组从数据库获取多个项目

    我有一个用户 id 数组 我想从 dynamoDB 表中获取具有该 id 的所有用户 文档里没找到 有任何想法吗 我最终使用了batchGet 这是一个操作AWS DynamoDB DocumentClient http docs aws
  • ORG指令后设置段寄存器

    我目前正在关注操作系统开发教程 http brokenthorn com Resources OSDev4 html 其中包括有关引导加载程序的讨论 我的引导加载程序当前处于 16 位实模式 因此 我能够使用提供的 BIOS 中断 例如 V
  • 为什么不能在 do while 循环的表达式部分内声明变量?

    以下语法有效 while int i get data 但以下情况则不然 do while int i get data 我们可以通过标准草案了解原因N4140部分6 4 1 condition expression attribute s
  • Panda 的 DataFrame 双转置将数字类型更改为对象

    我正在从 Excel 中的两个不同位置读取数据帧的标题和数据 两者都正确对齐但不相邻 标题可能包含许多空白 因此我需要丢弃这些标题和数据中相应的列 所以我的最终帧具有非空标头和与这些标头相对应的数据 下面使用转置的逻辑有效 但我在双重转置时
  • 无法解析类型“System.Net.Http.HttpClient”的服务

    我创建了一个ViewComponent调用一个类REST API使用HttpClient 这是代码 public class ProductsViewComponent ViewComponent private readonly Http
  • C 中的默认参数和参数提升

    我当时正在研究默认参数提升 并陷入了困境 在 C 2011 ISO IEC 9899 2011 中 相关部分似乎是 6 5 2 2 函数调用 6 如果表示被调用的表达式 函数具有不包含原型的类型 即整数 对每个参数执行升级 并且具有以下参数
  • 从 ASP.NET 中的 URL 获取数据

    我是 ASP NET 新手 我想从 ASP NET 上的 url 获取数据 需要将数据存储到字符串中 如果假设这是我的 URL 那么我想以字符串形式获取此 URL 数据 http www islamicfinder org prayer s
  • 将 XPath count() 与 contains() 结合使用

    我正在使用以下 次优 XML a b b a
  • mysql 中未来日期的日期时间值不正确

    MySQL语句 insert into banners path app id enabled from date to date updated at created at values banners example png com e
  • SSL 在 Chrome 中工作,但有时在 Firefox 中工作,而不在 IOS、Android 或 Blackberry 上工作

    我有 SSL 问题 我已将站点从一台服务器移至另一台服务器 因此必须移动 SSL 不幸的是 新服务器的根域与原始服务器不同 示例 原始版本为 www domain com 新版本为 www domainisnew com 我有多个网站使用此
  • 根据其他数据框中提供的范围值创建新列

    我有两个数据框 其中一个数据框作为参考表 另一个包含实际值 gt gt gt reference table MinRange MaxRange Multiplier Group 0 10 30 2 A 1 10 40 4 B 2 10 1
  • 使用 Java/JNI 时 Linux 上的信号处理

    我从事在 Wind River Linux 上运行的嵌入式系统的工作 它是 Java 和 C 的混合体 并带有一些用于技术之间通信的 JNI 我们构建了自定义错误处理 以便在出现任何意外错误时生成回溯和其他信息来帮助我们确定问题 此错误处理
  • Intel 64架构中CALLF(Far Call)可以有64位地址内存操作数吗?

    在 Intel 32 位架构中 我可以使用 ModR M 字节调用 32 位地址位置 根据英特尔手册 我需要 2 010B 用于操作码扩展 00B 用于 Mod 101B 允许我拥有 32 位位移 如果我想在 64 位架构中进行远调用 以便