【问题标题】:GCC x86 assembler function tablesGCC x86 汇编器函数表
【发布时间】:2015-09-04 13:58:59
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • x86 系统上的一个字是 16 位的(除非 GNU 汇编器决定打破这个约定)。您可能想改用.long
  • 就是这样,非常感谢迈克尔!我一直在使用 .word,因为我不是从头开始编写这个模拟器,而是在移植几年前编写的 ARM 汇编代码。使用 .long 使一切正常。将您的评论放在答案中,以便我可以给您积分。 :)

标签: gcc assembly x86


【解决方案1】:

GAS 手册中的The documentation for .word 说:

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

我还没有找到针对不同目标的.word 大小的权威来源。但是,在 x86 系统的上下文中,术语 word 表示 16 位(在英特尔的手册中,在 Fundamental Data Types 部分,他们说 “一个词是2 个字节(16 位)").

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 2018-10-13
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多