GCC x86汇编程序函数表

时间:2015-09-04 13:58:59

标签: gcc assembly x86

我正在用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指令的标签的引用,导致出错。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

GAS手册中的

The documentation for .word说:

  

发出的数字的大小及其字节顺序取决于程序集的目标计算机。

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

假设您没有编写模拟器以在16位实模式下运行,您可能希望函数表条目为32位。在定位x86系统时使用的适当伪操作是.long