Начал изучать masm32, но не могу понять, как реализовать в masm32. Подскажите, пожалуйста, как заменить все элементы (символы) идущие за последний вхождением 'a' на '*'. Вот моя программа, надо это сделать в пункте, который отвечает за короткую строку. Код (Text): .686P .model flat, stdcall option casemap: none include d:\masm32\include\windows.inc include d:\masm32\include\user32.inc include d:\masm32\include\kernel32.inc include d:\masm32\include\masm32.inc includelib d:\masm32\lib\user32.lib includelib d:\masm32\lib\kernel32.lib includelib d:\masm32\lib\masm32.lib .data aszMsgResult db 0Dh, 0Ah, 'Result: ', 0Dh, 0Ah, 0 aszMsgLongStr db ' - Longest string:', 0Dh, 0Ah, 0 aszMsgShortStr db 0Dh, 0Ah, ' - Shortest string:', 0Dh, 0Ah, 0 aszCrLf db 0Dh, 0Ah, 0 aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0 asStr1 db "Iran could soon join Russia-led free trade zone", 0 asStr2 db "Russian MP apologizes after accusations of sexual harassment", 0 .data? lpStrS dd ? ;указатель на короткую строку lpStrL dd ? ;указатель на длинную строку StrLenL dd ? ;длина длинной строки StrLenS dd ? ;длина короткойой строки StrLen1 dd ? StrLen2 dd ? hConsoleOutput HANDLE ? hConsoleInput HANDLE ? Buffer db 1024 dup(?) BufLen dd ? .code start: ; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax invoke ClearScreen invoke StrLen, ADDR asStr1 mov [StrLen1], eax invoke StrLen, ADDR asStr2 mov [StrLen2], eax ;вывод исходных строк invoke WriteConsole, hConsoleOutput, ADDR asStr1,\ [StrLen1], ADDR StrLen1, NULL invoke WriteConsole, hConsoleOutput, ADDR aszCrLf,\ LENGTHOF aszCrLf - 1, ADDR BufLen, NULL invoke WriteConsole, hConsoleOutput, ADDR asStr2,\ [StrLen2], ADDR StrLen2, NULL ;выявление длинной и короткой строк cmp eax, [StrLen2] lea esi, [asStr1] lea edi, [asStr2] cmova eax, esi cmova ebx, edi cmovbe eax, edi cmovbe ebx, esi mov [lpStrL], eax mov [lpStrS], ebx ;в более длинной строке меняем каждую строчную латинскую ;букву на цифру (N mod 10), где N - порядковый номер буквы. mov esi, [lpStrL] mov edi, esi mov ebx, '0' mov ecx, '0' @@ForLonger: cmp al, 'a' jb @@WhileLonger cmp al, 'z' ja @@WhileLonger mov [esi-1], bl @@WhileLonger: lodsb inc ebx cmp ebx, '9' cmova ebx, ecx or al, al jnz @@ForLonger ;вывод результата invoke WriteConsole, hConsoleOutput, ADDR aszMsgResult,\ LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL invoke WriteConsole, hConsoleOutput, ADDR aszMsgLongStr,\ LENGTHOF aszMsgLongStr - 1, ADDR BufLen, NULL invoke StrLen, [lpStrL] mov [StrLenL], eax invoke WriteConsole, hConsoleOutput, [lpStrL],\ [StrLenL], ADDR StrLenL, NULL invoke WriteConsole, hConsoleOutput, ADDR aszCrLf,\ LENGTHOF aszCrLf - 1, ADDR BufLen, NULL invoke WriteConsole, hConsoleOutput, ADDR aszMsgShortStr,\ LENGTHOF aszMsgShortStr - 1, ADDR BufLen, NULL invoke StrLen, [lpStrS] mov [StrLenS], eax invoke WriteConsole, hConsoleOutput, [lpStrS],\ [StrLenS], ADDR StrLenS, NULL ;ожидание нажатия ENTER invoke WriteConsole, hConsoleOutput, ADDR aszPressEnter,\ LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL invoke ReadConsole, hConsoleInput, ADDR Buffer,\ LENGTHOF Buffer, ADDR BufLen, NULL invoke ExitProcess, 0 end start
Так что ли? Код (ASM): FindAndReplace proc uses ebx esi edi pszString:dword local RetVal:dword mov RetVal, 0 xor ebx, ebx xor edi, edi mov esi, pszString .repeat lodsb .break .if al == 0 inc edi .if al == "a" mov ebx, esi .endif .until FALSE .if ebx != 0 mov ecx, pszString add ecx, edi sub ecx, ebx mov RetVal, ecx mov edi, ebx mov al, "*" rep stosb .endif mov eax, RetVal ret FindAndReplace endp