gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:12:51 24 4
gpt4 key购买 nike

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

编辑:我使用以下 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)

我正在尝试找出可以放置什么来代替传递给 main 的身份函数,以便代码可以工作我放置的任何字符串而不是 'a' >

最佳答案

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

使用 label: 创建此类符号语法可能并不总是可行。 GAS 手册在 the statement syntax 的描述中没有提及引用的标签名称。 ,这对我不起作用: 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

objdump -drwC -Mintel输出:

 bar>:00000000a7 <"my weirdsym .$ 12 foo
a7: 90 nop

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

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

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

关于assembly - 如何在汇编器中创建名称奇怪的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40352929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com