GDB - 神秘的汇编代码是什么?

2024-02-29

Dump of assembler code for function main:
   0x0804833e <+0>:     push   %ebp
   0x0804833f <+1>:     mov    %esp,%ebp
   0x08048341 <+3>:     sub    $0x8,%esp
   0x08048344 <+6>:     and    $0xfffffff0,%esp
   0x08048347 <+9>:     mov    $0x0,%eax
   0x0804834c <+14>:    add    $0xf,%eax
   0x0804834f <+17>:    add    $0xf,%eax
   0x08048352 <+20>:    shr    $0x4,%eax
   0x08048355 <+23>:    shl    $0x4,%eax
   0x08048358 <+26>:    sub    %eax,%esp
=> 0x0804835a <+28>:    movl   $0x10,-0x4(%ebp)
   0x08048361 <+35>:    movl   $0x0,-0x8(%ebp)
   0x08048368 <+42>:    pushl  -0x4(%ebp)
   0x0804836b <+45>:    call   0x8048334 <myfunc1 at test.c:4>
   0x08048370 <+50>:    add    $0x4,%esp
   0x08048373 <+53>:    pushl  -0x8(%ebp)
   0x08048376 <+56>:    call   0x8048339 <myfunc2 at test.c:8>
   0x0804837b <+61>:    add    $0x4,%esp
   0x0804837e <+64>:    mov    $0x0,%eax
   0x08048383 <+69>:    leave
   0x08048384 <+70>:    ret
End of assembler dump.
(gdb) info line
Line 16 of "test.c" starts at address 0x804835a <main+28 at test.c:16> and ends at 0x8048361 <main+35 at test.c:17>.------------------------------------(1)
(gdb) shell cat test.c
#include<stdio.h>

void myfunc1(int recv_arg1)
{
        /* does nothing */
}
void myfunc2(int recv_arg1)
{
   /* does nothing */
}

int main(int argc,char **argv)
{
        int var1;
        int var2;
        var1 = 16;
        var2 = 0;
        myfunc1(var1);
        myfunc2(var2);
        return 0;
}

请注意 (1) 中 main 的 asm 代码在该范围内!这个范围之前的 asm 代码是用于其他目的吗?什么 ?肯定有什么神秘的东西!!


请允许我为您评论一下。

   0x0804833e <+0>:     push   %ebp                    ; Establish standard
   0x0804833f <+1>:     mov    %esp,%ebp               ; stack frame record
   0x08048341 <+3>:     sub    $0x8,%esp               ; Make room for locals
   0x08048344 <+6>:     and    $0xfffffff0,%esp        ; Align esp to 16-byte memory
   0x08048347 <+9>:     mov    $0x0,%eax               ; eax=0
   0x0804834c <+14>:    add    $0xf,%eax               ; eax=f
   0x0804834f <+17>:    add    $0xf,%eax               ; eax=  (eax + 0xf)
   0x08048352 <+20>:    shr    $0x4,%eax               ;      (             >> 4)
   0x08048355 <+23>:    shl    $0x4,%eax               ;     (                    << 4)
   ;The above math rounds up eax as set by 0x0804834c to the next 16-byte boundary
   ;In this case, eax will be 0x10, rounded up from 0x0f.  You compiled without
   ;optimizations?  This could be a "probe" checking whether the upcoming call 
   ;will fail?

   0x08048358 <+26>:    sub    %eax,%esp               ; Make room for "0x10 more mystery bytes"
   0x0804835a <+28>:    movl   $0x10,-0x4(%ebp)        ; var1 = 16
   0x08048361 <+35>:    movl   $0x0,-0x8(%ebp)         ; var2 = 0
   0x08048368 <+42>:    pushl  -0x4(%ebp)              ; push           var1
   0x0804836b <+45>:    call   0x8048334 <myfunc1 at test.c:4> ;myfunc1(    );
  0x08048370 <+50>:    add    $0x4,%esp                ; pop (var1)
   0x08048373 <+53>:    pushl  -0x8(%ebp)              ; push           var2
   0x08048376 <+56>:    call   0x8048339 <myfunc2 at test.c:8> ;myfunc2(    );
   0x0804837b <+61>:    add    $0x4,%esp               ; pop (var2)
   0x0804837e <+64>:    mov    $0x0,%eax               ; return 0;
   0x08048383 <+69>:    leave                          ; undo standard stack frame
   0x08048384 <+70>:    ret                            ; actual return

我觉得这个问题问得好,为什么最后执行0x08048358它分配看似无用的空间。我怀疑这是在执行调用之前检查 esp 超出范围异常。如果你指定你正在使用的处理器,我想知道这是否会“消失”——它听起来像是针对特定芯片的勘误表。

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

