问题标签 [gnu-assembler]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 了解基指针和堆栈指针:在 gcc 输出的上下文中
我有以下 C 程序:
当使用带有 gcc 的 -S 指令编译时,我得到以下程序集:
我不明白的是为什么较早的数组元素离 bp 更远?看起来数组上的元素几乎是以相反的顺序放置的。
另外为什么 gcc 不使用 push 而不是 movl 将数组元素推入堆栈?
不同的观点
将数组作为静态变量移动到全局命名空间到我得到的模块:
使用以下 C 程序:
这并没有给堆栈提供更多的洞察力。但是看到汇编的不同输出使用略有不同的语义是很有趣的。
assembly - 如何使用 GNU 汇编器 (as) 将汇编文件编译为原始二进制文件(如 DOS .com)格式?
我想在 Windows 中编译这个源代码(它只是一个例子):
当我用 NASM 或 FASM 编译它时,输出文件长度为 2 个字节。但是当我用 GNU 汇编器(as)编译它时,输出文件的长度是 292 字节!
如何使用 GNU 汇编器 (as) 将汇编文件编译为原始二进制文件(如 DOS .com)格式?
为什么我这样做?
我想编写自己的简单操作系统,我用 C 编写代码(不使用任何 C 标准库,甚至 stdio.h 或 math.h)并将其转换为程序集:
然后,我将汇编文件编译为原始二进制文件:
然后我将a.out
(汇编程序的输出)重命名为my_os.flp
并最终使用 VMWare 启动我的操作系统 :)
linux - x86_64 汇编 Linux 系统调用混淆
我目前正在 Linux 上学习汇编语言。我一直在使用“从头开始编程”一书,所有示例都是 32 位的。我的操作系统是 64 位的,我一直在尝试在 64 位中完成所有示例。但是我遇到了麻烦:
这只是调用 Linux 退出系统调用或者它应该调用。相反,它会导致 SEG FAULT,而当我这样做时
有用。显然问题是我移动到 %rax 的值。我在第二个示例中使用的价值 1 美元是“从头开始编程”所说的使用,但是 Internet 上的多个来源说 64 位系统调用号是 60 美元。参考 我做错了什么?我还应该注意哪些其他问题以及我应该使用什么作为参考?以防万一你需要知道,我在从头开始编程的第 5 章。
c - 在 Linux 64 位上结合 C 和汇编(32 位代码)
我有一个 64 位 Ubuntu 操作系统,我一直在学习 32 位汇编。我正在尝试编译这两个文件:
正方形.s:
主.c:
在我的 32 位虚拟机上,我用这个命令编译了它们
它奏效了。我遇到的问题是我想在我的 64 位机器上编译这些文件。我尝试了几种编译这些文件的方法,但都没有奏效。谁能指出我正确的方向?有没有办法做到这一点?我试过-m32但这没有用。
当我这样做时:
我明白了:
c - 如何将 C 目标文件与汇编语言目标文件链接?
我在链接 2 个目标文件时遇到问题,其中一个是从汇编语言源文件生成的,另一个是从 C 源文件生成的。
C源代码:
汇编源代码:
当我像这样使用'gcc'编译和运行时:
我得到 5 这是正确的。但是,当我单独编译/组装然后像这样与'ld'链接时:
我得到一个分段错误。这是什么原因造成的?我没有 100% 正确地遵循 C 调用约定吗?
assembly - GNU GAS 程序集中是否有代表当前地址的符号?
我很想知道是否有任何特殊的 GAS 语法可以实现与 NASM 示例中相同的功能:
特别是我对$
代表当前地址的符号感兴趣。
assembly - GAS 是否有任何评估类似于 NASM 的 $ 令牌的东西?
我刚开始组装的道路,第一个“你好,世界!” 我找到的教程http://asm.sourceforge.net/intro/hello.html提供了一种很好的伪动态获取字符串长度以进入系统调用的方法。
这在 nasm 中效果很好,一切都可以毫无疑问地组装、链接和运行。
当我试图找到一种方法在气体中做同样的事情时,问题就来了。
我知道在这种情况下 $ 是一个评估当前装配位置的标记http://www.csie.ntu.edu.tw/~comp03/nasm/nasmdoc3.html#section-3.5
这个表达式 ($ - msg) 可以用gas表示,还是这个nasm独有的语法糖?
debugging - gcc 与 as-ld 用于调试目的,不命中 gdb 断点
我的平台是 ubuntu i686(32 位)
如果我使用带有调试选项的 gcc 驱动程序编译程序集源:
我使用 emacs 编辑器上集成的 gdb 调试器打开 toupper 可执行文件
我在第一个指令上生成了一个断点
当我使用 run 命令开始执行时,调试器正确地停止在 _start 标签上。
如果我用 as assembler 编译相同的源 toupper.s 并用 ld 链接器链接:
现在调试步骤与 gcc 案例相匹配。
我看到符号表是正确的,断点标记它是正确的,但执行不是一步一步的。
我在 gcc 案例上显示了详细步骤,并使用 as/ld 案例再次尝试,但结果相同
¿ 在 gcc 案例中有一些默认选项与 as/ld 案例不匹配?
提前致谢
assembly - GNU 汇编器编译错误“内联 asm 中的操作数无效”
我正在尝试使用 GNU 汇编器编译一些汇编代码,目标是 ARM 平台。但是会出现一些错误。我不熟悉汇编语法。
谁能告诉我如何解决这个错误?
导致此编译错误的内联 asm 代码在这里:
assembly - asm 指令“ldr”和“ldr_post”有什么区别?
我在尝试将最新的 ffmpeg 迁移到 iOS 平台时遇到了一些编译错误。这些错误来自 GNU 汇编器(gas),它似乎无法处理最新 ffmpeg 中的一些 asm 指令。
例如:
但是,在 ffmpeg 的先前版本(更具体地说,0.7 版)中找不到指令“ldr_post”。
我的问题是,“ldr_post”和“ldr”有什么区别?我可以将“ldr_post”更改为一些更简单的指令的组合,以避免这些编译错误吗?