我正在尝试将我的资源分成更有组织的文件,但我遇到了一些问题,包括这些资源。
如何包含这些来源? 我的主要程序是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 :(得分: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
;...
因此,您的子例程是代码部分的一部分。此外,包含'win64a.inc'只需要在main.asm的开头一次,而不是在每个子例程.asm文件中。