Assembly 从C到汇编程序的PTR错误和偏移量

Assembly 从C到汇编程序的PTR错误和偏移量,assembly,x86,x86-64,yasm,Assembly,X86,X86 64,Yasm,我在C语言中有一个函数,如下所示 int rowScreen; int colScreen; char charac; char tiles[DimMatrix][DimMatrix] = { {'1','2','4'}, {'6','8','A'},

我在C语言中有一个函数,如下所示

 int  rowScreen;  
 int  colScreen;  
 char charac;      
 char tiles[DimMatrix][DimMatrix] = { {'1','2','4'},
                                    {'6','8','A'},                                     
                                    {'C','E',' '} };
void updateBoardP1_C(){
int i, j;
rowScreen = 12;
for (i=0;i<DimMatrix;i++){
  colScreen = 8;
  for (j=0;j<DimMatrix;j++){
     gotoxyP1_C();
     charac = tiles[i][j];
     printchP1_C();
     colScreen = colScreen + 4;
  }
  rowScreen = rowScreen + 2;
 }
 rowScreen = 8;
 colScreen = 20;
 gotoxyP1_C(0);
 charac = moves;
 charac = charac + '0';
 printchP1_C();
}
如果希望在64位linux中使用yasm执行此汇编代码,请执行以下操作:

yasm -f elf64 -g dwartf2 P1TOC.asm 
抛出以下错误,我不知道如何修复它们

undefined symbol 'PTR'
undefined symbol 'OFFSET'
有没有一种方法可以在不使用PTR和偏移量的情况下生成汇编代码?
我做错了什么?

编译器的英特尔语法汇编输出与NASM/YASM的英特尔语法不完全兼容。在生成此输出时是否使用GCC/CLANG编译器的
-masm=intel
选项?YASM的一个特点是将32位寄存器扩展到64位寄存器的符号的
movsx
指令是
MOVSXD
,而不是
movsx
。NASM对
MOVSX
没有问题,因为它足够聪明,可以查看操作数来确定本例中的大小。YASM在这方面表现得很愚蠢。更改为
movsxd rcx,eax
movsxd rdx,eax
为什么必须使用YASM?为什么不直接使用GNU汇编程序来汇编代码呢?如果您打算使用C编译器输出作为手写asm的起点,至少告诉它优化一些,比如
-O1
-O2
。所有那些用64位指针对
int
索引重新进行符号扩展的操作都是痛苦的,而且完全没有必要,因为它们永远不会是负数。(和
i
j
可以一直保存在寄存器中,或者优化为指针增量)。运行
gcc-O2-cfoo.c
生成优化的foo.o。或
-O2-S foo.c
生成优化的
foo.S
,如果您决定遵循Nate的建议并使用气体而不是NASM/YASM。如果您不知道基本的GCC选项是如何工作的,请在GCC手册中查找它们。此外,您不想删除RIP相对寻址,只需在生成的asm语法中为RIP相对寻址模式使用正确的语法即可。上显示的方法处理该问题以及其他问题。编译器的英特尔语法汇编输出与NASM/YASM的英特尔语法不完全兼容。在生成此输出时是否使用GCC/CLANG编译器的
-masm=intel
选项?YASM的一个特点是将32位寄存器扩展到64位寄存器的符号的
movsx
指令是
MOVSXD
,而不是
movsx
。NASM对
MOVSX
没有问题,因为它足够聪明,可以查看操作数来确定本例中的大小。YASM在这方面表现得很愚蠢。更改为
movsxd rcx,eax
movsxd rdx,eax
为什么必须使用YASM?为什么不直接使用GNU汇编程序来汇编代码呢?如果您打算使用C编译器输出作为手写asm的起点,至少告诉它优化一些,比如
-O1
-O2
。所有那些用64位指针对
int
索引重新进行符号扩展的操作都是痛苦的,而且完全没有必要,因为它们永远不会是负数。(和
i
j
可以一直保存在寄存器中,或者优化为指针增量)。运行
gcc-O2-cfoo.c
生成优化的foo.o。或
-O2-S foo.c
生成优化的
foo.S
,如果您决定遵循Nate的建议并使用气体而不是NASM/YASM。如果您不知道基本的GCC选项是如何工作的,请在GCC手册中查找它们。此外,您不想删除RIP相对寻址,只需在生成的asm语法中为RIP相对寻址模式使用正确的语法即可。上显示的方法将处理该问题以及其他所有问题。
undefined symbol 'PTR'
undefined symbol 'OFFSET'