2016-04-10 63 views
0

我試圖將我的來源拆分爲更多有組織的文件,但我遇到了一些問題,包括這些來源。如何在FASM中包含其他來源

如何包含這些來源? 我的主要程序是PE64格式,但是當我設置我的子源的格式fasm不想編譯它。 當我刪除它時,fasm會說明有關結尾的內容(如kernel64.inc)和已有的符號。

這就是我想如何包含在主文件include printInt.asm。 我與出口:

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

這是副原:

;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' 

我沒有找到這樣的:FASM- passing parameters to an external procedure

但是,這並不爲我工作,也是一種不同的格式。

如何將自己的源代碼包含在PE64格式中?

回答

0

可以包括與包括指令的.ASM文件,例如:

include 'your_subroutines.asm' 

您的.asm文件的內容完全在你的include指令的位置包括在內。舉個例子,我會建議這樣的:

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

printInt: 
    ;your code here 
    ret 

include 'your_subroutines.asm' 

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

由於這個原因,你的子程序是代碼部分的一部分。此外,在main.asm的開頭只需要包含'win64a.inc'一次,而不是在每個subroutine.asm文件中。

相關問題