热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《符号名称与新NASM版本中的新注册名称冲突?》经验,为你挑选了1个好方法。

想象一下你10年前写的这篇文章(在英特尔MPX和bnd0.. 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

如何使用当前版本的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 1.3.0不支持AVX512或MPX,因此它可以汇编使用这些寄存器名称作为符号的代码,但它确实支持AVX2.)

CPU Conroe
extern ymm0

我得到yasm-CPU.asm:2: error: directive 'extern' requires an identifier parameter.或者ymm0: dd 123,错误是yasm-CPU.asm:2: error: label or instruction expected at start of line

但AVX支持肯定是禁用的:汇编CPU Conroe/ vmovaps xmm0, [edi]给出:

$ yasm -Worphan-labels -felf32 yasm-CPU.asm
yasm-CPU.asm:2: warning: `vmovaps' is an instruction in CPU
yasm-CPU.asm:2: error: instruction expected after label    

(它说CPU 686或老年残疾扩展相似.IDK为什么不说in CPU Sandybridge AVX,似乎YASM不再是良好的维护.YASM 1.3.0支持CPU HaswellAVX2,但该文档没有提到它.)

此功能的目的是阻止您在SSSE3或更低CPU的功能中意外使用SSE4指令,但显然它无法解决此问题.


NASM的CPU指令看起来很相似,也没有任何帮助:

CPU 686
vmovaps xmm0, [edi]
extern ymm0         
    mov eax, ymm0

$ nasm -Worphan-labels -felf32 CPU.asm 
CPU.asm:2: error: no instruction for this cpu level
CPU.asm:4: error: invalid combination of opcode and operands

请注意,无论是否extern ymm0CPU指令,它都可以正常组装,但只要将其用作操作数,就会出现问题.



1> Ross Ridge..:

NASM允许您在符号$前面加上美元符号,以便将其解释为符号而不是寄存器或其他保留字.来自NASM文档:

3.1 NASM源线的布局

[...]标识符也可以以a $为前缀,表示它打算作为标识符而不是保留字来读取; 因此,如果您链​​接的某个其他模块定义了一个名为的符号eax,您可以参考$eaxNASM代码来区分符号和寄存器.[...]

MASM通常仅在C编译器使用下划线_作为前缀标识符的环境中使用,因此这不是该汇编程序的大问题.然而它确实解决了这个问题,但它基本上与NASM相反.您可以使用OPTION NOKEYWORD指令禁用您选择的保留字.例如,您可以使用,OPTION NOKEYWORD:以便您可以使用名为的符号eax.当然,这会阻止您使用名为EAX的寄存器,因此它不像NASM那样通用.


推荐阅读
author-avatar
婷婷Yo-jiang_373
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有