无法设置寄存器 x86-64 中的最低字节? [复制]

2023-12-14

我正在 x86-64 中编写一个函数,将 1 字节值转换为表示该字节的 ASCII 代码的十六进制字符串。在我的函数开始时,我尝试使用

movb %dil, %r11b

将 1 字节值存储在寄存器 %r11 的最低字节中。然而,当我在 gdb 中检查这一点时,%r11b 从未被设置。相反,%r11 的高字节被设置。这是我使用 gdb 时得到的结果:

Breakpoint 1, 0x00000000004011f0 in byte_as_hex ()
(gdb) print /x $r11b
$1 = 0x0
(gdb) print /x $r11
$2 = 0x246
(gdb) print /x $rdi
$3 = 0x48
(gdb) print /x $dil
$4 = 0x48
(gdb) stepi  /* subq $8, %rsp */
0x00000000004011f4 in byte_as_hex ()
(gdb) print /x $r11b
$5 = 0x0
(gdb) print /x $r11
$6 = 0x246
(gdb) print /x $rdi
$7 = 0x48
(gdb) print /x $dil
$8 = 0x48
(gdb) stepi /* movb %dil, %r11b */
0x00000000004011f7 in byte_as_hex ()
(gdb) print /x $r11b
$9 = 0x0
(gdb) print /x $r11
$10 = 0x248
(gdb) print /x $rdi
$11 = 0x48
(gdb) print /x $dil
$12 = 0x48
(gdb) print /x $r11d
$13 = 0x248
(gdb) print /x $r11w
$14 = 0x248
(gdb) print /x $r11b
$15 = 0x0

我很困惑,因为我特意尝试将 movb 从 %dil 移动到 %r11b,但我仍然无法设置字节。谁能向我解释为什么会发生这种情况?谢谢!


这里存在多个问题:

  1. (报告为GDB bug.) 未定义便利变量(一个 GDB 局部变量,以$),当使用显式格式说明符打印时,显示为 0 而不是默认值void,未指定格式时显示:
$ gdb /bin/true
Reading symbols from /bin/true...
(gdb) p $asdf
$1 = void          <------ undefined, OK
(gdb) p/x $asdf
$2 = 0x0           <------ the problem
(gdb) set $asdf=4345
(gdb) p $asdf
$3 = 4345
(gdb) p/x $asdf
$4 = 0x10f9
(gdb) 
  1. 寄存器值与便利变量的值具有相同的语法。因此,当您弄错寄存器的名称时,例如使用r11b而不是 GDB 的r11l,您引用一个(n个未定义)便利变量。此外,即使您只是在不正确的情况下使用正确的名称,例如R11L,你也碰到这个了。
  2. GDB 使用自己的 x86(_64) 寄存器名称集。有时它们与给出的名称不同,例如在英特尔手册中(例如ftag而不是英特尔的FTW)。无论如何,通用寄存器的最低字节在 GDB 中具有以下名称:
al
cl
dl
bl
spl
bpl
sil
dil
r8l
...
r15l

他们没有别名,例如r11b for r11l,因此必须使用正确的名称。

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

