如何在汇编器中创建名称奇怪的符号?

Dem*_*emi 2 assembly masm gnu-assembler nasm

我希望能够在汇编程序文件中定义一个不包含 NUL 字符的任何名称的符号。我如何让 GNU 汇编器创建这样的符号?NASM 怎么样?玛斯姆?

编辑:我使用以下 Python 脚本进行测试(需要 Python 3.5.1+):

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import tempfile
import os.path
import subprocess
import ctypes

def main(symbolname, quoter):
    join = os.path.join
    with tempfile.TemporaryDirectory() as d:
        as_file_name = join(d, 'test.s')
        with open(as_file_name, 'w') as file_object:
            assembler = '''\
\t.globl "{0}"
"{0}":
\tmov $0x0, %rdi # exit status
\tmov $231, %rax # __NR_exit_group
\tsyscall
'''.format(quoter(symbolname))
            file_object.write(assembler)
        objectname, sharedlib = join(d, 'test.o'), join(d, 'test.so')
        subprocess.check_call(['as', '-o', objectname, as_file_name])
        subprocess.check_call(['ld', objectname, '-shared', '-o', sharedlib])
        mydll = ctypes.pydll.LoadLibrary(sharedlib)
        mydll[symbolname]
if __name__ == '__main__':
    main('a', lambda x: x)
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚我可以输入什么而不是传递给的身份函数main,以便代码可以工作我输入的任何字符串而不是'a'

Pet*_*des 5

在 GAS 中为我​​工作:(.comm "my weirdsym .$ 12 foo^M bar" 2其中 ^M 是字面回车符,并使 的输出objdump -t看起来很有趣)。

使用语法创建此类符号label:可能并不总是可行。GAS 手册在语句语法的描述中没有提到引用的标签名称,它对我不起作用: test.S:52: Error: junk at end of line, first unrecognized character is '"'对于"foobar":.

如果您确实想要这个,您可能可以使用.set来获取需要符号名称的上下文,因此您可以使用引号。然后你可以给一个符号任何你想要的值,包括另一个符号的值(例如一个合理命名的标签)。

例如(感谢@FUZxxl):

# symbol includes a literal doublequote, and a literal newline
# symbol value(address) is . which means current position 
.set "\"my weirdsym .$ 12 foo^M bar", .
    nop                                                                                                                                                          
Run Code Online (Sandbox Code Playgroud)

objdump -drwC -Mintel输出:

 bar>:00000000a7 <"my weirdsym .$ 12 foo
  a7:   90                      nop
Run Code Online (Sandbox Code Playgroud)

我强烈建议对代码中的符号名称进行一些健全性检查,因为创建具有不可打印字符的符号名称可能不是很有帮助(对于任何调试目标文件的人)。

将事物编码为对 C 函数/变量名称合法的字符的自定义名称修饰方案也可以工作。

但如果你真的想这样做,这就是方法(使用 GAS)。对于 NASM 来说这可能是不可能的。