Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2018, 19:15   #1
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
По умолчанию Чтение и преобразование строк. masm32

Дорогие и любимые программисты, помогите! Я начал изучать masm и, практически не найдя учебников по нему, решил обратиться к вам. Можете помочь написать программу, которая будет читать две строки до точки и обрабатывать их, пусть в более длинной строке мы меняем каждую срочную латинскую букву на N mod 10 (N порядковый номер буквы). А в более короткой меняем все элементы на '*' после последнего 'a' (латинского), используя строковые команды с префиксами повторения. Затем вывести преобразованный текст с отметкой длинный он или короткий. Преобразование данных должно быть описано в виде процедур. Причем вводимые данные не должны быть пустыми и не должны превышать 100 символов, если это нарушается, то вывести ошибку. Вывод данных должен быть описан в виде функции (true, если вводимые данные удовлетворяют условиям, false в противном случае). Если вам чем-то поможет, то могу писать программу на Free Pascal, да бы не считали, что я просто хочу, чтобы за меня все делали, а я ничего не знаю. P.S. нам ничего не объясняли, никакой литературы не давали (в МГУ всем на это *******).
Danddz вне форума Ответить с цитированием
Старый 11.03.2018, 22:32   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Danddz Посмотреть сообщение
masm32, помогите!
32 под винду чтоли? ..или DOS?

..и что из этого ты можешь сделать сам? наброски есть?
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.03.2018, 17:41   #3
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
По умолчанию

ну почти все есть, не могу сделать ввод данных с клавиатуры и обработку для короткой строки, пока не могу реализовать (не могу понять, как найти последний символ 'a').
Цитата:
.686P
.model flat, stdcall
option casemap: none

include c:\masm32\include\windows.inc

include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\masm32.inc

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\masm32.lib
.data
aszMsgResult db 0Dh, 0Ah, 'Result: ', 0Dh, 0Ah, 0
aszMsgLongStr db ' - Longest string:', 0Dh, 0Ah, 0
aszMsgShortStr db 0Dh, 0Ah, ' - Shortest string:', 0Dh, 0Ah, 0
aszCrLf db 0Dh, 0Ah, 0
aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
asStr1 db "Iran could soon join Russia-led free trade zone", 0
asStr2 db "Russian MP apologizes after accusations of sexual harassment", 0
.data?
lpStrS dd ? ;указатель на короткую строку
lpStrL dd ? ;указатель на длинную строку
StrLenL dd ? ;длина длинной строки
StrLenS dd ? ;длина короткойой строки
StrLen1 dd ?
StrLen2 dd ?
hConsoleOutput HANDLE ?
hConsoleInput HANDLE ?
Buffer db 1024 dup(?)
BufLen dd ?
.code
start:
; получение описателей ввода и вывода консоли
invoke GetStdHandle, STD_INPUT_HANDLE
mov hConsoleInput, eax

invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hConsoleOutput, eax

invoke ClearScreen

invoke StrLen, ADDR asStr1
mov [StrLen1], eax

invoke StrLen, ADDR asStr2
mov [StrLen2], eax

;вывод исходных строк
invoke WriteConsole, hConsoleOutput, ADDR asStr1,\
[StrLen1], ADDR StrLen1, NULL
invoke WriteConsole, hConsoleOutput, ADDR aszCrLf,\
LENGTHOF aszCrLf - 1, ADDR BufLen, NULL
invoke WriteConsole, hConsoleOutput, ADDR asStr2,\
[StrLen2], ADDR StrLen2, NULL

;выявление длинной и короткой строк
cmp eax, [StrLen2]
lea esi, [asStr1]
lea edi, [asStr2]
cmova eax, esi
cmova ebx, edi
cmovbe eax, edi
cmovbe ebx, esi
mov [lpStrL], eax
mov [lpStrS], ebx
;в более длинной строке меняем каждую строчную латинскую
;букву на цифру (N mod 10), где N - порядковый номер буквы.
mov esi, [lpStrL]
mov edi, esi
mov ebx, '0'
mov ecx, '0'
@@ForLonger:
cmp al, 'a'
jb @@WhileLonger
cmp al, 'z'
ja @@WhileLonger
mov [esi-1], bl
@@WhileLonger:
lodsb
inc ebx
cmp ebx, '9'
cmova ebx, ecx
or al, al
jnz @@ForLonger


