是否可以从汇编文件中引用C枚举?

时间:2016-12-18 20:19:45

标签: c enums nasm header-files

syscalls.h

enum Syscall {
  OPEN_FILE,
  READ_FILE,
  CLOSE_FILE
};

syscalls.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

1 个答案:

答案 0 :(得分:4)

没有没有。
你可以这样做:

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

syscalls.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查看已发出的代码。