【发布时间】:2016-05-23 21:33:12
【问题描述】:
我正在尝试使用命令编译以下汇编代码:
nasm -f elf AvxScalarFloatingPointArithmetic_.asm
汇编代码:
.model flat,c
.const
AbsMask qword 7fffffffffffffffh, 7fffffffffffffffh
.code
; extern "C" void AvxSfpArithmetic_(double a, double b, double results[8]);
;
; Description: The following function demonstrates how to use basic
; scalar DPFP arithmetic instructions.
;
; Requires: AVX
AvxSfpArithmetic_ proc
push ebp
mov ebp,esp
; Load argument values
mov eax,[ebp+24] ;eax = ptr to results array
vmovsd xmm0,real8 ptr [ebp+8] ;xmm0 = a
vmovsd xmm1,real8 ptr [ebp+16] ;xmm1 = b
; Perform basic arithmetic using AVX scalar DPFP instructions
vaddsd xmm2,xmm0,xmm1 ;xmm2 = a + b
vsubsd xmm3,xmm0,xmm1 ;xmm3 = a - b
vmulsd xmm4,xmm0,xmm1 ;xmm4 = a * b
vdivsd xmm5,xmm0,xmm1 ;xmm5 = a / b
vmovsd real8 ptr [eax+0],xmm2 ;save a + b
vmovsd real8 ptr [eax+8],xmm3 ;save a - b
vmovsd real8 ptr [eax+16],xmm4 ;save a * b
vmovsd real8 ptr [eax+24],xmm5 ;save a / b
; Compute min(a, b), max(a, b), sqrt(a) and fabs(b)
vminsd xmm2,xmm0,xmm1 ;xmm2 = min(a, b)
vmaxsd xmm3,xmm0,xmm1 ;xmm3 = max(a, b)
vsqrtsd xmm4,xmm0,xmm0 ;xmm4 = sqrt(a)
vandpd xmm5,xmm1,xmmword ptr [AbsMask] ;xmm5 = fabs(b)
vmovsd real8 ptr [eax+32],xmm2 ;save min(a, b)
vmovsd real8 ptr [eax+40],xmm3 ;save max(a, b)
vmovsd real8 ptr [eax+48],xmm4 ;save sqrt(a)
vmovsd real8 ptr [eax+56],xmm5 ;save trunc(sqrt(a))
pop ebp
ret
AvxSfpArithmetic_ endp
end
很遗憾有一些错误:
AvxScalarFloatingPointArithmetic_.asm:1: error: attempt to define a local label before any non-local labels
AvxScalarFloatingPointArithmetic_.asm: error: parser: instruction expected
AvxScalarFloatingPointArithmetic_.asm:2: error: attempt to define a local label before any non-local labels
AvxScalarFloatingPointArithmetic_.asm:3: error: parser: instruction expected
AvxScalarFloatingPointArithmetic_.asm:13: error: parser: instruction expected
我应该如何编译这个文件? 代码应该是正确的。摘自《现代 X86 汇编语言编程:32 位、64 位、SSE 和 AVX》一书。
【问题讨论】:
-
这不是
nasm语法。看起来更像masm。使用它,否则您将需要调整语法。如果它来自一本书,我假设他们告诉你使用什么汇编程序。 -
来自亚马逊上这本书的简介:“这本书的主要读者是 Windows 软件开发人员,因为示例代码将使用 Visual C++ 和 Microsoft Macro Assembler 创建。”
-
有关将 MASM 源转换为 NASM 的提示,请参阅 this article。
标签: assembly nasm x86-64 intel avx