gnu-assembler相关内容

C 函数调用约定:为什么使用 movl 而不是 pushl?

我不明白为什么以下几行使用 movl 将数据推送到堆栈指针下方是 GCC 生成的. movl -4(%ebp), %eax # -4(%ebp) (完整代码) 我猜这段代码试图为函数调用推送 3 个参数.但是为什么不使用 pushl.这段代码的用途是什么,它是如何工作的? 解决方案 Hans Passant 回答正确.push/pop 操作码可以分解为两个微操作,它们执行内存移 ..
发布时间:2021-11-24 23:18:31 C#

为什么GCC会生产ANDL $-16?

我需要一些帮助来理解 GCC 这样做的原因 主要:pushl %ebpmovl %esp, %ebp还有 $-16, %esp # ???subl $48, %esp # ???movl $8, 16(%esp)movl $4, 20(%esp) 为什么要先减16,然后再减48?做 subl $64, %esp 不是更容易吗? 解决方案 andl $-16, %esp # ??? 上 ..
发布时间:2021-11-24 23:14:41 C#

ARM64 在 iOS 上使用gas?

我有一些已移植到 64 位 ARM 的汇编函数,它们在 Android 上运行良好,但是当我尝试在 Xcode 中编译相同的文件时,我发现 clang 使用了不同的语法(不同于ARM 官方文档). 我发现了一些将源文件从一种格式转换为另一种格式的脚本,但这不是理想的解决方案(当源文件包含预处理器定义时,这些脚本似乎不起作用). 我可以在 Xcode 中简单地使用 gas,或者配置 cl ..
发布时间:2021-11-17 22:44:21 移动开发

固件补丁的 ARM/Thumb 代码...如何告诉 gcc 汇编器/链接器到 BL 到绝对地址?

我正在尝试编写固件模块(针对现有固件,我没有源代码)所有 Thumb 代码. 是否有人知道如何在 gcc as (GAS) 汇编程序中执行此操作:使用 BL 无需手动计算偏移量,当 BL 使用某些现有函数(不在我的代码中......但我知道它的地址) 目前,如果我想使用 BL ...我必须:- 返回我的代码-找出并添加在我正在编写的函数中组装所有先前指令所产生的所有字节- 将我的函数的 ..
发布时间:2021-11-17 22:21:15 其他开发

内部搬迁未修复

我最近开始为 arm 内核编写汇编程序.我的第一个小演示,只有 .text 部分,运行没有任何问题. 作为一个逻辑扩展,我想将汇编代码组织成通常的部分:.text、.data、.bss. 所以我写了以下简单的程序: .globl _start.section .text_开始:主乙.乙.乙.乙.乙.乙.乙.主要的:ldr r0, x没有.section .datax: .word ..
发布时间:2021-11-17 22:11:49 其他开发

ARM 程序集中的立即数是否需要散列?

我一直在努力阅读由 gcc 生成的一些不同的 arm 汇编代码,但我发现了一些我在规范中找不到的东西. movw r0, #39784移动 r0, 1 显然第一个是将值 39784 移动到底部 16 位或 r0,但 movt 的“1"操作数是奇数,因为它前面没有散列,我的印象是立即数需要散列.在某些情况下它是否是可选的?还是我错过了什么神奇的东西? 解决方案 GNU 汇编器不需要在 A ..
发布时间:2021-11-17 21:44:12 其他开发

如何重写文件内容?Linux x86_64,汇编,GAS

嗨,我完成了这项激动人心的任务,实际上几乎完成了......但它在一个有趣的方面失败了.任务是加载一个带有整数的文件,对它们进行排序并将它们写入文件.是的...嗯,我的程序正在这样做,但它保留了原始内容.即: 让我们说4532 应该得到有序的内容32 45 好吧,我的程序保留了原始内容并添加了新内容:45 32 32 45. 那么对解决这个问题有什么建议吗?虽然删除原始文件 ..
发布时间:2021-09-29 19:47:53 服务器开发

