Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10653
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3992
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 1762
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1550
Дата выхода:31.10.2013, 02:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:45 / 23
Вопросов / ответов:1 / 1

Консультация # 187594: Здравствуйте,уважаемые эксперты. Нужно написать программу,желательно используя MASM. Даны две строки: строка1 "F4D531675F637A9745967E883A7AB18E" строка2 "0123456789ABCDEFGHJKLMNPQRTUVWXY" Строку1 нужно разбить на 16 двухбайтных слов и с каждым из слов провести логическую операцию И (AND) c 8000001Fh,тут ж...


Консультация # 187594:

Здравствуйте,уважаемые эксперты.
Нужно написать программу,желательно используя MASM.
Даны две строки:
строка1 "F4D531675F637A9745967E883A7AB18E"
строка2 "0123456789ABCDEFGHJKLMNPQRTUVWXY"

Строку1 нужно разбить на 16 двухбайтных слов и с каждым из слов провести логическую операцию И (AND) c 8000001Fh,тут же прибавляя к
каждому из 16 получившихся значений единицу.Каждый получившийся р-тат-- это смещение в строке2,по которому нужно взять символ,и,когда их наберётся 16,в виде строки вывести на экран (в данном случае это "LMH7Y3TP5NX8TTHE").
Спасибо.

Дата отправки: 27.10.2013, 15:16
Вопрос задал: Сергей (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Сергей!
Т.к. в данном примере число исходных данных ровно столько, сколько надо,
то проверка на 16 байт отсутствует. Это легко добавляется.
Демонстрируется сама идея обработки данных.
Примерно так:

Код :
	.386
model	flat, stdcall
option	casemap :none 

;подключаем необходимые inc-файлы
include \masm32\include\windows.inc
;include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

;и библиотеки
;includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

;прототипы функций
StdOut		PROTO	:DWORD, :DWORD
GetNibble	PROTO
GetNum		PROTO
CalcText	PROTO	:DWORD, :DWORD, :DWORD

;стек
	.stack	1024

;сегмент данных
	.data
sMD5	db	"F4D531675F637A9745967E883A7AB18E"
lenMD5	equ	($-sMD5)/2		;количество данных
sData	db	"0123456789ABCDEFGHJKLMNPQRTUVWXY"
sTitle	db	"Decoding text: "

	.data?
sText	db	256 dup (?)	

;сегмент кода
	.code
main	proc
local	hOutPut:DWORD		;описатель стандартного выходного устройства
;получаем handle устройства
	invoke	GetStdHandle, STD_OUTPUT_HANDLE
	mov	hOutPut, eax

;выводим "Decoding text: "
	invoke	StdOut, hOutPut, addr sTitle

	invoke	CalcText, addr sMD5, lenMD5, addr sText
	
;выведем строку
	invoke	StdOut, hOutPut, addr sText
;выход	
	invoke	ExitProcess, NULL
main	endp

GetNibble	proc		;hex-символ в hex-число 0-f
	lodsb
	sub	al, '0'	
	cmp	al, 9		;0-9 ?
	jbe	GetNibbleRet
	sub	al, 'A'-'0'-0ah	;A-F
GetNibbleRet:
	ret
GetNibble	endp

GetNum	proc			;два hex-символа в байт
	call	GetNibble
	shl	al, 4
	mov	ah, al
	call	GetNibble
	or	al, ah
	ret
GetNum	endp

CalcText	proc uses esi ecx edi, pMD5:DWORD, iCount:DWORD, pText:DWORD
	mov	esi, pMD5	;адрес массива
	mov	ecx, iCount	;его длина
	mov	edi, pText
CalcTextLoop:
	call	GetNum
	and	eax, 0000001fh
	mov	al, sData[eax]
	stosb
	loop	CalcTextLoop
	mov	byte ptr [edi], 0	;закроем строку нулем для вывода
	ret
CalcText	endp

;вывод строки на стандартное выходное устройство
;параметр - адрес строки
StdOut		proc hOutPut:DWORD, lpszText:DWORD
;локальные переменные в стеке
LOCAL	bWritten:DWORD		;количество выведенных символов
LOCAL	len:DWORD		;длина строки

;получаем длину строки
	invoke	lstrlen, lpszText
	mov	len, eax

;выводим
	invoke	WriteFile, hOutPut, lpszText, len, ADDR bWritten, NULL

;возвращаем количество выведенных символов
	mov eax, bWritten
	ret
StdOut	endp

	end	main

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 28.10.2013, 01:38
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное