Другие языки программирования и технологии

В АССЕМБЛЕРЕ заполнить буфер с конца !

Ввести строку символьных данных, задавая буфер равный 10 байт. Заменить в этой строке 4 символа на символ "*". Выдать полученную строку символов
> заполнить буфер с конца... буфер равный 10 байт. Заменить в этой строке 4 символа на символ "*".
То есть, выражаясь человеческим языком, ввести с клавиатуры строку символов в буфер размером 10 байт и, не зависимо от длины введенной строки, заполнить 4 последних байта буфера кодом символа "звёздочка".

format PE
entry N98209094
include 'win32a.inc'
stack 200h

section '.code' code readable executable
proc GetString stdcall uses eax edi ecx, BufAdr: dword, BufLen: dword
    mov edi, [BufAdr]
    mov ecx, [BufLen]
GetS1:
    push ecx
    invoke getch
    pop ecx
    cmp al, 13
    je GetS3
    cmp al, 8
    je GetS2
    cmp al, 32
    jb GetS1
    jcxz GetS1
    stosb
    push ecx
    cinvoke putch, eax
    pop ecx
    dec ecx
    jmp GetS1
GetS2:
    cmp ecx, [BufLen]
    je GetS1
    inc ecx
    dec edi
    push ecx
    cinvoke putch, 8
    cinvoke putch, 32
    cinvoke putch, 8
    pop ecx
    jmp GetS1
GetS3:
    jcxz GetS4
    mov al, 32
    rep stosb
GetS4:
    ret
endp

N98209094:
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov [hStdOut], eax
    invoke WriteConsole, [hStdOut], Prompt, 32, NULL, 0
    stdcall GetString, Buff, 10
    mov dword [Buff + 6], '****'
    invoke WriteConsole, [hStdOut], Result, 27, NULL, 0
    invoke WriteConsole, [hStdOut], Buff, 10, NULL, 0
    invoke WriteConsole, [hStdOut], Quit, 49, NULL, 0
    invoke getch
    invoke ExitProcess, NULL

section '.data' data readable
Prompt db 'Введите строку из 10 символов:', 13, 10
Result db 13, 10, 'Преобразованная строка:', 13, 10
Quit db 13, 10, 10, 'Для завершения работы нажмите любую клавишу...'

section '.bss' data readable writeable
hStdOut rd 1
Buff rb 10

section '.idata' import data readable
library kernel32,'kernel32.dll', msvcrt,'msvcrt.dll'
include 'api/kernel32.inc'
import msvcrt, getch,'_getch', putch,'_putch'



P.S. При вводе длина строки ограничивается 10 символами. Обрабатываются коды клавиш Backspace и Еntеr.
Если введённая строка короче 10 символов, то оставшаяся часть буфера заполняется пробелами.
Ерлан Жексембаев
Ерлан Жексембаев
51 590
Лучший ответ