问题标签 [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.

0 投票
3 回答
10445 浏览

c - 了解基指针和堆栈指针:在 gcc 输出的上下文中

我有以下 C 程序:

当使用带有 gcc 的 -S 指令编译时,我得到以下程序集:

我不明白的是为什么较早的数组元素离 bp 更远?看起来数组上的元素几乎是以相反的顺序放置的。

另外为什么 gcc 不使用 push 而不是 movl 将数组元素推入堆栈?


不同的观点

将数组作为静态变量移动到全局命名空间到我得到的模块:

使用以下 C 程序:

这并没有给堆栈提供更多的洞察力。但是看到汇编的不同输出使用略有不同的语义是很有趣的。

0 投票
3 回答
11738 浏览

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 启动我的操作系统 :)

0 投票
5 回答
19738 浏览

linux - x86_64 汇编 Linux 系统调用混淆

我目前正在 Linux 上学习汇编语言。我一直在使用“从头开始编程”一书,所有示例都是 32 位的。我的操作系统是 64 位的,我一直在尝试在 64 位中完成所有示例。但是我遇到了麻烦:

这只是调用 Linux 退出系统调用或者它应该调用。相反,它会导致 SEG FAULT,而当我这样做时

有用。显然问题是我移动到 %rax 的值。我在第二个示例中使用的价值 1 美元是“从头开始编程”所说的使用,但是 Internet 上的多个来源说 64 位系统调用号是 60 美元。参考 我做错了什么?我还应该注意哪些其他问题以及我应该使用什么作为参考?以防万一你需要知道,我在从头开始编程的第 5 章。

0 投票
2 回答
2006 浏览

c - 在 Linux 64 位上结合 C 和汇编(32 位代码)

我有一个 64 位 Ubuntu 操作系统,我一直在学习 32 位汇编。我正在尝试编译这两个文件:

正方形.s:

主.c:

在我的 32 位虚拟机上,我用这个命令编译了它们

它奏效了。我遇到的问题是我想在我的 64 位机器上编译这些文件。我尝试了几种编译这些文件的方法,但都没有奏效。谁能指出我正确的方向?有没有办法做到这一点?我试过-m32但这没有用。

当我这样做时:

我明白了:

0 投票
2 回答
12871 浏览

c - 如何将 C 目标文件与汇编语言目标文件链接?

我在链接 2 个目标文件时遇到问题,其中一个是从汇编语言源文件生成的,另一个是从 C 源文件生成的。

C源代码:

汇编源代码:

当我像这样使用'gcc'编译和运行时:

我得到 5 这是正确的。但是,当我单独编译/组装然后像这样与'ld'链接时:

我得到一个分段错误。这是什么原因造成的?我没有 100% 正确地遵循 C 调用约定吗?

0 投票
3 回答
8414 浏览

assembly - GNU GAS 程序集中是否有代表当前地址的符号?

我很想知道是否有任何特殊的 GAS 语法可以实现与 NASM 示例中相同的功能:

特别是我对$代表当前地址的符号感兴趣。

0 投票
1 回答
168 浏览

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独有的语法糖?

0 投票
1 回答
612 浏览

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 案例不匹配?

提前致谢

0 投票
1 回答
2463 浏览

assembly - GNU 汇编器编译错误“内联 asm 中的操作数无效”

我正在尝试使用 GNU 汇编器编译一些汇编代码,目标是 ARM 平台。但是会出现一些错误。我不熟悉汇编语法。

谁能告诉我如何解决这个错误?

导致此编译错误的内联 asm 代码在这里:

0 投票
2 回答
368 浏览

assembly - asm 指令“ldr”和“ldr_post”有什么区别?

我在尝试将最新的 ffmpeg 迁移到 iOS 平台时遇到了一些编译错误。这些错误来自 GNU 汇编器(gas),它似乎无法处理最新 ffmpeg 中的一些 asm 指令。

例如:

但是,在 ffmpeg 的先前版本(更具体地说,0.7 版)中找不到指令“ldr_post”。

我的问题是,“ldr_post”和“ldr”有什么区别?我可以将“ldr_post”更改为一些更简单的指令的组合,以避免这些编译错误吗?