Как включить другие источники в 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-передача параметров внешней процедуре

Но это не работает для меня, а также о другом формате.

Как включить собственные исходники в формате PE64?


person S.Klumpers    schedule 10.04.2016    source источник


Ответы (1)


Вы можете включить свои файлы .asm с помощью директивы include, например:

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

Благодаря этому ваши подпрограммы являются частью раздела кода. Кроме того, включать 'win64a.inc' необходимо только один раз в начале файла main.asm, а не в каждом из файлов subroutine.asm.

person Christian Ammann    schedule 01.07.2016