标签: gnu-assembler

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

我有一些通常具有以下结构的NASM文件:

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret
Run Code Online (Sandbox Code Playgroud)

我正在组装它们:

nasm -f bin abc.asm
Run Code Online (Sandbox Code Playgroud)

我想用GAS写一些这些.两个问题:

  • 我应该在GAS中使用哪些指令?我找到了'.org'指令,但GAS似乎没有'.bits'指令.

  • 我应该传递什么gccas生成一个普通的二进制文件?即-f binNASM 的选项是什么.

assembly gnu-assembler nasm

21
推荐指数
2
解决办法
1万
查看次数

如何从Linux上的c源代码生成一个nasm可编译的汇编代码?

测试平台是32位Linux.

基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.

我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......

所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?

assembly gnu-assembler nasm tasm yasm

21
推荐指数
2
解决办法
1万
查看次数

在Mac OS X上组装项目时出错"没有这样的指令"

我使用自制软件来安装GCC 4.7.0,我的项目的make在汇编时失败了.我可以成功地从.c - > .s中获取代码,但是.s - > .o失败了.

要查看用于安装GCC的brew配方,请查看:https://github.com/Homebrew/homebrew-dupes/blob/master/gcc.rb.我还使用https://github.com/mxcl/homebrew/blob/master/Library/Formula/binutils.rb从上游安装了binutils .安装binutils似乎没有在/ usr/local/lib或类似的地方引入新的'as'.

如何找到这个缺失的指令错误?看起来编译器是正确的,但链接器根本不支持这些指令.说明似乎是矢量指令.

xavierlange $> make suricata.o
/usr/local/bin/gcc-4.7 -DHAVE_CONFIG_H -I. -I..  -I../libhtp  -I/opt/local/include  -v -Wextra -Wall -fno-strict-aliasing -fno-tree-pre -Wno-unused-parameter -std=gnu99 -DOS_DARWIN -march=native   -DLIBPCAP_VERSION_MAJOR=1 -DHAVE_PCAP_SET_BUFF -DUNITTESTS -DREVISION="61d5fe3" -MT suricata.o -MD -MP -MF .deps/suricata.Tpo -c -o suricata.o suricata.c
Using built-in specs.
COLLECT_GCC=/usr/local/bin/gcc-4.7
Target: x86_64-apple-darwin11.3.0
Configured with: ../configure --enable-languages=c,c++,fortran,java,objc,obj-c++ --prefix=/usr/local/Cellar/gcc/4.7.0/gcc --datarootdir=/usr/local/Cellar/gcc/4.7.0/share --bindir=/usr/local/Cellar/gcc/4.7.0/bin --program-suffix=-4.7 --with-gmp=/usr/local/Cellar/gmp/5.0.4 --with-mpfr=/usr/local/Cellar/mpfr/3.1.0 --with-mpc=/usr/local/Cellar/libmpc/0.9 --with-system-zlib --enable-stage1-checking --enable-plugin --enable-lto --disable-multilib --disable-nls
Thread model: posix
gcc version 4.7.0 …
Run Code Online (Sandbox Code Playgroud)

macos assembly gcc gnu-assembler osx-lion

20
推荐指数
2
解决办法
2万
查看次数

使用气体装配时推送的指令后缀无效

使用GNU汇编程序组装文件时出现以下错误:

hello.s:6:错误:"push"的指令后缀无效

这是我正在尝试汇编的文件:

        .text
LC0:
        .ascii "Hello, world!\12\0"
.globl _main
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        movl    %eax, -4(%ebp)
        movl    -4(%ebp), %eax
        call    __alloca
        call    ___main
        movl    $LC0, (%esp)
        call    _printf
        movl    $0, %eax
        leave
        ret
Run Code Online (Sandbox Code Playgroud)

这里有什么问题,我该如何解决?

虽然问题中的错误和说明不同,但问题与此问题有些相关.

linux assembly compiler-errors gnu-assembler

19
推荐指数
4
解决办法
3万
查看次数

MOV src dest(或)MOV dest src?

MOV可能是每个人在学习ASM时学习的第一条指令.

刚才我在GNU/Linux中遇到过一本关于IA32架构的汇编语言编程作者:Rajat Moona说:

alt text http://i.imagehost.org/0897/mov.gif

但我知道它是MOV dest, src.它像"装载destsrc".甚至维基也说同样的话.

我不是说作者错了.我知道他是对的.但我在这里错过了什么?

顺便说一句......他正在使用GCC as来组装这些指令.但这不应该改变指令语法吗?

x86 assembly masm gnu-assembler nasm

16
推荐指数
2
解决办法
1万
查看次数

x86_64汇编Linux系统调用混淆

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

.section .data

.section .text
.global _start
_start:
movq $60, %rax
movq $2, %rbx
int $0x80
Run Code Online (Sandbox Code Playgroud)

