2016-04-10 10 views
0

ソースをより組織化されたファイルに分割しようとしていますが、これらのソースを含むいくつかの問題が発生しています。FASMに他のソースを含める方法

どのようにこれらのソースを含めることができますか? 私のメインプログラムはPE64形式ですが、サブソースの形式を設定すると、fasmはコンパイルしたくありません。 これを削除すると、fasmはincludes(kernel64.incなど)と既に存在するシンボルを終了することについて何かを指示します。

これは私がメインファイルinclude printInt.asmに含めることを試みている方法です。 私は輸出しています:FASM- passing parameters to an external procedure

しかし、これも私のために働く、としません:私はこのことについて見つけた何

;format PE64 

include 'win64a.inc' 

;entry start 

section '.code' code readable executable 
start: 
    mov rcx, 1234567 
    call printInt 
    call newline 
    mov rcx, -54321 
    call printInt 

; invoke ExitProcess, 0 

printInt: 
    push r10 
    push r11 
    push r12 
    push r13 
    push r14 
    sub rsp, 32 

    mov r12, rcx 
    mov r13, 10 
    xor r14, r14 

    test r12, r12 
    jns .e1 
     neg r12 
     mov rcx, 45 
     call [putchar]  
    .e1: 

    .l1: 
     mov rax, r12 
     mov rdx, 0 
     div r13 

     mov rcx, rdx 
     add rcx, 0x30 
     mov r12, rax 
     push rcx 
     inc r14 
     test r12, r12 
     jnz .l1 

    mov r12, r14  
    .l2: 
     pop rcx 
     sub rsp, 32 
     call [putchar] 
     add rsp, 32 
     dec r14 
     jnz .l2 

    add rsp, 32 
    pop r14 
    pop r13 
    pop r12 
    pop r11 
    pop r10 
ret 

newline: 
    sub rsp, 32 
    mov rcx, 0xa 
    call [putchar] 
    mov rcx, 0xd 
    call [putchar] 
    add rsp, 32 
ret 

rdtsc64x: 
    rdtsc 
    shl rdx, 32 
    add rax, rdx 
    mov rdx, 0 
ret 

;section '.rdata' data readable writeable 
; print1 db 'printInt downwards: ', 0 
; print2 db 'printInt upwards: ', 0 

section '.idata' import data readable writeable 

library kernel, 'kernel32.dll',\ 
    msvcrt, 'msvcrt.dll' 

;import kernel, ExitProcess, 'ExitProcess' 
import msvcrt, printf, 'printf',\ 
    putchar, 'putchar' 

は次のとおりです。

export 'printLib.dll',\ 
    printInt, 'printInt' 

これはサブソースです別の形式です。

自分のソースをPE64形式で含めるにはどうすればよいですか?

答えて

0

あなたは例えば、includeディレクティブを使用して.ASMファイルを含めることができます。:

include 'your_subroutines.asm' 

あなたの.ASMファイルの内容があなたのディレクティブを含めるの位置に正確に含まれています。あなたの例では、私はこのような何かrecommandう:このため

section '.code' code readable executable 
start: 
    ;your code here 

printInt: 
    ;your code here 
    ret 

include 'your_subroutines.asm' 

section '.rdata' data readable writeable 
;... 

を、あなたのサブルーチンは、コードセクションの一部です。さらに、 'win64a.inc'をインクルードするには、main.asmの最初に一度だけ必要であり、各subroutine.asmファイルでは必要ありません。