MASM32: Удалить все нули из введённой строки символов - Assembler
Формулировка задачи:
Помогите написать на ассемблере код программы, который будет удалять все нули из введённой строки символов и выводить результат и число оставшихся в строке символов, пожалуйста.
Можно изменить этот код,чтобы нули удалялись?
.386 .Model Flat, STDCall Option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\msvcrt.lib .Data sTitle db "Lab 05", 0; sQuestion db "Enter text:", 0; sQuestionLength = $-sQuestion; sFormat db "String length: %d", 10, "%s"; sFormatLength = $-sFormat; .Code main Proc local hStdOut:DWORD local hStdIn:DWORD nBufferLength = 1024; local hBuffer[nBufferLength]:Byte local nOffset:DWORD local hPrintBuffer[nBufferLength]:Byte; local nCharsWritten:DWORD local nCharsRead:DWORD local nStringLength:DWORD Invoke AllocConsole; Invoke SetConsoleTitleA, Offset sTitle; Invoke GetStdHandle, STD_OUTPUT_HANDLE; Mov hStdOut, EAX; Invoke GetStdHandle, STD_INPUT_HANDLE; Mov hStdIn, EAX; Invoke WriteConsoleA, hStdOut, Offset sQuestion, sQuestionLength, Addr nCharsWritten, NULL; Invoke ReadConsoleA, hStdIn, Addr hBuffer, nBufferLength, Addr nCharsRead, NULL; Mov ECX, nCharsRead; Mov nOffset, 0; CMP ECX, 0; JE ShowResult; StringLoop: ; Index Mov EBX, nCharsRead; Sub EBX, ECX; Mov AL, hBuffer[EBX]; ; "," .If EAX == 44 Mov EBX, nOffset; Add EBX, 1; Mov nOffset, EBX; .ElseIf EAX == 46 Mov EBX, nOffset; Add EBX, 1; Mov nOffset, EBX; .Else Jmp ShowResult; .EndIf ; If string end reached .If EAX == 0 Jmp ShowResult; .EndIf Loop StringLoop; ShowResult: Invoke crt_strlen, Addr hBuffer; Mov nStringLength, EAX; LEA EAX, hBuffer; Add EAX, nOffset; Push EAX; Push nStringLength; LEA EAX, sFormat; Push EAX; LEA EAX, hPrintBuffer; Push EAX; Call crt_sprintf; Add ESP, 16; Invoke WriteConsoleA, hStdOut, Addr hPrintBuffer, EAX, NULL, NULL; ShowResultEnd: WaitForInput: Invoke ReadConsoleA, hStdIn, Addr hPrintBuffer, nBufferLength, Addr nCharsRead, NULL; Return: Invoke CloseHandle, hStdIn; Invoke CloseHandle, hStdOut; Invoke ExitProcess, 0; main EndP End main
Решение задачи: «MASM32: Удалить все нули из введённой строки символов»
textual
Листинг программы
.386 .Model Flat, STDCall Option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\msvcrt.lib .Data sTitle db "Lab 05", 0; sQuestion db "Enter text:", 0; sQuestionLength = $-sQuestion; sFormat db "String length: %d", 10, "%s"; sFormatLength = $-sFormat; .Code main Proc local hStdOut:DWORD local hStdIn:DWORD nBufferLength = 1024; local hBuffer[nBufferLength]:Byte local nOffset:DWORD local hPrintBuffer[nBufferLength]:Byte; local nCharsWritten:DWORD local nCharsRead:DWORD local nStringLength:DWORD Invoke AllocConsole; Invoke SetConsoleTitleA, Offset sTitle; Invoke GetStdHandle, STD_OUTPUT_HANDLE; Mov hStdOut, EAX; Invoke GetStdHandle, STD_INPUT_HANDLE; Mov hStdIn, EAX; Invoke WriteConsoleA, hStdOut, Offset sQuestion, sQuestionLength, Addr nCharsWritten, NULL; Invoke ReadConsoleA, hStdIn, Addr hBuffer, nBufferLength, Addr nCharsRead, NULL; lea esi, [hBuffer] ;удаление из буфера add esi, [nCharsRead] ;символов перевода строки mov [esi-2],word ptr 0 lea esi, [hBuffer] mov edi, esi Mov ECX, nCharsRead; JECXZ ShowResult; StringLoop: lodsb .If al != '0' stosb .EndIf ; If string end reached .If al == 0 Jmp ShowResult; .EndIf Loop StringLoop; ShowResult: Invoke crt_strlen, Addr hBuffer; Mov nStringLength, EAX; LEA EAX, hBuffer; Add EAX, nOffset; Push EAX; Push dword ptr [nStringLength]; LEA EAX, [sFormat]; Push EAX; LEA EAX, hPrintBuffer; Push EAX; Call crt_sprintf; Add ESP, 16; Invoke WriteConsoleA, hStdOut, Addr hPrintBuffer, EAX, NULL, NULL; ShowResultEnd: WaitForInput: Invoke ReadConsoleA, hStdIn, Addr hPrintBuffer, nBufferLength, Addr nCharsRead, NULL; Return: Invoke CloseHandle, hStdIn; Invoke CloseHandle, hStdOut; Invoke ExitProcess, 0; main EndP End main
Объяснение кода листинга программы
- Удаление всех нулей из введенной строки символов.
- Ввод строки вопроса и ее длина.
- Формат вывода строки ответа и ее длина.
- Вывод строки вопроса на экран.
- Чтение строки ответа из консоли.
- Удаление символов новой строки из буфера.
- Переход к циклу удаления всех нулей из строки.
- Цикл удаления всех нулей из строки.
- Проверка на конец строки.
- Вывод на экран длины строки ответа.
- Вывод на экран отформатированной строки ответа.
- Чтение символа новой строки из консоли.
- Переход к концу программы.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д