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

Объяснение кода листинга программы

  1. Удаление всех нулей из введенной строки символов.
  2. Ввод строки вопроса и ее длина.
  3. Формат вывода строки ответа и ее длина.
  4. Вывод строки вопроса на экран.
  5. Чтение строки ответа из консоли.
  6. Удаление символов новой строки из буфера.
  7. Переход к циклу удаления всех нулей из строки.
  8. Цикл удаления всех нулей из строки.
  9. Проверка на конец строки.
  10. Вывод на экран длины строки ответа.
  11. Вывод на экран отформатированной строки ответа.
  12. Чтение символа новой строки из консоли.
  13. Переход к концу программы.
  14. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы