Error[8]: Undefined offset: 1, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我遇到了崩溃,在调查时我发现自己完全被以下代码阻止: 0000000000000a00 <_IO_vfprintf>:a00: 55 push %rbpa01: 48 89 e5 mov %rsp,%rbpa04: 41 57 push 我遇到了崩溃,在调查时我发现自己完全被以下代码阻止:
0000000000000a00 <_IO_vfprintf>:a00:       55                      push   %rbpa01:       48 89 e5                mov    %rsp,%rbpa04:       41 57                   push   %r15a06:       41 56                   push   %r14a08:       41 55                   push   %r13a0a:       41 54                   push   %r12a0c:       53                      push   %rbxa0d:       48 81 ec 48 06 00 00    sub    [+++]x648,%rspa14:       48 89 95 98 f9 ff ff    mov    %rdx,0xfffffffffffff998(%rbp)

这是通过在64位linux x86系统上运行objdump –disassemble /usr/lib64/libc.a然后搜索输出生成的.这是AT&T syntax,所以目的地在右边.

具体来说,我不明白最后一条指令.它似乎是在函数触及该寄存器之前将rdx寄存器的值写入堆栈中某处(远,远)的内存中.对我来说,这没有任何意义.

我试着阅读调用约定,现在我最好的理论是rdx用于参数,所以代码基本上是“返回”参数值.这不是功能的结束,当然,它并没有真正回归.

解决方法 是的,这是一个参数. ABI used by Linux向寄存器分配最多6个“INTEGER”(< = 64位整数或指针)类型参数,以明显且易于记忆的顺序%rdi,%rsi,%rdx,%rcx,%r8,%r9. 堆栈帧是1648字节(子$0x648,%rsp声称1608字节,加上5个64位寄存器之前已被推送),0xfffffffffffffff998是-1640. 因此代码将第三个参数存储在堆栈框架的底部附近. (注意:windows 64位ABI与linux不同.) 总结

以上是内存溢出为你收集整理的linux – 无法理解x86-64函数前导码全部内容,希望文章能够帮你解决linux – 无法理解x86-64函数前导码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
linux – 无法理解x86-64函数前导码_系统运维_内存溢出

linux – 无法理解x86-64函数前导码

linux – 无法理解x86-64函数前导码,第1张

概述我遇到了崩溃,在调查时我发现自己完全被以下代码阻止: 0000000000000a00 <_IO_vfprintf>:a00: 55 push %rbpa01: 48 89 e5 mov %rsp,%rbpa04: 41 57 push 我遇到了崩溃,在调查时我发现自己完全被以下代码阻止:
0000000000000a00 <_IO_vfprintf>:a00:       55                      push   %rbpa01:       48 89 e5                mov    %rsp,%rbpa04:       41 57                   push   %r15a06:       41 56                   push   %r14a08:       41 55                   push   %r13a0a:       41 54                   push   %r12a0c:       53                      push   %rbxa0d:       48 81 ec 48 06 00 00    sub    x648,%rspa14:       48 89 95 98 f9 ff ff    mov    %rdx,0xfffffffffffff998(%rbp)

这是通过在64位linux x86系统上运行objdump –disassemble /usr/lib64/libc.a然后搜索输出生成的.这是AT&T syntax,所以目的地在右边.

具体来说,我不明白最后一条指令.它似乎是在函数触及该寄存器之前将rdx寄存器的值写入堆栈中某处(远,远)的内存中.对我来说,这没有任何意义.

我试着阅读调用约定,现在我最好的理论是rdx用于参数,所以代码基本上是“返回”参数值.这不是功能的结束,当然,它并没有真正回归.

解决方法 是的,这是一个参数. ABI used by Linux向寄存器分配最多6个“INTEGER”(< = 64位整数或指针)类型参数,以明显且易于记忆的顺序%rdi,%rsi,%rdx,%rcx,%r8,%r9. 堆栈帧是1648字节(子$0x648,%rsp声称1608字节,加上5个64位寄存器之前已被推送),0xfffffffffffffff998是-1640. 因此代码将第三个参数存储在堆栈框架的底部附近. (注意:windows 64位ABI与linux不同.) 总结

以上是内存溢出为你收集整理的linux – 无法理解x86-64函数前导码全部内容,希望文章能够帮你解决linux – 无法理解x86-64函数前导码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1033271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存