x64:为什么这段代码给我“地址边界错误”

2023-11-29

为什么以下 x64 程序集给出“地址边界错误”?仅当我在之后添加代码时才会发生这种情况call _print_string。我假设某些寄存器已被修改,但是一旦修改,它们不应该被恢复吗?_print_string函数返回?

我使用的是 Mac OS X

obj_size = 8

.data
    hello_world: .asciz "hello world!"

.text
    .globl _main


_main:

    pushq %rbp
    movq %rsp, %rbp
    leaq hello_world(%rip), %rdi
    callq _print_string

    subq obj_size, %rsp
    movq 1, %rax
    movq %rax, obj_size(%rsp)

    addq obj_size, %rsp


    leave
    ret

C 程序是:

void
print_string(char *str) 
{
    printf("%s\n", str);
}

这段代码的问题非常简单。在使用 AT&T 语法的 GNU 汇编器中 - 用作立即操作数的文字常量需要以前缀$(美元符号)否则常量将被视为内存操作数。

这些行都存在这个问题:

subq obj_size, %rsp
movq 1, %rax
[snip]
addq obj_size, %rsp

在这些情况下,因为您想使用常量obj_size and 1作为值(立即操作数)而不是内存引用。上面的说明应该是:

subq $obj_size, %rsp
movq $1, %rax
[snip]
addq $obj_size, %rsp

subq obj_size, %rsp尝试从内存地址 0x8 处的值中减去 64 位值RSP. movq 1, %rax尝试将内存地址 0x1 处的 64 位值移至RAX。您的程序出现故障,因为无法读取 OS/X 上的这些内存位置。

一篇关于 AT&T 语法和 Intel 语法之间差异的好文章可以在IBM 的网站。他们特别列出了以下差异:

在 AT&T 语法中,立即数操作数前面带有 $;在 Intel 语法中,立即操作数不是。例如:英特尔:push 4,美国电话电报公司:pushl $4


为了缩小此类问题的范围,使用调试器通常是有益的。在 OS/X 上,如果您不使用 Xcode,则可以使用调试器LLDB从命令行。 A使用教程LLDB可能有用。在这种情况下你可以运行LLDB as lldb ./nameofprogram然后使用run命令允许它继续,直到失败。然后调试器会向您显示崩溃发生在哪条汇编指令上。


如果您想了解 64 位 OS/X 代码使用的调用约定苹果是这样定义的:

OS X x86-64 函数调用约定与 System V 应用程序二进制接口 AMD64 架构处理器补充中描述的函数调用约定相同。

您可以找到 System V 应用程序二进制接口 AMD64 架构处理器补充here。调用者和被调用者保存的寄存器列表可以在图 3.4:寄存器使用

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

x64:为什么这段代码给我“地址边界错误” 的相关文章

