gnu-assembler相关内容
我不明白为什么以下几行使用 movl 将数据推送到堆栈指针下方是 GCC 生成的. movl -4(%ebp), %eax # -4(%ebp) (完整代码) 我猜这段代码试图为函数调用推送 3 个参数.但是为什么不使用 pushl.这段代码的用途是什么,它是如何工作的? 解决方案 Hans Passant 回答正确.push/pop 操作码可以分解为两个微操作,它们执行内存移
..
我需要一些帮助来理解 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 # ??? 上
..
我只是想将 myarray[0] 的值加载到 eax: .text.数据# 定义一个包含 3 个单词的数组array_words: .word 1, 2, 3.globl 主主要的:# 将 array_words[0] 分配给 eax移动 $0, %edilea array_words(,%edi,4), %eax 但是当我运行这个时,我不断收到段错误.有人可以指出我在这里做错了什么吗?
..
我有一些已移植到 64 位 ARM 的汇编函数,它们在 Android 上运行良好,但是当我尝试在 Xcode 中编译相同的文件时,我发现 clang 使用了不同的语法(不同于ARM 官方文档). 我发现了一些将源文件从一种格式转换为另一种格式的脚本,但这不是理想的解决方案(当源文件包含预处理器定义时,这些脚本似乎不起作用). 我可以在 Xcode 中简单地使用 gas,或者配置 cl
..
我正在尝试编写固件模块(针对现有固件,我没有源代码)所有 Thumb 代码. 是否有人知道如何在 gcc as (GAS) 汇编程序中执行此操作:使用 BL 无需手动计算偏移量,当 BL 使用某些现有函数(不在我的代码中......但我知道它的地址) 目前,如果我想使用 BL ...我必须:- 返回我的代码-找出并添加在我正在编写的函数中组装所有先前指令所产生的所有字节- 将我的函数的
..
我最近开始为 arm 内核编写汇编程序.我的第一个小演示,只有 .text 部分,运行没有任何问题. 作为一个逻辑扩展,我想将汇编代码组织成通常的部分:.text、.data、.bss. 所以我写了以下简单的程序: .globl _start.section .text_开始:主乙.乙.乙.乙.乙.乙.乙.主要的:ldr r0, x没有.section .datax: .word
..
我正在为基于 ARM Cortex-M3 的微控制器(Thumb 2 指令集)编写汇编程序,使用 GNU as. 在一些示例代码中,我发现像 .size、.section 和 .type 这样的指令,我理解它们是 ELF 指令.举个例子: .section .text.Reset_Handler.weak Reset_Handler.type Reset_Handler, %functi
..
我一直在努力阅读由 gcc 生成的一些不同的 arm 汇编代码,但我发现了一些我在规范中找不到的东西. movw r0, #39784移动 r0, 1 显然第一个是将值 39784 移动到底部 16 位或 r0,但 movt 的“1"操作数是奇数,因为它前面没有散列,我的印象是立即数需要散列.在某些情况下它是否是可选的?还是我错过了什么神奇的东西? 解决方案 GNU 汇编器不需要在 A
..
嗨,我完成了这项激动人心的任务,实际上几乎完成了......但它在一个有趣的方面失败了.任务是加载一个带有整数的文件,对它们进行排序并将它们写入文件.是的...嗯,我的程序正在这样做,但它保留了原始内容.即: 让我们说4532 应该得到有序的内容32 45 好吧,我的程序保留了原始内容并添加了新内容:45 32 32 45. 那么对解决这个问题有什么建议吗?虽然删除原始文件
..
这是我使用 GAS 语法为 64 位英特尔程序集编写的代码示例.当代码运行时,期望打印出字符串:在 _print 子例程中. #这个例子是一个调用子程序的例子.global _start.section .text_开始:调用_print_出口:#退出通话mov $60, %rax异或 %rdi, %rdi系统调用_打印:#设置栈帧推 %rbp移动 %rsp, %rbp# 写入系统调用的参数设置
..
把它放在汽油里: .text.globl 主主要的:异或 %eax, %eaxlea str(%rip), %rdi调用 printf呼叫出口str: .byte 0x7F, "ELF", 1,1,1,0 我认为 .byte 指令可以像 nasm 一样连接 db 0x7F, "ELF", 1, 1, 1, 0 ;电子身份 来源:http://www.muppetlabs.com/~bre
..
我在 x86 机器上有这个绝对间接跳转指令: ff 24 25 30 10 60 00 产生于: jmp *bar 但是我在解码它的第二个和第三个字节时遇到了麻烦. 第二个应该是 Mod R/M 字段.所以它转化为: 00 100 100 含义: 00 - 没有位移的内存(但它有常量地址,这不是“位移"吗?) 100 (dec. 4) - 扩展
..
GNU 汇编器在汇编 Intel 语法代码时给出了意外的内存操作数. 我已将我的错误减少到一行单独的代码,并且在过去的三天里,我尝试了任何方法来理解为什么 GNU 汇编器会产生一些我无法理解的东西.我知道这必须(或应该)是微不足道的,但我不知所措. 以下文本驻留在文件 code.asm 中: .intel_syntax noprefix.global 一些代码一些代码:输入 3mov
..
我正在尝试组装一些 64 位代码,但组装失败了: addq $0xffffff7fc0005000, %rax 错误: `add' 的错误操作数类型不匹配 第一个操作数是一个 64 位值,后者是一个应该可以正确组装的寄存器.该指令前面是 .code64 伪操作.我正在组装 x86_64-elf-as test.s -o test.o --64 至于汇编器本身,当使用 --ver
..
我正在尝试将 xv6 引导代码从 At&t 语法转换为 Intel 语法,但我遇到了 ljmp 指令的问题.我正在尝试学习 Intel 计算机的启动过程,并且我对 Intel 汇编不是特别擅长. 最初的 AT&T 语法是 ljmp $0x8, $start32. 最小示例: .code16jmp 0x8:start32 # 不会组装.code32开始32:没有 使用 as -32
..
首先,我的本机系统是 amd64,Windows,使用 cygwin,以及 GNU 工具链和 binutils. 我正在编写一个 x86 引导加载程序,但无法让 ld 生成正确的相对地址.我已经准备了这个最小的可重复示例: main.s .code16.global _start.section .text_开始:打电话给其他人高 other.s .code16.global 其
..
我正在尝试将浮点值打印到控制台,但它给出了意外的结果,因为数字太大且符号不同. 计划 .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.出口:
..
我需要在汇编时以字节为单位计算函数的大小.我尝试了各种方法,包括: .set chk0_sz, offset chk0_e - offset chk0_s 然后使用mov rcx, offset chk0_sz来获取值. 但是,它给出了错误: 错误:在内存操作数中不能使用多个符号. 这里的chk0_e和chk0_s是两个标签,分别表示函数的结束和开始. 有什么想法吗?
..
.file “test-instr.c";.文本.Ltext0:.section .rodata.str1.1,“aMS",@progbits,1.LC0:.string “嗯?".LC1:.string “对我来说看起来像零!".LC2:.string "一个非零值?多么古怪!".section .text.startup,“ax",@progbits.p2align 4,,15.globl
..
我正在查看通过反汇编一些 C 程序生成的一些程序集,但我对我经常看到重复的单个优化感到困惑. 当我在 GCC 编译器上没有优化时使用 subl 指令进行减法,但是当我打开优化时(-O3 准确地说)编译器使用 leal 指令代替减法,示例如下: 没有优化: 83 e8 01 subl $0x1, %eax 有优化 8d 6f ff leal -0x1(%edi), %ebp 这两
..