我正在用x86汇编语言编写6502模拟器。仿真机器的核心是每个6502操作码的256条代码指针表:
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 ...
问题是编译的共享库(.so)无法在运行时加载。在x86 Android上报告的错误是:
dlopen(“/ data / app / com.myapk / lib / x86 / lib6502.so”,RTLD_LAZY)失败: dlopen失败:无法找到“lib6502.so”引用的符号“”
注意空符号名称,非常无用!
我已经知道我的函数表是责备...如果我将fns_asm更改为零条目表,或者只有一个带有常量而不是标签的条目(即“.word 0”) )然后.so加载很好。这是带有.word指令的标签的引用,导致出错。
我做错了什么?
答案 0 :(得分:2)
发出的数字的大小及其字节顺序取决于程序集的目标计算机。
我没有找到针对不同目标的.word
大小的权威来源。但是,在x86系统的上下文中,术语 word 意味着16位(在英特尔的手册中,在基本数据类型部分中,他们说“一个字是2个字节(16位)“)。
假设您没有编写模拟器以在16位实模式下运行,您可能希望函数表条目为32位。在定位x86系统时使用的适当伪操作是.long
。