【问题标题】:Is it possible to reference C enums from an assembly file?是否可以从程序集文件中引用 C 枚举?
【发布时间】:2017-05-03 21:46:14
【问题描述】:

系统调用.h

enum Syscall {
  OPEN_FILE,
  READ_FILE,
  CLOSE_FILE
};

系统调用.s

extern WRITE_TO_SCREEN
global write_to_screen
write_to_screen:
  mov eax, WRITE_TO_SCREEN
  mov ebx, [esp+4]
  int 0x80
  ret

给我这个错误:

stdlib/syscalls.o: In function `write_to_screen':
stdlib/syscalls.s:(.text+0x1): undefined reference to `WRITE_TO_SCREEN'
make: *** [kernel.elf] Error 1

【问题讨论】:

    标签: c enums nasm header-files


    【解决方案1】:

    不,没有。
    您可以执行以下操作:

    enum_support.h

    #ifdef __ASSEMBLER__
    #define ENUM_START
    #define ENUM_VALUE(key,value) .equ key,value
    #define ENUM_END(typename)
    #else
    #define ENUM_START typedef enum{
    #define ENUM_VALUE(key,value) key=value,
    #define ENUM_END(typename)} typename;
    #endif
    

    系统调用.h

    #include "enum_support.h"
    
    ENUM_START
    ENUM_VALUE(OPEN_FILE,0)
    ENUM_VALUE(READ_FILE,1)
    ENUM_VALUE(CLOSE_FILE,2)
    ENUM_END(Syscall)
    

    然后让test.ctest.s 包含syscalls.h

    gcc -c test.c
    gcc -c test.s

    不确定它是否很有帮助,但我不知道任何其他方式来共享枚举(在程序集中不存在)。
    您可以使用cpp test.ccpp -D__ASSEMBLER__ test.s 来查看发出的代码。

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多