2017-02-14 187 views
0

我试图掩盖ASM与gcc为十六进制(GCC -c -masm =英特尔code.s)通过将其错误:code.s:1:错误:`MOV”太多存储器的引用。 code.s asm:JS指令 - 十六进制代码

mov rax , 0x00000000004007E6 
js rax 

发生了什么事?你能教我盖吗?

+2

您在使用英特尔的语法? NASM可能更适合这一任务,因为它支持英特尔语法并可以生成原始二进制文件。 * -masm = intel *是一个输出选项AFAIK。 –

+2

'js rax'看起来像使用'rax'作为标签,但它当然也是一个注册表。如果它*被用作标签,那么'mov'就有两个内存引用。 –

+0

是的,我使用英特尔代码。 –

回答

2

正如玛格丽特·布鲁姆说,-masm=intel只是一个代码生成选项,这意味着它会影响什么样的程序集的编译器从C代码生成。它完全不影响组装。

您需要在程序集文件中添加.intel_syntax noprefix指令来切换语法,或使用复杂的gcc -Wa,--msyntax=intel,-mnaked-reg方法将参数传递给汇编程序。

完成上述操作后,下一个问题将是js rax无效,因为x86中没有条件间接跳转。最简单的可能是使用反转条件jns跳过jmp rax