我想使用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
答案 0 :(得分:4)
%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"。尤里卡!