在 GAS 中进行系统调用并使用 .data 部分中的变量并在另一个子程序中访问它们以进行系统调用

这是我使用 GAS 语法为 64 位英特尔程序集编写的代码示例.当代码运行时,期望打印出字符串:在 _print 子例程中. #这个例子是一个调用子程序的例子.global _start.section .text_开始:调用_print_出口:#退出通话mov $60, %rax异或 %rdi, %rdi系统调用_打印:#设置栈帧推 %rbp移动 %rsp, %rbp# 写入系统调用的参数设置 ..
发布时间:2021-09-29 19:47:32 服务器开发

为什么 AT&T jmp *bar 组装成带有 SIB 字节的机器代码?指令中没有使用寄存器

我在 x86 机器上有这个绝对间接跳转指令: ff 24 25 30 10 60 00 产生于: jmp *bar 但是我在解码它的第二个和第三个字节时遇到了麻烦. 第二个应该是 Mod R/M 字段.所以它转化为: 00 100 100 含义: 00 - 没有位移的内存(但它有常量地址,这不是“位移"吗?) 100 (dec. 4) - 扩展 ..
发布时间:2021-09-29 19:46:51 其他开发

Gnu 汇编程序给出了意外的内存操作数

GNU 汇编器在汇编 Intel 语法代码时给出了意外的内存操作数. 我已将我的错误减少到一行单独的代码,并且在过去的三天里,我尝试了任何方法来理解为什么 GNU 汇编器会产生一些我无法理解的东西.我知道这必须(或应该)是微不足道的,但我不知所措. 以下文本驻留在文件 code.asm 中: .intel_syntax noprefix.global 一些代码一些代码:输入 3mov ..
发布时间:2021-09-29 19:44:49 其他开发

x86_64 无法将 64 位值添加到 rax,“'add' 上的操作数不匹配"

我正在尝试组装一些 64 位代码,但组装失败了: addq $0xffffff7fc0005000, %rax 错误: `add' 的错误操作数类型不匹配 第一个操作数是一个 64 位值,后者是一个应该可以正确组装的寄存器.该指令前面是 .code64 伪操作.我正在组装 x86_64-elf-as test.s -o test.o --64 至于汇编器本身,当使用 --ver ..
发布时间:2021-09-29 19:44:17 其他开发

在程序集 linux 中将浮点值打印到 STDOUT

我正在尝试将浮点值打印到控制台,但它给出了意外的结果,因为数字太大且符号不同. 计划 .datafloat_: .asciz "%f\n"n1: .float 10.4n2: .float 10.3.文本.globl 主主要的:低于 1 美元,%esp结束flds n1fsubs n2fsts 1(%esp)movl 1(%esp), %eax呼叫 pfladdl $1, %esp.出口: ..
发布时间:2021-09-29 19:40:35 其他开发

如何使用 Intel 语法在 GNU 汇编器中以字节为单位获取函数的大小?

我需要在汇编时以字节为单位计算函数的大小.我尝试了各种方法,包括: .set chk0_sz, offset chk0_e - offset chk0_s 然后使用mov rcx, offset chk0_sz来获取值. 但是,它给出了错误: 错误:在内存操作数中不能使用多个符号. 这里的chk0_e和chk0_s是两个标签,分别表示函数的结束和开始. 有什么想法吗? ..
发布时间:2021-09-29 19:39:27 服务器开发

为什么 GCC 会发出“lea"?而不是“子"减法?

我正在查看通过反汇编一些 C 程序生成的一些程序集,但我对我经常看到重复的单个优化感到困惑. 当我在 GCC 编译器上没有优化时使用 subl 指令进行减法,但是当我打开优化时(-O3 准确地说)编译器使用 leal 指令代替减法,示例如下: 没有优化: 83 e8 01 subl $0x1, %eax 有优化 8d 6f ff leal -0x1(%edi), %ebp 这两 ..
发布时间:2021-09-29 19:36:07 其他开发