- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我编写了一个基本的 C 程序,它定义了一个整型变量 x,将其设置为零并返回该变量的值:
#include <stdio.h>
int main(int argc, char **argv) {
int x;
x = 0;
return x;
}
当我使用 objdump 转储目标代码时(使用 gcc 在 Linux X86-64 上编译):
0x0000000000400474 <main+0>: push %rbp
0x0000000000400475 <main+1>: mov %rsp,%rbp
0x0000000000400478 <main+4>: mov %edi,-0x14(%rbp)
0x000000000040047b <main+7>: mov %rsi,-0x20(%rbp)
0x000000000040047f <main+11>: movl $0x0,-0x4(%rbp)
0x0000000000400486 <main+18>: mov -0x4(%rbp),%eax
0x0000000000400489 <main+21>: leaveq
0x000000000040048a <main+22>: retq
我可以看到函数序言,但在我们将地址 0x000000000040047f
处的 x 设置为 0 之前,有两条指令将 %edi 和 %rsi 移入堆栈。这些有什么用?
此外,与我们将 x 设置为 0 的地方不同,GAS 语法中所示的 mov 指令没有后缀。
If the suffix is not specified, and there are no memory operands for the instruction, GAS infers the operand size from the size of the destination register operand.
在这种情况下,-0x14(%rsbp)
和 -0x20(%rbp)
都是内存操作数吗?它们的大小是多少?因为 %edi 是一个 32 位寄存器,所以 32 位移动到 -0x14(%rsbp)
而因为 %rsi 是一个 64 位寄存器,所以 64 位移动到 %rsi,-0x20 (%rbp)
?
最佳答案
在这种简单的情况下,你为什么不直接问你的编译器呢?对于 GCC、clang 和 ICC,有 -fverbose-asm
选项。
main:
pushq %rbp #
movq %rsp, %rbp #,
movl %edi, -20(%rbp) # argc, argc
movq %rsi, -32(%rbp) # argv, argv
movl $0, -4(%rbp) #, x
movl -4(%rbp), %eax # x, D.2607
popq %rbp #
ret
所以,是的,他们使用“旧”帧指针方法将 argv
和 argv
保存到堆栈中,因为新架构允许从堆栈中减去/添加堆栈直接指针,从而省略帧指针 (-fomit-frame-pointer
)。
关于c - 指令 mov %edi 和 mov %rsi 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31405187/
我是 EDI 新手,必须在遗留系统中实现它。 我想确保我有正确的更高级别的概述: 1) 从我的系统为给定的贸易伙伴生成 EDI 文件 2) 可能 FTP 给他们 3) 响应是 ftp'd 给我的,
我已经编写了一个 EDI 文档生成器,它当前会在 ISA 段中填充小于所需字符数的所有字段,并在左侧添加空格,例如“1234567890”表示 15 个字符的元素。我有一位客户希望我在右侧填充空格。我
特别是 835 和 837,更具体地说,是各种状态代码及其含义的列表。 我通过 google 和 duckduckgo 找到了一些商业资源。是否有免费的资源? 谢谢。 最佳答案 这些规范的版权归 DI
我有一个 EDI 文件……我想测试它……所以当我打开它时,它会在 EXCEL 文件中打开,……有一些数据我想更改…… BGS~EGI~PG~265\TIA~5008~~~16796~GA\BGS~EG
69A8AB13 int 3 69A8AB14 int 3 69A8AB15 mov edi,edi 69A8AB17 push
我在 Windows 7 中单步执行结构化错误处理恢复代码(例如,SEH 处理程序完成并传回“CONTINUE”代码后会发生什么)。这是一个函数,它被称为: 7783BD9F mov
我的任务是检查进行内部EDI的可行性,因为第三者的成本已无法控制。 在对该主题进行网络搜索时,有很多有关各种文档类型和格式以及从XML或数据库文件创建它们的信息。这看起来非常简单。但是,在服务器与服务
我目前正在评估 smooks (www.smooks.org)。它看起来就像我们需要的,但我在使用一个简单的示例时遇到了问题。 我有一个 ant 脚本,它为我下载了所有依赖项,包括 EDIFACT 消
我以前读过XML或CSV,但从未见过像EDI这样的东西。 如何读取此文件并获取所需的数据?我看到〜,REF,N1,N2,N4之类的东西,但不知道这些东西是什么意思。 我看过有关x12的内容,但不知道那
我是 edi 数据的新手。我正在使用 smooks api 读取 edi 数据并能够将其解析为 java 对象。我想将 java 对象转换为 edi 数据,因为我没有得到太多信息。这是我试图从 edi
为什么在易于使用的技术面前仍然使用这种过时的格式?它提供我看不到的好处吗?似乎仍有许多供应商仅以这种格式提供数据,而不是像XML这样更易于管理和使用的内容;至少对我来说,提供两种格式都有意义。 此外,
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我正在尝试将 EDI 210 提要导入我的 Web 应用程序。该应用程序安装在 Ubuntu linux 上,因此无论我的解决方案是什么,它都不能是一些仅适用于 Windoze 的虚假解决方案。 由于
我正在寻找有关将传入的 EDI 940 (X12) 转换为 c#.net 中的 (|) 管道分隔平面文件的任何有用链接或建议 最佳答案 对于一次翻译来说,我的技术可能看起来很重,但在这里: 步骤 #1
我正在实现 EDI-x12 header 解析器(仅解析“ISA”段)我注意到有几个字符集可以使用。 我的问题是,我如何知道传入的 edi-x12 消息使用了哪一个,以便我知道如何解释该消息? 最佳答
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是 EDI 的新手,我有一个问题。 我已经读过,通过查看 ISA 行的最后 3 个字符,您可以获得有关 EDI 格式的大部分信息。如果每个 EDI 都使用换行符来分隔实体,这很好,但我发现许多是单行
我们的合作伙伴之一要求将“摘要”edi 消息附加到任何 EDI 发票交换(显然称为“发票列表”)。此消息包含每个单独发票的 RFF 段中应有的引用,以及累积的 MOA 值。 我的问题是:BizTalk
我是汇编的新手,试图理解以下函数的 objdump: int nothing(int num) { return num; } 这是结果(linux、x86-64、gcc 8): push
所以,这可能是一个有点具体的问题,但我的 ASM 任务是创建一个 10 元素数组,将第一个元素添加到最后一个元素,并将结果放入数组的第一个元素,然后是第二个元素元素与第 9 个元素并将结果放入数组的第
我是一名优秀的程序员,十分优秀!