无法设置寄存器 x86-64 中的最低字节? [复制] 的相关文章

  • GDB可以杀死一个特定的线程吗?

    我正在运行一个应用程序 firefox 我想知道是否可以使用 GDB 附加到进程并杀死特定线程 有没有办法做到这一点 我知道此操作可能会使应用程序崩溃 EDIT 在此调试会话中 ps ax显示firefox pid是1328 gdb App
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • “mov offset(%rip),%rax”有什么作用?

    Does rax获取偏移量加上这条指令的地址 还是下一条指令的地址 从微代码的角度来看 如果答案是下一条指令可能会更容易 下一个 这是 x86 上的一般规则 另请参阅分支 在 Intel 手册第 2 卷第 2 2 1 6 RIP 相对寻址部
  • 如何从 gdb 命令提示符执行外部命令?

    我正在使用 gdb 调试程序 每当我错过断点或决定添加另一个观察点时 我必须终止该进程并重新运行它 为了将现有的 gdb 附加到它 我使用attach
  • 分离Gdb而不恢复劣质

    Gdb 与任何其他程序一样 并不完美 我时不时会遇到导致当前 Gdb 实例无法使用的错误 此时 如果我有一个调试会话 其中有很多有价值的状态 我希望能够在其上启动一个新的 Gdb 会话 也就是说 分离 退出 Gdb 并启动一个新的 Gdb
  • 有什么方法可以判断我的 iPhone 应用程序在运行时是否在调试器下运行?

    如果我的错误处理代码在调试器下运行 我希望它的行为有所不同 具体来说 如果我在手机上运行 未连接到调试器并且断言失败 我想将错误发送到我的服务器 当我在gdb下时 我想闯入调试器 虽然我可以想象苹果将如何编写代码 但我找不到任何关于测试调试
  • dprintf 与 break + 命令 + continue 之间有什么区别?

    例如 dprintf main hello n run 生成与以下内容相同的输出 break main commands silent printf hello n continue end run 使用是否有显着的优势dprintf ov
  • 使用 libtool 和 gdb

    我正在开发一个使用 GNU 自动工具的项目 因此为了使用 gdb 调试代码 我从 libtool 中运行 gdb libtool mode execute gdbtui foobar 是否可以重新加载项目的修改版本 而不必退出 gdb li
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • cout 可以以某种方式改变变量吗?

    所以我有一个看起来像这样的函数 float function float x SomeValue return x SomeOtherValue 在某些时候 这个函数会溢出并返回一个非常大的负值 为了尝试准确追踪发生这种情况的位置 我添加了
  • 缺少单独的调试信息,请使用: debuginfo-install glibc-2.12-1.47.el6_2.9.i686 libgcc-4.4.6-3.el6.i686 libstdc++-4.4.6-3.el6.i686

    CentOS 6 2 GNU gdb GDB 红帽企业 Linux 7 2 50 el6 当我使用 GDB 调试简单的 C 代码时 我看到以下警告 Missing separate debuginfos use debuginfo inst
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • LC3 LEA指令和存储的值

    我对这个问题感到困惑 指令后寄存器0中存储的值是多少 LEA R0 A 被处决了吗 为什么答案是x370C 我认为应该将A的地址加载到R0中 如果是这样我们怎么知道地址 有人可以帮忙吗 非常感谢 ORIG X3700 LEA R0 A LD
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 从命令行调试 iOS 应用程序构建

    我正在通过命令行构建 iOS 应用程序 但在调试它时遇到问题 如果我使用 XCode 进行构建 它会让我在设备上 构建和调试 而不会出现任何问题 但现在 我不知道如何使用 gdb 在设备上启动它并逐步执行它 如果我尝试 添加自定义目标 可执
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动

