Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly PowerPC汇编程序无法识别带有@h注释的未定义变量_Assembly_Powerpc_Undefined Variable - Fatal编程技术网

Assembly PowerPC汇编程序无法识别带有@h注释的未定义变量

Assembly PowerPC汇编程序无法识别带有@h注释的未定义变量,assembly,powerpc,undefined-variable,Assembly,Powerpc,Undefined Variable,如果我组装以下PowerPC asm.as: li r0, hello nop li r0, hello@h nop 。。。我收到一条适当的错误消息: > powerpc-eabi-as -mregnames -mgekko ../asm.as -o asm.ob ../asm.as: Assembler messages: ../asm.as:2: Error: unsupported relocation against hello 这是因为hello未定义。错误是期望的行为。

如果我组装以下
PowerPC

asm.as

li r0, hello
nop
li r0, hello@h
nop
。。。我收到一条适当的错误消息:

> powerpc-eabi-as -mregnames -mgekko ../asm.as -o asm.ob 
../asm.as: Assembler messages:
../asm.as:2: Error: unsupported relocation against hello
这是因为
hello
未定义。错误是期望的行为。但是,如果我使用
@h
(更高的16位)注释,它将静默汇编并假定
hello
具有值
0

asm.as

li r0, hello
nop
li r0, hello@h
nop
使用的命令:

$ powerpc-eabi-as -mregnames -mgekko ../asm.as -o asm.ob 

$ powerpc-eabi-objcopy -O "binary" asm.ob asm 

$ rm asm.ob 

$ xxd -p asm 
3800000060000000

hello
仍然未定义时,为什么汇编程序现在接受了这个新代码?有没有办法再次启用错误消息?我想立即查明是否使用了这样一个未定义的变量。

第一个变量没有失败,因为
hello
未定义。它之所以失败,是因为没有
@h
您试图使用
hello
的完整地址作为立即数,而且它太大了。此外,您也无法从
对象复制中获得完整的信息。您应该在对象文件上运行
objdump-dr
,以查看重新定位。将有一个用于
hello
,类型与
@h
匹配,与
li
指令中立即数的位置对齐。据我所知,汇编总是允许您引用外部符号而不声明它。它成为对象文件中的重定位,链接器应用重定位来计算最终在可执行文件中结束的值。因此,在您尝试链接之前,诊断不会出错,并且无法包含定义
hello
@WumpusQ.Wumbley的库或对象文件:这非常有用且正确。那么,您将如何尝试链接以检测未定义的变量呢?我猜代码也必须标记一个入口点,这样才能工作,但这不应该是必需的task@BullyWiiPlaza使用
nm-u
查找未定义的符号。第一个符号没有失败,因为
hello
未定义。它之所以失败,是因为没有
@h
您试图使用
hello
的完整地址作为立即数,而且它太大了。此外,您也无法从
对象复制中获得完整的信息。您应该在对象文件上运行
objdump-dr
,以查看重新定位。将有一个用于
hello
,类型与
@h
匹配,与
li
指令中立即数的位置对齐。据我所知,汇编总是允许您引用外部符号而不声明它。它成为对象文件中的重定位,链接器应用重定位来计算最终在可执行文件中结束的值。因此,在您尝试链接之前,诊断不会出错,并且无法包含定义
hello
@WumpusQ.Wumbley的库或对象文件:这非常有用且正确。那么,您将如何尝试链接以检测未定义的变量呢?我猜代码也必须标记一个入口点,这样才能工作,但这不应该是必需的task@BullyWiiPlaza使用
nm-u
查找未定义的符号。