如何修复:(不能有隐式远跳转或调用近标签)和(使用假定为错误的寄存器)

How to fix: (cannot have implicit far jump or call to near label) and (use a register assumed to ERROR)

我正在尝试使用 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      } 

"You put your code into the .data section which may or may not cause some of the errors. The last 3 should just be warnings as you don't use the arguments." – @Jester