2015-09-04 138 views
0

我正在用x86汇编语言编写一个6502模拟器。所述仿真机的心脏是代码指针为每个操作码6502 256条目表:GCC x86汇编程序函数表

fns_asm: 
.word opasm_brk   // 0x00 BRK 
.word opasm_ora_indzx // 0x01 ORA (,x) 
.word opasm_undef 
.word opasm_slo_indzx // 0x03: SLO (,x) 
.word opasm_nop_zp  // 0x04: NOP zp 
... 

opasm_brk: 
< implementation of BRK instruction > 

opasm_ora_indzx 
< implmentation of ORA instruction > 

... etc ... 

的问题是,已编译的共享库(。所以)没有在运行时加载。报道在x86 Android的错误是:

的dlopen( “/ data/app中/ com.myapk/LIB/86/lib6502.so”,RTLD_LAZY)失败: dlopen的失败:无法找到符号 “” 通过引用“lib6502.so”

注意空符号名称,非常无益!

我已经发现,我的函数表是责备......如果我改变fns_asm为零入口表,或有一个常数,而不是一个标签(即“.word 0 “)然后.so加载正常。这是使用.word指令引用标签引起事情出错的原因。

我在做什么错?

+1

x86系统上的一个词是16位(除非GNU汇编器已决定违反该约定)。你可能想用'.long'来代替。 – Michael

+0

就是这样,非常感谢迈克尔!我一直在使用.word,因为我不是从头开始编写这个模拟器,而是移植多年前写的ARM汇编代码。使用.long使一切正常工作。把你的评论放在答案中,这样我就可以给你答案。 :) –

回答

2

在GAS手册The documentation for .word说:

发射的数目,并且其字节顺序的大小,取决于该组件是什么目标计算机。

我还没有找到针对不同目标的.word大小的权威来源。然而,在x86系统的上下文中术语意味着16位(在英特尔的手册中,在的基本数据类型,他们说“一个字是2字节(16位)”)。

假设你没有编写一个模拟器以16位实模式运行,你可能希望你的函数表条目是32位。针对x86系统的适当的伪操作是.long