Как обработать строку в masm32

Тема в разделе "MASM", создана пользователем Danddz, 12 мар 2018.

  1. Danddz

    Danddz New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2018
    Сообщения:
    1
    Начал изучать masm32, но не могу понять, как реализовать в masm32. Подскажите, пожалуйста, как заменить все элементы (символы) идущие за последний вхождением 'a' на '*'. Вот моя программа, надо это сделать в пункте, который отвечает за короткую строку.

    Код (Text):
    1. .686P
    2. .model flat, stdcall
    3. option casemap: none
    4.  
    5.         include d:\masm32\include\windows.inc
    6.  
    7.         include d:\masm32\include\user32.inc
    8.         include d:\masm32\include\kernel32.inc
    9.         include d:\masm32\include\masm32.inc
    10.  
    11.         includelib d:\masm32\lib\user32.lib
    12.         includelib d:\masm32\lib\kernel32.lib
    13.         includelib d:\masm32\lib\masm32.lib
    14. .data
    15.         aszMsgResult    db      0Dh, 0Ah, 'Result: ', 0Dh, 0Ah, 0
    16.         aszMsgLongStr   db      ' - Longest string:', 0Dh, 0Ah, 0
    17.         aszMsgShortStr  db      0Dh, 0Ah, ' - Shortest string:', 0Dh, 0Ah, 0
    18.         aszCrLf         db      0Dh, 0Ah, 0
    19.         aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
    20.         asStr1          db      "Iran could soon join Russia-led free trade zone", 0
    21.         asStr2          db      "Russian MP apologizes after accusations of sexual harassment", 0
    22. .data?
    23.         lpStrS          dd      ?       ;указатель на короткую строку
    24.         lpStrL          dd      ?       ;указатель на длинную строку
    25.         StrLenL         dd      ?       ;длина длинной строки
    26.         StrLenS         dd      ?       ;длина короткойой строки
    27.         StrLen1         dd      ?
    28.         StrLen2         dd      ?
    29.         hConsoleOutput  HANDLE  ?
    30.         hConsoleInput   HANDLE  ?
    31.         Buffer          db      1024 dup(?)
    32.         BufLen          dd      ?
    33. .code
    34. start:
    35.         ; получение описателей ввода и вывода консоли
    36.         invoke  GetStdHandle,   STD_INPUT_HANDLE
    37.         mov     hConsoleInput,  eax
    38.  
    39.         invoke  GetStdHandle,   STD_OUTPUT_HANDLE
    40.         mov     hConsoleOutput, eax
    41.  
    42.         invoke  ClearScreen
    43.  
    44.         invoke  StrLen, ADDR asStr1
    45.         mov     [StrLen1],      eax
    46.  
    47.         invoke  StrLen, ADDR asStr2
    48.         mov     [StrLen2],      eax
    49.  
    50.         ;вывод исходных строк
    51.         invoke  WriteConsole, hConsoleOutput, ADDR asStr1,\
    52.                 [StrLen1], ADDR StrLen1, NULL
    53.         invoke  WriteConsole, hConsoleOutput, ADDR aszCrLf,\
    54.                 LENGTHOF aszCrLf - 1, ADDR BufLen, NULL
    55.         invoke  WriteConsole, hConsoleOutput, ADDR asStr2,\
    56.                 [StrLen2], ADDR StrLen2, NULL
    57.  
    58.         ;выявление длинной и короткой строк
    59.         cmp     eax,    [StrLen2]
    60.         lea     esi,    [asStr1]
    61.         lea     edi,    [asStr2]
    62.         cmova   eax,    esi
    63.         cmova   ebx,    edi
    64.         cmovbe  eax,    edi
    65.         cmovbe  ebx,    esi
    66.         mov     [lpStrL],       eax
    67.         mov     [lpStrS],       ebx
    68.         ;в более длинной строке меняем каждую строчную латинскую
    69.         ;букву на цифру (N mod 10), где N - порядковый номер буквы.
    70.         mov     esi,    [lpStrL]
    71.         mov     edi,    esi
    72.         mov     ebx,    '0'
    73.         mov     ecx,    '0'
    74.         @@ForLonger:
    75.                 cmp     al,     'a'
    76.                 jb      @@WhileLonger
    77.                 cmp     al,     'z'
    78.                 ja      @@WhileLonger
    79.                 mov     [esi-1],        bl
    80.         @@WhileLonger:
    81.                 lodsb
    82.                 inc     ebx
    83.                 cmp     ebx,    '9'
    84.                 cmova   ebx,    ecx
    85.                 or      al,     al
    86.         jnz     @@ForLonger
    87.  
    88.  
    89.         ;вывод результата
    90.         invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
    91.                 LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
    92.  
    93.         invoke  WriteConsole, hConsoleOutput, ADDR aszMsgLongStr,\
    94.                 LENGTHOF aszMsgLongStr - 1, ADDR BufLen, NULL
    95.  
    96.         invoke  StrLen, [lpStrL]
    97.         mov     [StrLenL],      eax
    98.         invoke  WriteConsole, hConsoleOutput, [lpStrL],\
    99.                 [StrLenL], ADDR StrLenL, NULL
    100.  
    101.         invoke  WriteConsole, hConsoleOutput, ADDR aszCrLf,\
    102.                 LENGTHOF aszCrLf - 1, ADDR BufLen, NULL
    103.  
    104.         invoke  WriteConsole, hConsoleOutput, ADDR aszMsgShortStr,\
    105.                 LENGTHOF aszMsgShortStr - 1, ADDR BufLen, NULL
    106.  
    107.         invoke  StrLen, [lpStrS]
    108.         mov     [StrLenS],      eax
    109.         invoke  WriteConsole, hConsoleOutput, [lpStrS],\
    110.                 [StrLenS], ADDR StrLenS, NULL
    111.  
    112.         ;ожидание нажатия ENTER
    113.         invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
    114.                 LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
    115.         invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
    116.                 LENGTHOF Buffer, ADDR BufLen, NULL
    117.  
    118.         invoke  ExitProcess, 0
    119.  
    120. end     start
    121.  
     
  2. HESH

    HESH Member

    Публикаций:
    1
    Регистрация:
    20 мар 2008
    Сообщения:
    86
    Так что ли?
    Код (ASM):
    1.  
    2. FindAndReplace proc uses ebx esi edi pszString:dword
    3. local RetVal:dword
    4.    
    5.     mov RetVal, 0
    6.    
    7.     xor ebx, ebx
    8.     xor edi, edi
    9.     mov esi, pszString
    10.     .repeat
    11.        
    12.         lodsb
    13.         .break .if al == 0
    14.        
    15.         inc edi
    16.        
    17.         .if al == "a"
    18.             mov ebx, esi
    19.         .endif
    20.    
    21.     .until FALSE
    22.    
    23.     .if ebx != 0
    24.        
    25.         mov ecx, pszString
    26.         add ecx, edi
    27.         sub ecx, ebx
    28.         mov RetVal, ecx
    29.        
    30.         mov edi, ebx
    31.         mov al, "*"
    32.         rep stosb
    33.        
    34.     .endif
    35.    
    36. mov eax, RetVal
    37. ret
    38. FindAndReplace endp