我正在尝试使用 VS 2017 创建 dll。
该 dll 将有一个过程:symbol_count。
要求输入字符串,然后设置需要计数的符号。
.def 文件
LIBRARY name
EXPORTS
symbol_count
代码:
.586
.model flat, stdcall
option casemap: none
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\msvcrt.inc
includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib
.data
msg_string db 'Enter string: ', 0
msg_symbol db 'Enter symbol: ', 0
result db 'Count = %d', 0
str_modifier db '%s', 0
sym_modifier db '%c', 0
.data
string db ?
symbol db ?
DllEntry PROC hInstDLL:DWORD, reason:DWORD, reserved:DWORD
mov eax, 1
ret
DllEntry ENDP
symbol_count PROC
invoke crt_printf, OFFSET msg_string
invoke crt_scanf, OFFSET str_modifier, OFFSET string
invoke crt_printf, OFFSET msg_symbol
invoke crt_scanf, OFFSET sym_modifier, OFFSET symbol
xor esi, esi
xor ecx, ecx
mov ebx, OFFSET string
mov ecx, eax
mov al, symbol
loop1: <------------------------------------------ A2108
cmp byte ptr [ebx + ecx], 0
je endloop <------------------------------ A2107
cmp al, byte ptr [ebx + ecx]
jne next <-------------------------------- A2107
inc esi
next: <------------------------------------------- A2108
inc ecx
jmp loop1 <------------------------------- A2107
endloop: <---------------------------------------- A2108
invoke crt_printf, OFFSET result, esi
ret
symbol_count ENDP
End DllEntry
这是错误消息列表,编译器给我的内容:( 在代码中,我标记了编译器发誓的地方)
A2108 use of register assumed to ERROR
A2108 use of register assumed to ERROR
A2108 use of register assumed to ERROR
A2107 cannot have implicit far jump or call to near label
A2107 cannot have implicit far jump or call to near label
A2107 cannot have implicit far jump or call to near label
procedure argument or local not referenced : hInstDLL } all this points
procedure argument or local not referenced : reason } to DllEntry ENDP
procedure argument or local not referenced : reserved }
“您将代码放入 .data 部分,这可能会或可能不会导致某些错误。最后 3 个应该只是警告,因为您不使用参数。” – @Jester
(对于那些不明白其他答案的人) 是的,我今天遇到了关于 call 和 jmp 问题的同样问题,这都是关于我做错的一件简单的事情,它是通过 在 .data 部分之前声明 .code ,因此它引发了这个问题 (A2107 不能具有隐式远跳或调用近标签),因此请确保您的分段正确放置。
首先应该是.data,然后是.code,依此类推
~ 快乐编码