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

问题描述 投票:0回答:2

我正在尝试使用 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      } 
visual-studio assembly dll label masm
2个回答
1
投票

“您将代码放入 .data 部分,这可能会或可能不会导致某些错误。最后 3 个应该只是警告,因为您不使用参数。” – @Jester


0
投票

(对于那些不明白其他答案的人) 是的,我今天遇到了关于 call 和 jmp 问题的同样问题,这都是关于我做错的一件简单的事情,它是通过 在 .data 部分之前声明 .code ,因此它引发了这个问题 (A2107 不能具有隐式远跳或调用近标签),因此请确保您的分段正确放置。

首先应该是.data,然后是.code,依此类推

~ 快乐编码

© www.soinside.com 2019 - 2024. All rights reserved.