随机推荐

  • 我可以向 JSON-LD 中的给定 @type 添加自定义属性吗?

    我正在开发一个网站 允许用户探索大量唱片 所有数据当前都存储在一个 JSON 文件中 我将其转换为 JSON LD 以便使其具有语义并可供搜索引擎抓取 Schema org 有一个标准类型音乐专辑 它没有我为每个专辑存储 并呈现给用户 的某
  • C# - 国际设置的 Excel 数字格式问题

    我正在尝试使用 c 3 5 写入 Excel 2003 电子表格 但是我无法让它在不同的国家 地区设置中正常运行 国家 地区设置为英语或德语 这两个设置有不同的小数和千位设置 除非用户更改了 选项 屏幕的 国际 设置中的小数点和千位分隔符
  • 下拉列表项的工具提示

    我有一个下拉列表 我想为下拉列表项添加工具提示 我尝试使用以下代码 但它不起作用 for int d 0 d
  • JQUERY 通过参数 ID 获取元素

    只是想知道 jquery 的等效语法是什么 var elm id my id var elm document getElementById elm id thanks 我想你正在寻找的是 var elm id my id var elm
  • Eclipse CDT clean 在 Windows 上失败:尝试运行 rm -rf

    我在 Windows 7 上使用带有 CDT 的 Juno 当我尝试使用 MinGW 提供的内部构建器或 make 清理项目时 Eclipse 运行 X 命令 射频 并且清理操作失败 从控制台使用外部构建器 mingw32 make 进行日
  • Hive/Hadoop 中的唯一密钥生成

    从大数据 Hive 表中选择一组记录时 需要为每条记录创建唯一的键 在顺序操作模式下 通过调用像 max id 这样的东西很容易生成唯一的 id 由于 hive 并行运行任务 我们如何在不影响 hadoop 性能的情况下生成唯一键作为选择查
  • 需要处理来自非活动(.java)类的点击

    我有一个主要的 Activity 类 其中包含大量代码 数据 所以我想让它简短易读 所以我想创建一个 java 文件来根据要求处理一些功能 喜欢 Button b Button findviewById R id b1 b setOnCli
  • Android 应用程序 CPU 使用率高

    我正在编写一个应用程序 该应用程序必须在较长时间内执行高 CPU 使用率的操作 该操作像服务一样启动 但是android系统因为CPU使用率高而杀死了该应用程序 那么我该怎么做才能减少CPU使用率呢 并使系统不停止我的服务 服务 impor
  • 登录不应该是 GraphQL 中的查询吗?

    In the tutorial在 GraphQL 身份验证上 login is a Mutation type Mutation post url String description String Link signup email St
  • Android 双向滚动

    这更多的是一个大众答案而不是一个问题 我只是不知道如何发布它 版主如果你能告诉我是否有这样的事情 这个问题被问死了 然后我需要做类似的事情 所以我解决了这个问题 这篇文章的答案是如何在android中创建3x3双向滚动视图 下面是如何创建双
  • 如何将 data.frame 列从 Factor 转换为数字 [重复]

    这个问题在这里已经有答案了 我有一个data frame谁的班级栏是Factor 我想将其转换为数字 以便我可以使用相关矩阵 gt str breast data frame 699 obs of 10 variables class Fa
  • 此 linq 代码中的多个 orderby

    如何添加第二个商品来订购 我也想按 goalScored 元素排序 var theteams from teams in xdoc Descendants team orderby int teams Element points desc
  • 使用 Java 在 PostgreSQL 中存储时间的最推荐方法是什么?

    我在 PostgreSQL 数据库中存储两个日期 第一个是网页的访问数据 第二个日期是网页的最后修改日期 这是一个长整型 我有些怀疑存储这些值的最佳策略是什么 我只需要日 月 年和小时 秒 这仅用于统计建议 那么 有些疑问 最好存储尽可能长
  • 使用未知数量的参数调用可变参数函数

    假设我有一个接受可变数量参数的函数 我想从其他地方调用这个函数 构建参数列表 但事先不知道我需要多少个参数 抱歉 没有很好地解释 希望这段代码能让我的问题更清楚 void foo int n va list vl va start vl n
  • Postgresql 正则表达式匹配大写、Unicode 感知

    标题很好地总结了这一点 我正在寻找与 Postgres 运算符的 Unicode 大写字符匹配的正则表达式 明显的方法行不通 gt select A upper column t 1 row gt select upper column t
  • 由于“可变参数参数造成的潜在堆污染”,Eclipse 的“未检查”警告有不同的行为。怎么修?

    我有一个简单的Entry用于填充列表的对象 public class Entry fields public Entry int a String b String c some getters and an AsyncTask检索条目 O
  • Python 不起作用:导入错误:没有名为“logging”的模块

    我在 Digitalocean Ubuntu Droplet 上遇到了一个非常奇怪的问题 Python 2 7 给出了以下错误 from instagram import InstagramAuthentication InstagramA
  • 初始化列表和移动语义

    我是否可以将元素移出std initializer list
  • 如何在 Subversion 服务器中从 https:// 更改为 svn:// 协议

    更新 svn 和 http 协议基准测试正在 签出项目主干需要多长时间 以分钟和秒为单位 svn 协议 5 32 http 协议 5 33 svn 协议 AVG 文件夹例外 2 22 http 协议 AVG 文件夹例外 2 23 速度结果
  • x64:为什么这段代码给我“地址边界错误”

    为什么以下 x64 程序集给出 地址边界错误 仅当我在之后添加代码时才会发生这种情况call print string 我假设某些寄存器已被修改 但是一旦修改 它们不应该被恢复吗 print string函数返回 我使用的是 Mac OS