这只是调用Linux退出系统调用或它应该.相反,它会导致SEG FAULT,而当我改为执行此操作时

.section .data

.section .text
.global _start
_start:
movq $1, %rax
movq $2, %rbx
int $0x80
Run Code Online (Sandbox Code Playgroud)

有用.显然,问题是我转向%rax的价值.我在第二个例子中使用的$ 1值是"从头开始编程"所说的,但互联网上有多个来源说64位系统呼叫号码是60美元.参考 我做错了什么?还应该注意哪些其他问题以及我应该使用什么作为参考?万一你需要知道,我在第5章"从头开始编程".

64-bit assembly 32-bit gnu-assembler system-calls

16
推荐指数
4
解决办法
2万
查看次数

什么时候GAS ELF指令.type,.thumb,.size和.section需要?

我正在使用GNU作为基于ARM Cortex-M3的微控制器(Thumb 2指令集)的汇编程序.

在一些示例代码,我发现像指令.size,.section.type我的理解是ELF指令.举个例子:

    .section    .text.Reset_Handler
    .weak       Reset_Handler
    .type       Reset_Handler, %function  
Reset_Handler:
    bl      main
    b       Infinite_Loop    
    .size   Reset_Handler, .-Reset_Handler
Run Code Online (Sandbox Code Playgroud)



.type据说该指令设置符号的类型 - 通常是%对象(意思是数据?)或%函数.我不知道它有什么不同.它并不总是包含在内,所以我不确定何时需要使用它.

与此相关的还有.thumb_func指令.从我所看到的,它似乎可能相当于:

.thumb 
.type Symbol_Name, %function
Run Code Online (Sandbox Code Playgroud)

或者它是完全不同的东西?



.size据说设置与符号相关的大小.如果需要,我不知道.这是默认计算的,但可以使用此指令覆盖吗?如果是这样 - 你想什么时候覆盖?



.section比较容易找到的文档,我觉得我有什么清晰的概念,但我还是有点不确定的使用.我理解它的方式,它在不同的ELF部分(text代码,data可写数据,bss未初始化数据,rodata常量和其他)之间切换,并在需要时定义新的部分.我猜你会根据你是否定义代码,数据,未初始化的数据等来切换它们.但是为什么要为函数创建一个子部分,如上例所示?


对此有任何帮助表示赞赏.如果您能找到更详细地解释这一点的教程或文档的链接 - 最好是新手可以理解的 - 我将非常感激.

到目前为止,使用手册已经有了一些帮助 - 也许你可以通过更多的知识获得比我更多的东西.

assembly arm gnu gnu-assembler elf

15
推荐指数
3
解决办法
8638
查看次数

x86汇编程序:浮点比较

作为编译器项目的一部分,我必须为x86编写GNU汇编代码来比较浮点值.我试图找到有关如何在线进行此操作的资源,据我所知,它的工作原理如下:

假设我要比较的值是浮点堆栈上的唯一值,那么fcomi指令将比较这些值并设置CPU标志,以便je可以使用...指令.

我问,因为这只会有效.例如:

.section    .data
msg:    .ascii "Hallo\n\0"
f1:     .float 10.0
f2:     .float 9.0

.globl main
    .type   main, @function
main:
    flds f1
    flds f2
    fcomi
    jg leb
    pushl $msg
    call printf
    addl $4, %esp
leb:
    pushl $0
    call exit
Run Code Online (Sandbox Code Playgroud)

即使我认为应该打印"Hallo"也不会打印,如果你切换f1和f2,它仍然不会是一个逻辑上的矛盾.jne并且jl但是似乎做工精细.

我究竟做错了什么?

PS:fcomip只弹出一个值还是同时弹出?

floating-point x86 assembly compare gnu-assembler

15
推荐指数
1
解决办法
1万
查看次数

是否有一个符号代表GNU GAS汇编中的当前地址?

我很想知道是否有任何特殊的GAS语法来实现相同的功能,如在NASM示例中:

SECTION .data       

    msg:    db "Hello World",10,0  ; the 0-terminated string.
    len:    equ $-msg              ; "$" means current address.
Run Code Online (Sandbox Code Playgroud)

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

assembly gnu gnu-assembler memory-address

15
推荐指数
3
解决办法
5974
查看次数

gnu程序集中.byte汇编程序指令的用途是什么?

在浏览一些具有内联汇编的C代码时,我遇到了.byte(开头有一个Dot)指令.

在检查Web上的程序集引用时,我发现它用于在内存中保留一个字节.

但是在代码中,声明之前没有标签.所以我想知道什么是未标记的.byte指令或任何其他数据存储指令的用途.

例如,如果我编码.byte 0x0a,我该如何使用它?

assembly gnu-assembler inline-assembly

14
推荐指数
2
解决办法
2万
查看次数