Assembly 如何在FASM中包含其他来源

Assembly 如何在FASM中包含其他来源,assembly,include,portable-executable,fasm,Assembly,Include,Portable Executable,Fasm,我试图将我的源文件拆分成更有组织的文件,但我遇到了一些问题,包括这些源文件 如何包含这些来源? 我的主程序是PE64格式的,但当我设置子源的格式时,fasm不想编译它。 当我删除它时,fasm会说一些关于结束includes(比如kernel64.inc)和已经存在的符号的内容 这就是我试图在主文件中包含的方式include printInt.asm。 我正在使用以下工具进行导出: export 'printLib.dll',\ printInt, 'printInt' 这是子来源:

我试图将我的源文件拆分成更有组织的文件,但我遇到了一些问题,包括这些源文件

如何包含这些来源? 我的主程序是PE64格式的,但当我设置子源的格式时,fasm不想编译它。 当我删除它时,fasm会说一些关于结束includes(比如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'
我所发现的是:

但这对我来说不起作用,而且是关于一种不同的格式


如何以PE64格式包含我自己的源文件?

您可以使用include指令包含.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文件中