问题标签 [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.
assembly - i386 汇编问题:为什么我需要干预堆栈指针?
我决定在暑假期间学习 x86 汇编会很有趣。所以我从一个非常简单的 hello world 程序开始,借用免费的例子gcc -S
可以给我。我最终得到了这个:
它编译甚至工作!我想我理解了大部分。
不过,魔法发生在第 3 步。如果我删除这一行,我的程序将在调用puts
和xor
未对齐堆栈错误之间终止。我会更改$20
为另一个值,它也会崩溃。所以我得出结论,这个值很very
重要。
问题是,我不知道它的作用以及为什么需要它。
谁能解释我?(我在 Mac OS 上,这有什么关系。)
assembly - 如何将 GNU GAS 宏参数与其他标记连接以制作单个标签?
我想使用气体宏在装配函数中动态创建一组标签。我想做这样的事情:
这里的 \prefix_\item 类似于 myfunction_7。现在,我可以找到很多递归调用的示例,但我还没有找到涉及传入宏参数的标签连接之一。气体的记录很差,所以对我来说很难回答这个问题。
- 您可以将宏的参数与其他标记连接起来以生成单个标记吗?
- 您最喜欢的气体装配工参考资料是什么?
assembly - 如何创建扩展为“(x + y * 240)* 2”之类的表达式的GNU GAS宏?
我正在使用 GAS 为 ARM Linux 构建一个程序,但我想做一些宏来使我的开发更加智能。然后我想知道:
我怎么能为此做一个宏:(x+y*240)*2
, werex
和y
are int
,将像这样使用:
我怎么能做一个应该这样调用的宏:
这只会做一些已经在其中定义的事情,例如打印功能。
另外,如果我需要宏或函数调用的一些参数。我怎么能做到?
PS:r0
是一个ARM寄存器,像eax
x86
assembly - 如何在 64 位汇编程序中使用 RIP 相对寻址?
如何在 AMD64 架构的 Linux 汇编程序中使用 RIP 相对寻址?我正在寻找一个使用 AMD64 RIP 相对寻址模式的简单示例(Hello world 程序)。
例如,以下 64 位汇编程序可以正常工作(绝对寻址):
我猜想使用 RIP 相对寻址的同一个程序会是这样的:
正常版本在编译时运行良好:
但我无法让 RIP 版本正常工作。
有任何想法吗?
- - 编辑 - -
斯蒂芬佳能的回答使 RIP 版本工作。
现在,当我反汇编 RIP 版本的可执行文件时,我得到:
objdump -d 你好
这显示了我试图完成的事情: lea 0x10(%rip),%rsi 在 lea 指令之后加载地址 17 个字节,即地址 0x400096,可以找到 Hello world 字符串,从而产生与位置无关的代码。
gcc - 关于内联气体的文档
在阅读 linux 0.01 内核时,我会抛出一些难以解码的内联气体:
或者
我不明白如何解释“:”之间的内容。
有没有人有关于它的一些文件?
谢谢
iphone - GAS (GNU Assembler) 可以编译成 iPhone/iTouch 吗?
我正在使用非官方的 Open SDK 为 iDevice 市场编写一些应用程序,但是在 Windows 而不是 Linux 上安装开放工具链时遇到了困难(我会使用 Linux,但我不能在我的工作计算机上),所以我正在对其进行编程GNU 汇编器 (GAS)。
GAS 是否可以将 iDevice 作为输出文件的格式?如果没有,是否有任何基于 Windows 或 Linux 的组装程序(最好是开源的)可以组装到 iPod touch 上?
assembly - 如何在不使用 gcc 的情况下将使用 C 标准库的气体汇编程序与 ld 链接?
作为一个练习,以更准确地了解 c 程序如何工作以及程序必须存在什么最低级别的内容才能使程序能够使用 libc,我自己尝试使用 gas 和 ld 主要在 x86 汇编中进行编程。
作为一个有趣的小挑战,我已经成功地组装和链接了几个链接到不同的自制动态库的程序,但是我无法在不直接使用 gcc 的情况下从头开始编写程序以使用 libc 函数调用。
我了解各个 c 库函数的调用约定,并且已经通过使用 objdump 和 readelf 彻底检查了从 gcc 编译出来的程序,但还没有得到任何地方,至于要在 gas 汇编文件中包含哪些信息以及要调用哪些参数在 ld 中成功链接到 libc。有人对此有任何见解吗?
我在 x86 机器上运行 Linux。
gcc - MIPS 的 GNU 汇编器:如何发出 sync_* 指令?
MIPS32 ISA 为同步指令定义了以下格式:
在这里,stype 可能是 SYNC_WMB (SYNC 4)、SYNC_MB (SYNC 16) 等。在内联汇编器中,我可以使用默认同步:__asm__ volatile ("sync" ::);
。
但是,如果我写类似的东西__asm__ volatile ("sync 0x10" ::)
,它不会编译:
Error: illegal operands 'sync 0x10'
如果将-mips32r2
选项传递给 gcc,则相同。
所以,问题是:如何使用来自 GCC 内联汇编的 SYNC_* (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) 指令?
assembly - 32 位 Linux 程序集 - 将文件链接在一起(gas 和 ld)
我写了一个叫做 strlen 的函数:
我是这样组装的:
然后我在 asm 中编写了一个程序来打印我想与之链接的 argv。我用同样的方法组装。现在我想将它们链接在一起,以便实际程序可以使用 strlen。我试过了:
但这会产生:
我一定错过了一些非常简单的东西。谢谢!
linux - 你如何在linux中制作一个将文件转换为大写的x86汇编程序?
我找到了一个名为:ProgrammingGroundUp-1-0-booksize.pdf 的 pdf 文件,其中一个项目是制作一个汇编程序,它接收文件并将它们转换为大写,`
汇编器被称为“as”,代码在文件的第87页,如果你在google上查找它很容易得到,而且由于某种原因代码没有正确复制和粘贴,所以你有时可能会看到像:jmp to_another_point
我试图摆脱尽可能多的那些,但仍然可能有一些,并且一些评论可能在这个过程中丢失了,所以我建议打开原始的 pdf 文件。我正在运行 Ubuntu linux 版本 10.04.1,我使用的是 2.20.1 版本,问题是它创建了文件,但文件始终为空。