为什么NA​​SM会说"错误:逗号或行尾预期"?

时间:2014-05-05 20:22:38

标签: syntax-error nasm

我想使用NASM和C对两个向量进行标量乘法。我只在C中声明函数并且实现在汇编中。我对该程序很感兴趣,特别是在汇编文件中。我不知道我做错了什么。我有一些语法错误,但我不知道为什么它们在我的代码的27,28和37行。 这些是在编译的第一行nasm -felf32 pos.asm -o pos.o后显示的错误:

pos.asm:27: error: comma or end of line expected
pos.asm:28: error: expression syntax error 
pos.asm:37: error: expression syntax error 

汇编代码:

; nasm -felf32 pos.asm -o pos.o
; gcc -m32 -o zadanie1c.o -c zadanie1.c 
; gcc -m32 zadanie1c.o zadanie1a.o -o zadanie1

 %define n qword [ebp+8]
 %define zero qword [ebp+12]
 %define vect1 qword [ebp+20]
 %define vect2 qword [ebp+20+n*8]
 %define result qword [ebp+20+n*16]

 segment .data
 MinusFour dw -4

 segment .text
 global scalar
 scalar:

 push ebp
 mov ebp, esp
 push ebx                 ; 

fld zero ; for safety initialization
mov ecx,n

myLoop:

   fld vect1+ecx*8 ; v1
   fld vect2+ecx*8 ; v2
   fmulp st1 ; v1*v2
   faddp st1 ; v1*v2 + 
   cmp 0,ecx
   je end
   dec ecx
   jmp myLoop

end:
 mov ebx, result
 fstp qword [ebx]

 mov eax, ebx
 pop ebx
 mov esp, ebp
 pop ebp

 ret

1 个答案:

答案 0 :(得分:4)

NAS中的

%defines像C中的#defines一样工作 - 完全替换文本。所以

 %define vect1 qword [ebp+20]
 %define vect2 qword [ebp+20+n*8]
 ...

   fld vect1+ecx*8 ; v1
   fld vect2+ecx*8 ; v2

变为

   fld qword [ebp+20]+ecx*8 ; v1
   fld qword [ebp+20+n*8]+ecx*8 ; v2

这是编译器抱怨的无效语法。

即使我从未使用过NASM,我是如何找到这个的?我读了错误和行号。 “逗号或行尾预期”肯定听起来像语法错误。然后我看着它抱怨的那一行。什么可能弄乱语法?嗯,vect2不是汇编关键字,它是什么? %define ......他们是如何运作的? Google says... " The definitions work in a similar way to C"。尤里卡!