GDB - 神秘的汇编代码是什么? 的相关文章

  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • FileNotFoundException 打开失败:在 Android 上将图像文件保存到内部存储期间 EPERM(不允许操作)

    当我尝试将图像保存到 Android 上的内部存储时 我遇到了这个问题 public static String setImage Bitmap image if image null FileOutputStream outputStre
  • Tkinter Optionmenu 小部件中相同值的索引

    我正在尝试访问选项菜单小部件中相同值的索引 在下面的代码中 无论我选择两个 b 字符中的哪一个 列表中的字符 b 都会返回索引 1 我需要根据列表中的索引位置区分两个 b 字符 即从选项菜单小部件中选择第一个 b 应返回索引 1 而第二个
  • 如何在Android中读取套接字输入流

    can anybody tell me how to read socket input stream Here is my code if serverIpAddress equals try InetAddress serverAddr
  • 在源代码管理中存储 SSL 证书

    只要您不存储私钥 将 Web 应用程序的 SSL 证书存储在源代码存储库中是否会存在安全问题 使用源代码管理来备份此类内容是多么容易 我有点被宠坏了 并且想充分利用它 但我也不想草率地使用它 或危及安全 不需要 证书是公开的 服务器将在每次
  • 在 golang HTTP FileServer 中设置 Content-Type 标头的 'charset' 属性

    我在测试 golang Web 应用程序时遇到问题 在部署版本中 nginx 位于应用程序前面并显式设置charset utf8 以便所有文本类型都附加字符集声明 在测试中 我直接访问 golang 应用程序 这里的内容类型没有字符集集 当
  • Intent.putExtras 不一致

    我的 AlarmManager 遇到了一个奇怪的情况 我正在使用 AlarmManager 安排一个事件 并使用intent putExtra 传入一个字符串 琴弦要么静音 要么振动 当接收器触发时 手机应该关闭铃声或将手机设置为振动 日志
  • NHibernate 一对一关系

    我有以下内容Domain Model s public class WriteOffApprovalUser public virtual string UserName get set public virtual Employee Em
  • 使用 git add --patch 手动编辑

    因此 我在分支 A 中得到了一个一直在处理的文件 并且我正准备提交它 但是 查看差异 我认为最好将其放入两个单独的提交中 好吧 在这种情况下 也许是两个单独的分支 我之前使用过 git add patch 来暂存单独的帅哥 所以我想我可以使
  • 如何验证 3 个字段中的日期输入?

    我有 3 个用于日期输入的字段
  • 截断 ASP.Net MVC 中的模型属性

    我目前以不同的方式使用截断和文本编辑器 两者都工作正常 但我面临这个问题 我想截断文本编辑器中的文本 T T 我使用这种方式截断及其工作原理 helper Truncate string input int length if input
  • 如何使用 JPA Criteria Query 重写此查询?

    public class Entity private boolean suspended private String code Type type org jadira usertype dateandtime joda Persist
  • Plotly.js:无法显示完整的分类 x 轴

    我必须绘制一个关于时间的 x 轴折线图 x 轴类似于 00 00 00 05 00 10 23 55 使其不是数字而是分类 但是 我可能没有 y 轴上的完整数据列表 例如 仅从 00 00 到 09 00 有数据 数据必须从 00 00 开
  • Clearfix 与 Twitter 引导程序

    我对 twitter bootstrap 有一个问题 对我来说看起来有点奇怪 我有一个固定在左侧的侧边栏和一个主要区域 div div ul li A li li A li li C li li D li li E li li F li l
  • 如何在 Visual Studio 2010 中添加 SIMD 相关编译器标志

    我找到了这个标志列表 http www ncsa illinois edu UserInfo Resources Software Intel Compilers 10 0 main for mergedProjects optaps fo
  • 如何在keras中可视化卷积神经网络中间层的输出?

    最近我创建了用于猫和狗分类的基本 CNN 模型 非常基本 如何使用 keras 可视化这些层的输出 我使用 keras 的 Tensorflow 后端 您可以定义一个模型 获取您想要查看的每一层的输出并进行预测 假设您有完整的模型 cnnM
  • 没有工作树就无法使用 git-pull

    我正在尝试从我刚刚设置的远程存储库中提取数据 并且收到了消息 没有工作树就无法使用 git pull 我读过的所有内容似乎都指向我的 git 目录 但看起来不错 git branch 给出输出 master and git ls tree
  • 处理回发数据中的数组 - MVC3

    我目前是一名 WebForms 开发人员 正在尝试转向 MVC 我对 MVC 感到非常兴奋 而且我真的很开心 但我遇到了一个奇怪的问题 所以我想做的是为 小部件 创建一个高级编辑器 我已经发布了下面的代码 当您添加前 4 5 个项目时 一切
  • python asyncio 和 httpx

    我对异步编程非常陌生 我正在尝试使用 httpx 我有以下代码 我确信我做错了什么 只是不知道它是什么 有两种方法 一种是同步 另一种是异步 它们都来自谷歌金融 在我的系统上 我看到花费的时间如下 异步 5 015218734741211同
  • 整洁地替换为一个奇怪的字符

    我正在使用 Tidy 带有 PHP5 并启用 UTF8 输入 输出和字符编码 当我用清洁器清洁绳子时 nbsp 在其中 它用一个奇怪的字符替换它 我尝试过弄乱整洁的配置 但我尝试的任何操作似乎都不起作用 整理前 This is a test
  • GDB - 神秘的汇编代码是什么?

    Dump of assembler code for function main 0x0804833e lt 0 gt push ebp 0x0804833f lt 1 gt mov esp ebp 0x08048341 lt 3 gt s