我有这两个程序,最初这两个程序独立运行,但我想在第一个程序中包含第二个代码。
我尝试导出标签,使标签成为proc,将格式指定为DLL,但似乎没有任何对我有用。
我已经挖掘了很多信息,以及很多其他人的fasm规范本身,但并不是所有的东西都告诉我做同样的事情,我尝试过各种各样的组合但是没有#39; t help。
有人可以指出以下代码有什么问题吗? 它组装好,当我不使用从第二个源导入的任何东西时,它也运行正常。当我这样做时,程序返回错误0xc000007b,甚至在执行之前!
这是第一个文件
format PE64
include 'win64a.inc'
;include 'printInt.asm'
entry start
section '.code' code readable executable
start:
;call [newline] ;errors
mov rcx, 317
mov rdx, 16
call fromBase10
mov rcx, rax
mov r12, rax
call printArray
invoke ExitProcess, 0
fromBase10:
;rcx -> number
;rdx -> base
mov rax, rcx
mov r8, rdx
xor rcx, rcx
xor rdx, rdx
.l1:
inc rcx
div r8
push rdx
xor rdx, rdx
cmp rax, 0
jne .l1
shl rcx, 3
mov rax, rcx
add rsp, rcx
;stack <- number
;rax (, rcx) <- length (bytes)
ret
toBase10:
;rcx -> length (bytes)
;rdx -> base
;stack -> number
sub rsp, 8
mov r8, 1
xor r9, r9
mov r10, rdx
mov r11, rcx
shr rcx, 3
.l1:
mov rax, [rsp]
sub rsp, 8
mul r8
add r9, rax
mov rax, r8
mul r10
mov r8, rax
dec rcx
jnz .l1
add rsp, r11
add rsp, 8
mov rax, r9
;rax <- number
ret
printArray:
;rcx -> length (bytes)
;stack -> array
sub rsp, rcx
push r12
push r13
add rsp, 16
mov r13, rcx
mov r13, rcx
shr rcx, 3
mov r12, rcx
.l1:
pop rcx
add rcx, 0x30
sub rsp, r13 ;ugly, UGLY!!!! :(
sub rsp, 8
sub rsp, 32
call [putchar]
mov rcx, 0x20
call [putchar]
add rsp, 32
add rsp, 8
add rsp, r13
dec r12
jnz .l1
sub rsp, r13
sub rsp, 16
mov rax, r13
pop r13
pop r12
add rsp, rax
;stack <- array
ret
section '.idata' import data readable writeable
library kernel, 'kernel32.dll',\
msvcrt, 'msvcrt.dll',\
printLib, 'printLib.dll'
import kernel, ExitProcess, 'ExitProcess'
import msvcrt, printf, 'printf',\
putchar, 'putchar'
import printLib, printInt, 'printInt',\
newline, 'newline'
这是第二个:
format PE64 DLL
entry DllMain
include 'win64a.inc'
section '.text' code readable executable
proc DllMain hinstDLL, fdwReason, lpvReserved
mov rax, TRUE
ret
endp
proc printInt integer
push r10
push r11
push r12
push r13
push r14
mov rcx, [integer]
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
endp
proc newline
sub rsp, 32
mov rcx, 0xa
call [putchar]
mov rcx, 0xd
call [putchar]
add rsp, 32
ret
endp
;rdtsc64x:
; rdtsc
; shl rdx, 32
; add rax, rdx
; mov rdx, 0
;ret
section '.idata' import data readable writeable
library msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf',\
putchar, 'putchar'
section '.edata' data readable
export 'printInt.dll',\
printInt, 'printInt',\
newline, 'newline'
data fixups
end data
我完全不知道为什么这不起作用,所有的帮助都会非常感激。 令我困惑的另一件事是,如果我在第一个文件中定义一个程序,它不想组装,有人可以指出为什么会这样吗?
我还想听到的一件事是,如果我返回一个数组的方式绝对是错误的返回类似数组的方式以及应该如何完成。