Assembly 从C到汇编程序的PTR错误和偏移量
我在C语言中有一个函数,如下所示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'},
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'