Другие языки программирования и технологии
В АССЕМБЛЕРЕ заполнить буфер с конца !
Ввести строку символьных данных, задавая буфер равный 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 символов, то оставшаяся часть буфера заполняется пробелами.
То есть, выражаясь человеческим языком, ввести с клавиатуры строку символов в буфер размером 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 символов, то оставшаяся часть буфера заполняется пробелами.
Похожие вопросы
- Что может ассемблер?
- Почему многие программисты ненавидят ассемблер?Ведь у него куча плюсов!Он позволяет максимально задействовать
- Строки ассемблер нужно заполнить строку (10) рандомными символами. (MASM) как? помогите!
- Интересный вопрос: Однозначно возможно, только как вставлять из буфера два разных элемента добавив их туда ранее.
- Вопрос по изучению языка Ассемблера под MS DOS. (Нужны советы по программному обеспечению/программированию)
- С помощью команд fpu вычислить площадь круга, исходя из введѐнного диаметра. Ассемблер...
- Ассемблер сегодня и завтра.
- стоит ли изучать ассемблер, если программирую на Делфи? и вообще реально ли что нибудь хорошее, дельное, нужное написать
- Неужели ассемблер действительно проще чем C ?
- Ассемблер - за сколько его реально базово выучить?