gnu-assembler相关内容

mov 0, %eax 上带有 x86 程序集的 Segfault

我正在尝试组装一小段 x86 代码.我在一台 32 位机器上,我编写了以下代码.它应该只是将值添加到 eax 然后返回.我意识到不会有任何输出.当我使用 编译它时 gcc main.S -o main 它编译没有错误.但是当我运行它时会出现段错误(gdb 声称它在第一条 movl 指令上出现段错误).main.S 中包含以下代码.我做错了什么? .text.globl 主要主要的:推% ..
发布时间:2022-01-12 16:24:56 其他开发

x86 Linux 汇编器从 _start 获取程序参数

我正在尝试创建一个程序来仅在屏幕上写入参数.我创建了一些程序来获取 C 函数参数,或者我使用 C 将参数发送到我的 asm 程序.有没有办法只使用汇编程序获取程序参数 例如: ./程序“文本" 我正在使用 (Gnu 汇编程序) 通常我使用这些参数 [esp+4] 因为 esp 是程序/函数调用指针,但在纯 asm 中它没有获取命令行参数. 有没有办法做到这一点? 我 ..
发布时间:2022-01-06 13:03:15 服务器开发

`movl (%eax), %eax` 中的括号是什么意思?

我已经用谷歌搜索了很多,但无法弄清楚括号 () 的含义.另外,我看到一些语法为 movl 8(%ebp), %eax 有人可以给我推荐一些好的参考资料吗?我无法在 Google 的前 20 个结果中找到任何结果. 解决方案 %eax 是注册 EAX;(%eax) 是地址包含在寄存器EAX中的内存位置;8(%eax) 是地址为 EAX 值加 8 的内存位置. ..
发布时间:2022-01-06 12:53:19 其他开发

在内联 GNU 汇编器中获取字符串长度

我正在重新学习我在非常旧的 MS-DOS 机器上使用的汇编程序!!! 这是我对这个函数应该是什么样子的理解.当尝试将 0xffffffff 放入 ecx 时,它编译但因 SIGSEGV 而崩溃. 代码在具有 32 位 Debian 9 的 VM 中运行.任何帮助将不胜感激. int getStringLength(const char *pStr){int len = 0;字符 * ..
发布时间:2022-01-06 12:50:15 服务器开发

如何使用 GCC 生成最小的 BIOS hello world 引导扇区,该扇区可通过 USB 记忆棒在真实硬件上运行?

我已经设法制作了一个适用于 QEMU 2.0.0 Ubuntu 14.04 的最小引导扇区: .code16.global _start_开始:命令行mov $msg, %simov $0x0e, %ah环形:lodsb或 %al, %aljz停止整数 $0x10jmp循环停:高留言:.asciz “你好世界".org 510.word 0xaa55 编译: as -o main.o mai ..
发布时间:2021-12-18 09:31:32 其他开发

气体:太多的内存引用

编译以下指令时: movl 4(%ebp), 8(%ebp) 我得到:太多的内存引用. 这是怎么回事? 解决方案 括号前的数字是一个字节偏移量(这会导致内存引用发生),并且movl.您需要先将值临时移动到寄存器中. movl 4(%ebp), %ecxmovl %ecx, 8(%ebp) ..
发布时间:2021-12-18 09:17:35 其他开发

使用 GAS AT&T 指令为引导扇区计算填充长度?

所以我想在引导扇区中添加填充.假设,目前只有一个无限循环:jmp ..该扇区的长度需要为 512 字节.此外,还需要在末尾添加魔术数字 0xaa55. jmp ..跳过 508, 0.word 0xaa55 但是如果我想打印一些东西但不想计算所有字节以将其填充到正确的大小怎么办? 在 Intel/NASM 语法中,它是: ;打印一些东西乘以 510-($-$$) db 0dw 0xaa55 ..
发布时间:2021-12-18 09:16:21 其他开发

MOV src、dest(或)MOV dest、src?

MOV 可能是每个人在学习 ASM 时学到的第一条指令. 刚刚遇到一本书Rajat Moona 撰写的 GNU/Linux 中的 IA32 架构汇编语言编程链接已删除) 但我了解到它是MOV dest, src.就像“用 src 加载 dest".甚至 Wiki 也是如此. 我不是说作者错了.我知道他是对的.但我在这里错过了什么? btw.. 他正在使用 GCC 的 as ..
发布时间:2021-12-18 09:13:08 其他开发

将 GNU 中的内存与常量区分为 .intel_syntax

我有一条用 Intel 语法编写的指令(使用 gas 作为我的汇编程序),如下所示: mov rdx, msg_size...msg: .ascii "你好,世界!\n".set msg_size, .- 味精 但是那条 mov 指令正在被组装成 mov 0xe,%rdx,而不是我所期望的 mov $0xe,%rdx.我应该如何编写第一条指令(或 msg_size 的定义)以获得预期的行为? ..
发布时间:2021-12-18 09:00:38 其他开发

如何使用 GNU GAS 汇编器生成像 nasm -f bin 这样的普通二进制文件?

我有一些 NASM 文件,它们通常具有以下结构: [BITS 64][ORG 0x0000000000200000]开始:...退 我是这样组装它们的: nasm -f bin abc.asm 我想改用 GAS 编写其中的一些.两个问题: 我应该在 GAS 中使用哪些指令?我找到了“.org"指令,但 GAS 似乎没有“.bits"指令. 我应该向 gcc 或 as 传递什么 ..
发布时间:2021-12-18 08:57:09 其他开发

x86 汇编器:浮点比较

作为编译器项目的一部分,我必须为 x86 编写 GNU 汇编代码来比较浮点值.我试图找到有关如何在线执行此操作的资源,并且据我所知,它的工作方式如下: 假设我要比较的两个值是浮点堆栈上的唯一值,那么 fcomi 指令将比较这些值并设置 CPU 标志,以便 je、jne、jl、...指令都可以使用. 我之所以这么问是因为这只有时有效.例如: .section .datamsg: .as ..
发布时间:2021-12-18 08:53:00 其他开发

像“[RIP + _a]"这样的 RIP 相关变量引用如何?在 x86-64 GAS Intel 语法中工作?

考虑 x64 Intel 程序集中的以下变量引用,其中变量 a 在 .data 部分声明: mov eax, dword ptr [rip + _a] 我无法理解此变量引用的工作原理.由于a是变量运行时地址对应的符号(带重定位),如何[rip + _a]解引用a?确实,rip保存的是当前指令的地址,它是一个很大的正整数,所以加法会导致a的地址不正确? 相反,如果我使用 x86 语法(非常 ..

如何在 64 位汇编程序中使用 RIP 相对寻址?

如何在用于 AMD64 架构的 Linux 汇编程序中使用 RIP 相对寻址?我正在寻找一个使用 AMD64 RIP 相对寻址模式的简单示例(一个 Hello world 程序). 例如,以下 64 位汇编程序可以正常(绝对寻址)运行: .text.global _start_开始:mov $0xd, %rdxmov $msg, %rsi推送 $0x1流行%rax移动 %rax, %rdi ..
发布时间:2021-11-25 05:02:05 C#