2016-05-23 1 views
1

でのx86をコンパイルしようとすると、私はコマンドで、次のアセンブリコードをコンパイルしようとしています:AVXアセンブリファイル

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」の本からです。

+2

これは 'nasm'構文ではありません。 'masm'のように見えます。これを使用するか、構文を調整する必要があります。本からのものであれば、使用するアセンブラを教えてくれると思います。 – Jester

+0

Amazonでの本の紹介:*「本書の主な読者は、Visual C++とMicrosoft Macro Assemblerを使用してサンプルコードが作成されるため、Windowsソフトウェア開発者です」* –

+0

[こちらの記事を参照](http:// left404。 MASMソースをNASMに変換するためのヒントについては、masm-2011/01/04/converting-x86-assembly-from-masm-to-nasm-3 /)を参照してください。 –

答えて

3

NASM構文ではなく、MASM構文のようです。 NASMへの移植は、NASM構文を知っていれば簡単ですが、SO答えの範囲を超えて教えてください。 the manualタグwikiを参照してください。

JWasmは移植可能なMASM構文アセンブラですが、ABIの違いに注意してください。これにより、NASM構文への移植の手間を省くことができますが、Windows API /ライブラリ呼び出しをLinuxシステム呼び出し/ライブラリ呼び出しに移植することはできません。

CからすべてのI/Oおよびその他のシステムコールを行い、asm関数でデータ処理を行うと、あなたはうまくいくでしょう(WindowsとSystemV ABI間の呼び出し規約の違いを除く)。

ただし、Windows API /ライブラリ関数を直接使用するasm関数を使用すると、より複雑になります。これらのAPIは、Linuxには存在しません(printfのようなC99標準ライブラリ関数について話している場合を除く)。

stracegdbは直接使用できるため、理論上はwineの下にWindowsコードを実行できますが、通常のLinux実行可能ファイルをデバッグするのは簡単です。この場合


、あなたが何かを行うことができます:

default rel 

section .rodata 
AbsMask dq 7fffffffffffffffh, 7fffffffffffffffh 

section .text 
; extern "C" void AvxSfpArithmetic_(double a, double b, double results[8]); 
global AvxSfpArithmetic 
AvxSfpArithmetic: 
     push ebp 
     mov ebp,esp  ; you don't need to waste instructions on this stack frame crap, as you will soon learn. 

; Load argument values 
     ;mov eax,[esp+20]     ;eax = ptr to results array 
     vmovsd xmm0, [ebp+8]  ;xmm0 = a 
     vmovsd xmm1, [ebp+16]  ;xmm1 = b 
     ... 

を命令はオペランド・サイズだけで罰金を意味するので、私はちょうどreal8 ptrを削除しました。 qword [ebp+8]が動作します。

あなただけ(ループの前に)レジスタにそのAND-マスクをロードしようとして代わりのメモリから直接それを使用していた場合は、代わりにpcmpeqw xmm7,xmm7/psrlq xmm7, 1generating it on the flyを検討すべきです。 64ビットコードで


、(Linuxで使用)SystemVのABIは、Windowsとは異なり、ので、あなたの本の中で64ビットの例では、呼び出し規約のWindowsを使用している場合、あなたはそれに対処する必要があります。 Cプロトタイプで__attribute__((ms_abi))を使用できます。

32ビットSysV ABIは基本的にWindow'sと互換性のある呼び出しを使用し、スタック上のすべての引数を使用します。 IDKがまったく異なる場合、たとえば構造体の戻り値。

+1

** ** MASM(互換)構文を理解しているLinuxのアセンブラです。 [JWasm](https://github.com/JWasm/JWasm)を使用してみてください。 – zx485

関連する問題