我有一些通常具有以下结构的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'指令.
我应该传递什么gcc或as生成一个普通的二进制文件?即-f binNASM 的选项是什么.
测试平台是32位Linux.
基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.
我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......
所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?
我使用自制软件来安装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) 使用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)
这里有什么问题,我该如何解决?
MOV可能是每个人在学习ASM时学习的第一条指令.
刚才我在GNU/Linux中遇到过一本关于IA32架构的汇编语言编程作者:Rajat Moona说:
alt text http://i.imagehost.org/0897/mov.gif
但我知道它是MOV dest, src.它像"装载dest有src".甚至维基也说同样的话.
我不是说作者错了.我知道他是对的.但我在这里错过了什么?
顺便说一句......他正在使用GCC as来组装这些指令.但这不应该改变指令语法吗?
我目前正在学习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章"从头开始编程".
我正在使用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常量和其他)之间切换,并在需要时定义新的部分.我猜你会根据你是否定义代码,数据,未初始化的数据等来切换它们.但是为什么要为函数创建一个子部分,如上例所示?
到目前为止,使用手册已经有了一些帮助 - 也许你可以通过更多的知识获得比我更多的东西.
作为编译器项目的一部分,我必须为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只弹出一个值还是同时弹出?
我很想知道是否有任何特殊的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)
特别是我对$代表当前地址的符号感兴趣.
在浏览一些具有内联汇编的C代码时,我遇到了.byte(开头有一个Dot)指令.
在检查Web上的程序集引用时,我发现它用于在内存中保留一个字节.
但是在代码中,声明之前没有标签.所以我想知道什么是未标记的.byte指令或任何其他数据存储指令的用途.
例如,如果我编码.byte 0x0a,我该如何使用它?