FASM

2016-04-10 46 views
0

içinde diğer kaynakları nasıl ekliyorum Kaynaklarımı daha organize dosyalara ayırmaya çalışıyorum, ancak bu kaynaklar dahil olmak üzere bazı sorunlarla karşılaşıyorum.FASM

Bu kaynakları nasıl eklerim? Ana programım PE64 biçimindedir, ancak alt kaynaklarımın biçimini ayarladığımda fasm onu ​​derlemek istemez. Bunu kaldırdığımda fasm, bitiş hakkında (kernel64.inc gibi) ve halihazırda var olan semboller hakkında bir şeyler söylüyor.

include printInt.asm ana dosyasına nasıl eklemeye çalıştığım budur. Birlikte ihraç ediyorum: FASM- passing parameters to an external procedure

Ama bu da benim için çalışmak ve değildir: Bu konuda buldunuz Ne

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

geçerli:

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

Bu alt kaynağıdır farklı bir format hakkında.

PE64 biçiminde kendi kaynaklarımı nasıl ekleyebilirim?

cevap

0

Sen örn dahil yönergesi ile .asm dosyaları, .:

include 'your_subroutines.asm' 

senin .asm dosyanın içeriği tam olarak senin yönergesi dahil pozisyonunda yer almaktadır içerebilir. senin Örneğin, böyle bir şey salık: Bu nedenle

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

printInt: 
    ;your code here 
    ret 

include 'your_subroutines.asm' 

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

, sizin alt rutinler kod bölümünde bir parçasıdır. Ayrıca, 'win64a.inc' ifadesini sadece subproutine.asm dosyalarınızın her birinde değil, main.asm öğenizin başında bir kez yapmanız gerekir.