【问题标题】:How to include other sources in FASM如何在 FASM 中包含其他来源
【发布时间】:2016-07-31 14:40:47
【问题描述】:

我正在尝试将我的来源拆分为更有条理的文件,但我遇到了一些问题,包括这些来源。

如何包含这些来源? 我的主程序是 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 格式包含我自己的源代码?

【问题讨论】:

    标签: assembly include portable-executable fasm


    【解决方案1】:

    您可以使用 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
    ;...
    

    因此,您的子例程是代码部分的一部分。此外,include 'win64a.inc' 只需要在 main.asm 的开头一次,而不是在每个 subroutine.asm 文件中。

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 2011-09-21
      • 2021-01-27
      • 1970-01-01
      • 2013-05-11
      • 2018-05-22
      • 2015-07-28
      • 2016-11-29
      相关资源
      最近更新 更多