我在MASM32上写了一个程序,它抛出了一个错误,但我看不到纠正它的方法。该程序将替换输入字符串中最后一次出现'a‘到'*’之后满足的所有元素(符号),输入字符串是从keybord输入的;输入字符串不超过100个符号。
错误如下:
C:\Users\Mikola\AppData\Local\Temp\SASM\program.asm(60) : error A2101: cannot add two relocatable labels下面是代码
.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发布于 2018-03-13 21:13:09
(对不起,读错了问题,我认为这是有效的):循环指令在检查条件之前递减ecx。在您的代码中,您从未设置字符串长度(bigStr+0,smallStr+0),因此ecx最初为0。因此,您的程序将尝试处理2^32个字符,然后循环将停止它。
如果使用循环,则必须先检查前提条件,如下所示:
if (i) {
do {
x[i] = tolower(x[i]);
} while (--i);
}https://stackoverflow.com/questions/49251759
复制相似问题