随机推荐

  • 如何使用 float/double 的模数?

    我正在为学校项目创建 RPN 计算器 但在使用模数运算符时遇到了问题 由于我们使用的是双精度数据类型 因此模数不适用于浮点数 例如 0 5 0 3 应该返回 0 2 但我遇到了被零除的异常 指令说要使用fmod 我到处寻找fmod 包括ja
  • 在显示上下文菜单之前右键单击选择 TreeView 节点

    我想在显示 ContextMenu 之前右键单击选择一个 WPF TreeView 节点 对于 WinForms 我可以使用这样的代码查找在上下文菜单下单击的节点 WPF 替代品有哪些 根据树的填充方式 发件人和 e Source 值可能会
  • 从室内自行车数据特征解码蓝牙数据

    我正在尝试使用健身机器服务 室内自行车数据特征来获取节奏数据 通过使用 nRF Connect Android 应用程序 我可以看到数据就在那里 示例数据 inst speed 8 5km h inst cadence 45 0 per m
  • 比较效率

    一般情况下什么比较快 if num gt 10 or if num lt 10 编译器很可能会优化这类事情 不用担心 在这种情况下只需编写代码以保持清晰即可 汇编语言通常有以下操作 gt and lt 步数与 lt and gt 例如 用摩
  • iPad 视网膜图像 - 为什么使用两种不同的图像尺寸?

    对于 iPad Retina 或 iPhone Retina 为什么我们需要有两种类型的图像尺寸并为 Retina 版本添加 2x 之类的后缀 难道我们不能只有一种类型的视网膜分辨率图像 而对于没有视网膜显示屏的设备 让设备处理将图像调整为
  • .Net Treeview 事件处理

    我正在将 VB6 应用程序迁移到 Net 我们必须始终提供类似的功能 一种形式是带有复选框的树视图 该复选框具有三级节点 第一级仅用于对下一级进行分组 并且它们不可检查 第二级节点可由用户检查 并且当检查或取消检查时 其所有子节点都会效仿
  • Protobuf-net - 序列化 .NET GUID - 如何在 C++ 中读取它?

    我在 NET 应用程序中使用 Protobuf net 相对轻松地序列化了一个对象 我还使用 GetProto 命令获取 protobuf net 生成的 proto 文件 在 NET 生成的 proto 文件中 我的 GUID 字段的类型
  • 本地 Blazegraph 上的 Wikidata :此处预期有 RDF 值,发现“”[第 1 行]

    我们 Thomas 和 Wolfgang 已按照此处的说明在本地安装了 wikidata 和 blazegraph https github com wikimedia wikidata query rdf blob master docs
  • 通过 ADFS(Active Directory 联合身份验证服务)对用户进行身份验证

    我需要检查特定用户是否存在于 Active Directory 中ADFS 所以 我想要我的ADFS to check user Authentication 通过用户名 密码 任何人都可以提供示例代码或教程吗 提前致谢 要使用用户名 密码
  • 加载 Webchat 控件后立即从机器人发送问候/欢迎消息

    我正在使用 Microsoft 的 C Bot 框架开发一个机器人 我试图在用户发送任何内容之前向他 她发送欢迎消息作为介绍 经过研究 我使用了一些实现这一点HandleSystemMessage功能并在以下情况下发送消息Conversat
  • 如何为 Android 应用程序创建类似“脉冲”的 UI

    I would like to know how can I create a Pulse like app on android Here is a screenshot 有很多事情 它有许多 水平内容行 每 行 都有内容的 单元格 我可
  • GKE 上的集群更新后容器日志不起作用

    最近 我对集群进行了升级 该集群运行多个用 Java 编写的微服务容器 使用默认的 Spring Boot 的 log4j2 默认配置 从那时起 容器日志不再更新 这kubectl 日志命令工作正常 可以使用此命令查看所有最近的日志 但应该
  • Lua for 循环减少 i?奇怪的行为[重复]

    这个问题在这里已经有答案了 有人可以向我解释一下吗 for i 1 5 do print i i i 1 print i end 输出是 1 0 2 1 3 2 and so forth 我预计 i 会在 1 和 0 之间变化 但显然它不断
  • 带条件的 sum() 在 dplyr 包中提供了不正确的结果

    申请时sum 条件为summarize 函数 它没有提供正确的答案 制作数据框x x data frame flag 1 uin 1 val 2 x rbind x data frame flag 2 uin 2 val 3 这就是 x 的
  • 如果泛型类型参数在运行时之前未知,如何调用静态泛型类方法?

    假设我有一个静态泛型类 它的泛型类型参数直到运行时才可用 如何调用其成员 请看下面的代码片段 static class Utility
  • 是否可以在 android 运行时更新 string.xml 文件?

    我想在我的应用程序中动态应用本地化 因此是否可以在 java 文件中定义字符串并将该字符串提取到我们的布局 xml 文件中 即 就像我们将 string anystringname 替换为 java 文件中定义的字符串到我们的布局文件 定义
  • 实时生成(泊松?)随机变量

    我有一个实时运行的程序 具有可变的帧速率 例如可以是 15 fps 也可以是 60 fps 我希望平均每 5 秒发生一次事件 每一帧 我想调用一个函数 该函数将自上一帧以来的时间作为输入 并在调用它的情况下平均每 5 秒的运行时间返回 Tr
  • 同一文件的.NET DLL 依赖关系

    我升级了我们的一个网站 并对这个错误感到非常高兴 Pre bind state information LOG User NT AUTHORITY NETWORK SERVICE LOG DisplayName
  • Tkinter 画布和带网格的滚动条

    我有一张装在画框里的画布 photoFrame Frame centerFrame width 250 height 190 bg EBEBEB photoFrame grid row 0 column 1 sticky nsew phot
  • 无法设置寄存器 x86-64 中的最低字节? [复制]

    这个问题在这里已经有答案了 我正在 x86 64 中编写一个函数 将 1 字节值转换为表示该字节的 ASCII 代码的十六进制字符串 在我的函数开始时 我尝试使用 movb dil r11b 将 1 字节值存储在寄存器 r11 的最低字节中