首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Masm抛出错误

Masm抛出错误
EN

Stack Overflow用户
提问于 2018-03-13 16:48:40
回答 1查看 168关注 0票数 0

我在MASM32上写了一个程序,它抛出了一个错误,但我看不到纠正它的方法。该程序将替换输入字符串中最后一次出现'a‘到'*’之后满足的所有元素(符号),输入字符串是从keybord输入的;输入字符串不超过100个符号。

错误如下:

代码语言:javascript
运行
复制
 C:\Users\Mikola\AppData\Local\Temp\SASM\program.asm(60) : error A2101: cannot add two relocatable labels

下面是代码

代码语言:javascript
运行
复制
.686P
.model flat, stdcall
option casemap: none

        include c:\masm32\include\windows.inc

        include c:\masm32\include\user32.inc
        include c:\masm32\include\kernel32.inc
        include c:\masm32\include\masm32.inc

        includelib c:\masm32\lib\user32.lib
        includelib c:\masm32\lib\kernel32.lib
        includelib c:\masm32\lib\masm32.lib


.data

mes1      db   'String(1):  '   
mes2      db   'String(2):  '   
mes3      db   'Result...:  '   
len       dd   $ - mes3         
crlf      db   13,10            

buff1     db   100 dup(0)       
buff2     db   100 dup(0)       
size1     dd   0                
size2     dd   0                
bigStr    dd   0,0              
smallStr  dd   0,0              

.code
start:
;------ Запрос и вводим строки
        invoke   WriteConsoleA, 7, mes1, [len], 0,0     
        invoke   ReadConsoleA, 3, buff1, 100, size1,0   

        invoke   WriteConsoleA, 7, mes2, [len], 0,0     
        invoke   ReadConsoleA, 3, buff2, 100, size2,0   

;------ Сравниваем размеры введённых строк
        push     buff1 [size1]    
        push     buff2 [size2]    
        mov      eax,[size1]      
        cmp      eax,[size2]      
        jb       @@small          

        pop      [smallStr] [smallStr+4]   
        pop      [bigStr]   [bigStr+4]     
        jmp      @@big                      

@@small: pop      [bigStr]   [bigStr+4]     
        pop      [smallStr] [smallStr+4]   

;------ Обработка длинной строки (меняем все/строчные на (N mod 10))
@@big:   mov      ecx,[bigStr]     
        mov      esi,[bigStr+4]   
        mov      edi,esi          
        xor      ebx,ebx          
@@cyc1:  lodsb                    
        inc      bl               
        cmp      al,'a'           
        jb       @@next1          
        cmp      al,'z'           
        ja       @@next1          
        mov      al,bl            
        aam                       
@@next1: stosb                    
        loop     @@cyc1            

;------ Обработка короткой строки (после последнего 'a', все на '*')
        mov      ecx,[smallStr]   
        dec      cx
        push     ecx              
        mov      edi,[smallStr+4] 
        add      edi,ecx          
        mov      al,'a'           
        std                       
@@cyc2:  repne    scasb            
        cld                       
        pop      eax              
        or       ecx,ecx          
        jz       @@stop           

        xchg     ecx,eax          
        sub      ecx,eax          
        add      edi,2            
        mov      al,'*'           
        rep      stosb            

;------ Вывод результата из буфера
@@stop:  invoke   WriteConsoleA, 7, mes3, [len],   0,0
        invoke   WriteConsoleA, 7, buff1,[size1], 0,0
        invoke   WriteConsoleA, 7, crlf,2,0,0          
        invoke   WriteConsoleA, 7, mes3, [len],   0,0
        invoke   WriteConsoleA, 7, buff2,[size2], 0,0

        jmp      $                
@@exit:  invoke  ExitProcess, 0    

end start
EN

回答 1

Stack Overflow用户

发布于 2018-03-13 21:13:09

(对不起,读错了问题,我认为这是有效的):循环指令在检查条件之前递减ecx。在您的代码中,您从未设置字符串长度(bigStr+0,smallStr+0),因此ecx最初为0。因此,您的程序将尝试处理2^32个字符,然后循环将停止它。

如果使用循环,则必须先检查前提条件,如下所示:

代码语言:javascript
运行
复制
if (i) {
     do {
         x[i] = tolower(x[i]);
     } while (--i);
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49251759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档