相关疑难解决方法(0)

关于AT&T x86语法设计的问题

  1. 任何人都可以向我解释为什么AT&T语法中的每个常量前面都有一个"$"?
  2. 为什么所有寄存器都有'%'?
  3. 这只是让我做很多蹩脚打字的另一种尝试吗?
  4. 另外,我是唯一一个发现:16(%esp)真的违反直觉[esp+16]吗?
  5. 我知道它编译成同样的东西,但为什么有人想要输入很多'$'和'%'而不需要? - 为什么GNU选择此语法作为默认语法?
  6. 另一件事,为什么at&t语法中的每条指令前面都有一个:l? - 我知道它的操作数大小,但为什么不让汇编程序弄清楚呢?(我是否想要在不是那么大的操作数上做一个movl?)
  7. 最后一件事:为什么mov参数倒置了?

是不是合乎逻辑:

eax = 5
mov eax, 5
Run Code Online (Sandbox Code Playgroud)

at at&t是:

mov 5, eax
5 = a (? wait what ?)
Run Code Online (Sandbox Code Playgroud)

注意:我不是想乱跑.我只是不明白他们所做的设计选择,我试图了解他们为什么做了他们所做的.

x86 assembly att intel-syntax

18
推荐指数
3
解决办法
1894
查看次数

符号名称与新NASM版本中的新注册名称冲突?

想象一下你10年前写的这篇文章(在英特尔MPXbnd0.. bnd3注册表甚至在路线图上之前):

section .data

; define some globals which are part of an ABI so you can't just rename them
global bnd0      ; MPX bound register name conflict
bnd0: dd 123

global k0        ; AVX512 mask register name conflict
k0: dq 12345
Run Code Online (Sandbox Code Playgroud)

如何使用当前版本的NASM进行组装? 即NASM(或YASM)是否与支持新注册名称的新版本具有向前兼容性?

显然,在单个文件或项目中搜索/替换很容易解决.但理论上,您可以将全局变量名称作为库ABI的一部分,您可以从NASM导出或需要导入到NASM中extern ymm0.(必须声明外部符号,因此无法识别的寄存器名称永远不会汇编为符号引用.)

NASM语法已经不适合作为平台上C编译器输出的格式,这些平台不会为符号名称添加前缀_或执行其他类型的名称修改(例如Linux ELF).你无法编译全局int eax = 1;. 这就是AT&T语法%eax用于寄存器名称的原因.对该答案的评论中的讨论是启发这个问题的原因.请注意,GAS不需要声明外部符号; 无法识别的名称被视为符号(即使在.intel_syntax noprefix使用类似于MASM的语法的模式中).

相关:MASM如何处理新扩展的前向源兼容性?


你能以某种方式禁用MPX支持吗?

YASM支持一个CPU指令,允许您禁用对某些助记符的支持,但即使禁用AVX支持也不允许您将其ymm0用作符号名称.(YASM …

x86 assembly naming nasm forward-compatibility

9
推荐指数
1
解决办法
605
查看次数

x86-64 操作数的汇编顺序

x86-64汇编中操作数的顺序是什么?:指令目标,源或:指令源,目标

我有三本书和两种不同的方法!

assembly x86-64 att intel-syntax

3
推荐指数
1
解决办法
1207
查看次数

x86汇编助记符是否标准化?

x86标准是否包含助记符,还是仅定义操作码?

如果它不包含它们,那么不同的汇编程序是否有另一个标准?

x86 assembly standards

3
推荐指数
1
解决办法
257
查看次数

C++设置堆栈指针

在我的C++/C项目中,我想将堆栈指针设置为等于基指针 ...直观地,我会使用这样的东西:

asm volatile(
    "movl %%ebp %%esp"
);
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此操作时,我收到此错误消息:

Error: bad register name `%%ebp %%esp'
Run Code Online (Sandbox Code Playgroud)

我使用gcc/g ++版本4.9.1编译器.

我不知道我是否需要设置特定的g ++或gcc标志...应该有一种方法来操作espebp寄存器,但我只是不知道正确的方法来做到这一点.

有谁知道如何在c ++中操纵这两个寄存器?也许我应该使用hexed OP代码?

c++ x86 assembly

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