;вывод результата
invoke WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL

invoke WriteConsole, hConsoleOutput, ADDR aszMsgLongStr,\
LENGTHOF aszMsgLongStr - 1, ADDR BufLen, NULL

invoke StrLen, [lpStrL]
mov [StrLenL], eax
invoke WriteConsole, hConsoleOutput, [lpStrL],\
[StrLenL], ADDR StrLenL, NULL

invoke WriteConsole, hConsoleOutput, ADDR aszCrLf,\
LENGTHOF aszCrLf - 1, ADDR BufLen, NULL

invoke WriteConsole, hConsoleOutput, ADDR aszMsgShortStr,\
LENGTHOF aszMsgShortStr - 1, ADDR BufLen, NULL

invoke StrLen, [lpStrS]
mov [StrLenS], eax
invoke WriteConsole, hConsoleOutput, [lpStrS],\
[StrLenS], ADDR StrLenS, NULL

;ожидание нажатия ENTER
invoke WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
invoke ReadConsole, hConsoleInput, ADDR Buffer,\
LENGTHOF Buffer, ADDR BufLen, NULL

invoke ExitProcess, 0

end start
Danddz вне форума Ответить с цитированием
Старый 12.03.2018, 20:38   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Danddz Посмотреть сообщение
не могу сделать ввод данных с клавиатуры и обработку для короткой строки
..для ввода строки используй ReadConsole.
Эта ф-ция сама возвращает кол-во реально введённых символов, поэтому StrLen можно будет убрать. Дальше сравниваешь 2-ввода, и берёшь адрес наименьшей строки.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.03.2018, 20:49   #5
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
По умолчанию

Спасибо. Можете подсказать, как найти последнюю букву 'a', а за ней все поменять на '*'?
Danddz вне форума Ответить с цитированием
Старый 12.03.2018, 20:55   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Danddz Посмотреть сообщение
как найти последнюю букву 'a'
для этого есть инструкция REPNE SCASB.
в AL помещаешь букву для поиска, а в EDI адрес строки для поиска (читай справку).
как найдёшь, в EDI-1 будет лежать адрес первой "а"
меняешь её на (что там тебе нужно), и продолжаешь поиск дальше, пока ECX не станет нуль
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.03.2018, 21:14   #7
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
По умолчанию

Можете объяснить, как работает REPNE SCASB, или скинуть ссылочку на достойную инструкцию (найти не смог, где понятно объясняется)?
Danddz вне форума Ответить с цитированием
Старый 12.03.2018, 21:21   #8
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Danddz Посмотреть сообщение
или скинуть ссылочку
..со-строковыми инструкциями сходу не разберёшься,
но можешь почитать здесь, может чё поймёшь...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.03.2018, 21:38   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..а тебе точно нужна программа под виндовую консоль???
судя по требованиям (ввод до точки) больше смахивает на MS-DOS...
вообще дос изучали на занятиях, или вин??? методички есть какие-нибудь???
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.03.2018, 21:41   #10
Danddz
Пользователь
 
Регистрация: 12.11.2017
Сообщений: 14
По умолчанию

Я, конечно, почитал, попробовал реализовать, но ничего не получается( Может есть еще какая-то литература более легкая? А то у меня осталось 3 часа до сдачи программы.
Danddz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несмотря на подключение masm32.inc и masm32.lib не подтягиваются функции stdin и stdout dFender Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 15.12.2016 13:24
Assembler под Windows (MASM32). Чтение данных массива из файла munthrekosh Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 05.06.2013 13:49
Преобразование строк tools Общие вопросы C/C++ 1 27.12.2010 14:55
преобразование строк imperceptible4462 Помощь студентам 14 07.09.2010 06:50
преобразование строк euhenia Помощь студентам 0 21.11.2009 20:19