WMmail.ru - сервис почтовых рассылок

четверг, 19 января 2012 г.

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

 
Если выпуск не отображается, вы можете прочесть его на сайте Отказаться от рекламы
  
  
Скидки на зимние коллекции! Одежда из Италии, Франции и США.
  
  
  

  Мои подписки      Мои группы      Мои новости     
        Автор 
Калашников О.А.
      
  
Компьютеры и интернет   →   Софт   →   Программирование   →   RFpro.ru: Ассемблер? Это просто! Учимся программировать
  
RFpro.ru: Ассемблер? Это просто! Учимся программировать
 
 

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

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

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

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 3698
• повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2539
• повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2073
• повысить рейтинг »

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

Номер выпуска:1502
Дата выхода:19.01.2012, 18:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:150 / 47
Вопросов / ответов:2 / 2

Консультация # 185190: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Подсчитать количество нулей и единиц в произвольно заданном шестнадцатеричном числе. Код желательно писать в расчёте на его компиляцию FASM. Программа для Windows. Вывод результата в MessageBox....


Консультация # 185191: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Вычислить функцию заданную в виде: y(x) = а , если 1 < x <= 5 y(x) = b , если 5 < x <= 10 где а и в - элементы массивов А(I), В(I), стоящие в третьей позиции после сортировки в порядке возрастания. онсоль Сортировку массива в порядке возрастания оф...

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

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Подсчитать количество нулей и единиц в произвольно заданном шестнадцатеричном числе.
Код желательно писать в расчёте на его компиляцию FASM.
Программа для Windows. Вывод результата в MessageBox.

Дата отправки: 16.01.2012, 18:07
Вопрос задал: sir Henry (Старший модератор)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, sir Henry!
Вот такая получилась программа:

Код :
format PE GUI 4.0 entry start  include 'win32a.inc' include 'encoding\win1251.inc'  ID_HEX	   = 101 ID_MESSAGE = 102 ID_DIALOG  = 103  section '.data' data readable writeable  szformat db "Bin=%s, 0=%u, 1=%u",0 szError  db "Incorrect format",0 hex	rb	40h message rb	40h bin	rb	40h  section '.code' code readable executable  start: 	invoke	GetModuleHandle,0 	invoke	DialogBoxParam,eax,ID_DIALOG,HWND_DESKTOP,DialogProc,0 	invoke	ExitProcess,0  proc DialogProc hwnddlg,msg,wparam,lparam 	push	ebx esi edi 	cmp	[msg],WM_COMMAND 	je	wmcommand 	cmp	[msg],WM_CLOSE 	je	wmclose wmdefault: 	xor	eax,eax 	jmp	finish wmcommand: 	;клавиша Exit 	cmp	[wparam],BN_CLICKED shl 16 + IDCANCEL 	je	wmclose 	;клавиша Calc 	cmp	[wparam],BN_CLICKED shl 16 + IDOK 	jne	processed	    ;все остальные по-умолчаеию ;читаем строку из редактора 	invoke	GetDlgItemText,[hwnddlg],ID_HEX,hex,40h 	mov	ecx,eax 	;длина строки 	lea	esi,[hex]	;адрес строки 	xor	ebx,ebx 	;счетчик единиц 	xor	edx,edx 	;счетчик нулей 	lea	edi,[bin]	;строка бит calcLoop: 	lodsb			;очередной символ ;проверим на допустимость 	cmp	al,'0' 	jb	PrintError	;меньше '0' - ошибка 	cmp	al,'9' 	jbe	calcHex 	;цифра - в работу 	or	al,20h		;букву сделаем маленькой 	sub	al,'a'-10	;'a'-'f' -> 0ah-0fh 	jl	PrintError	;'9'< al < 'a' - ошибка 	cmp	al,0fh 	ja	PrintError	;> 'f' - ошибка calcHex: 	mov	ah,4		;число бит 	shl	al,4		;начнем со старшего calcBitsLoop: 	shl	al,1		;старший бит в С 	push	eax		;сохраним биты 	mov	al, '0' 	;формируем строку бит 	adc	al,0 	stosb 	shr	al,1		;вернем бит в С 	pop	eax		;восстановим остальные биты 	adc	ebx,0		;счетчик единиц 	inc	edx		;общий счетчик бит 	dec	ah 	jnz	calcBitsLoop 	loop	calcLoop	;по всем цифрам строки 	sub	edx,ebx 	;число нулей = общий счетчик бит - число единиц 	mov	al,0 	stosb  	invoke	wsprintf,message,szformat,bin,edx,ebx ;запишем во второй редактор результат 	invoke	SetDlgItemText,[hwnddlg],ID_MESSAGE,message 	jmp	processed PrintError: ;не hex-строка 	invoke	SetDlgItemText,[hwnddlg],ID_MESSAGE,szError 	jmp	processed wmclose: 	invoke	EndDialog,[hwnddlg],0 processed: 	mov	eax,1 finish: 	pop	edi esi ebx 	ret endp  section '.idata' import data readable writeable    library kernel,'KERNEL32.DLL',\ 	  user,'USER32.DLL'    import kernel,\ 	 GetModuleHandle,'GetModuleHandleA',\ 	 ExitProcess,'ExitProcess'    import user,\ 	 DialogBoxParam,'DialogBoxParamA',\ 	 GetDlgItemText,'GetDlgItemTextA',\ 	 SetDlgItemText,'SetDlgItemTextA',\ 	 wsprintf,'wsprintfA',\ 	 EndDialog,'EndDialog'  section '.rsrc' resource data readable  directory RT_DIALOG,dialogs  resource dialogs,\ 	   ID_DIALOG,LANG_RUSSIAN+SUBLANG_DEFAULT,dlg    dialog dlg,'Calc hex bits',70,70,220,100,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME     dialogitem 'STATIC','Hex:',-1,10,10,70,8,WS_VISIBLE     dialogitem 'EDIT','',ID_HEX,10,20,200,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP     dialogitem 'STATIC','Message:',-1,10,40,70,8,WS_VISIBLE     dialogitem 'EDIT','',ID_MESSAGE,10,50,200,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL+ES_READONLY     dialogitem 'BUTTON','Calc',IDOK,85,75,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON     dialogitem 'BUTTON','Exit',IDCANCEL,135,75,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON   enddialog 

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

5
нет комментария
-----
Дата оценки: 17.01.2012, 11:26

Рейтинг ответа:

НЕ одобряю +1 одобряю!

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

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Вычислить функцию заданную в виде:
y(x) = а , если 1 < x <= 5
y(x) = b , если 5 < x <= 10
где а и в - элементы массивов А(I), В(I), стоящие в третьей позиции после сортировки в порядке возрастания. онсоль
Сортировку массива в порядке возрастания оформить в виде подпрограммы. I = 1,2,..,10.

Код желательно писать в расчёте на его компиляцию FASM.
Программа для консоли Windows. Вывод результата в существующую консоль.

Дата отправки: 16.01.2012, 18:13
Вопрос задал: sir Henry (Старший модератор)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, sir Henry!
Вот программа.
Данные заданы в коде, Х вводится.

Код :
format PE console include 'win32a.inc' entry start  section '.data' data readable writeable A	dd	4,-4,-82,100,29,2,23,5,10,1 B	dd	14,5,34,2,10,-5,0,20,12,7 X	dd	6 sA	db	"A = ",0 sB	db	"B = ",0 sF	db	"F(%d) = %c = %d",13,10,0 lf	db	13,10,0 sFormat db	"%d ",0 sAfter	db	"After sorting",13,10,0 sEnter	db	"Enter X: ",0 sOutOfRange	db "X outside the interval (1,10]",13,10,0 TableNumErrors	dd sNumError, sNumOverflow sNumError	db "Number format error",13,10,0 sNumOverflow	db "Number overflow error",13,10,0  section '.code' code readable executable  start:       call   Main       invoke ExitProcess,0  ;вывод в консоль строки proc	StdOut	uses ebx, string 	invoke	lstrlen, [string]	;длина строки 	mov	ebx, eax		;в ebx 	invoke	GetStdHandle,STD_OUTPUT_HANDLE	;получим в eax handle консоли 	push	eax			;выделим в стеке слово 	mov	ecx,esp 		;адрес слова в ecx ;пишем в консоль c eax=handle строку string длины ebx.  ;Длина записанной строки будет в буфере, адрес которого в ecx 	invoke	WriteFile,eax,[string],ebx,ecx,0 	pop	eax 	ret endp  ;ввод с консоли строки proc	StdIn	string, len 	invoke	GetStdHandle,STD_INPUT_HANDLE	;получим в eax handle консоли 	push	eax 	mov	ecx, esp 	invoke	ReadConsole,eax,[string],[len],ecx,0 	pop	eax 	ret endp  ;вывод массива чисел Array, количеством count с заголовком sName proc	Print	uses esi, sName, Array, count locals buf	db	16 dup (?)		;буфер для преобразования числа в строку endl 	stdcall StdOut, [sName] 	;заголовок 	mov	ecx, [count]		;число элементов 	mov	esi, [Array]		;адрес ArLoop: 	lodsd 	push	ecx 	lea	ecx,[buf]		;адрес буфера 	cinvoke wsprintf, ecx, sFormat, eax 	lea	eax, [buf] 	stdcall StdOut, eax		;выводим 	pop	ecx 	loop	ArLoop 	stdcall StdOut,lf		;перевод строки 	ret endp  ;сортировка пузырьком массива arr с количеством cnt proc	Sort uses esi edi ebx, arr, cnt 	mov	ebx, [arr]		;адрес массива 	xor	esi, esi		;первый индекс 	mov	ecx, [cnt] 	dec	ecx			;индекс последнего элемента SortExtLoop:				;первый цикл 	lea	edi, [esi+1]		;второй индекс SortIntLoop:				;второй цикл 	mov	eax, dword[esi*4+ebx]	;первый элемент 	cmp	eax, dword[edi*4+ebx]	;сравниваем со вторым 	jle	SortIntNext		;если не больше, то на следующий 	xchg	eax, dword[edi*4+ebx]	;иначе меняем местами 	mov	dword[esi*4+ebx], eax SortIntNext: 	inc	edi			;на следующий второй 	cmp	edi, ecx		;циклим до последнего 	jbe	SortIntLoop 	inc	esi			;на следующий первый 	cmp	esi, ecx		;циклим до предпоследнего 	jb	SortExtLoop 	ret endp  ;преобразование строки [string] в знаковое число EAX proc	stoi	uses ebx esi edi, string 	xor	ebx, ebx	;здесь будем стоить число 	xor	ecx, ecx	;счетчик разрядов 	xor	edi, edi	;знак числа 	mov	esi, [string]	;адрес строки stoi_next: 	lodsb			;очередной символ 	cmp	al, 0dh 	je	stoi_sign 	cmp	al, '+' 	je	stoi_plus 	cmp	al, '-' 	je	stoi_menus 	cmp	al, '0' 	jb	stoi_error     ;любая нецифра,включая 0,- ошибка 	cmp	al, '9' 	ja	stoi_error 	push	eax		;сохраним новый разряд 	mov	eax, 10 	mul	ebx		;умножим старшие на 10 	test	edx, edx 	pop	edx		;новый 	jnz	stoi_overflow 	test	eax, eax 	js	stoi_overflow 	and	edx, 0fh	;'0'-'9' -> 0-9 	add	eax, edx	;добавляем новый разряд 	mov	ebx, eax 	jmp	stoi_next	;продолжаем stoi_plus: 	test	edi, edi	;уже был знак? 	jnz	stoi_error 	inc	edi 	jmp	stoi_next stoi_menus: 	test	edi, edi	;уже был знак? 	jnz	stoi_error 	dec	edi 	jmp	stoi_next stoi_sign: 	mov	eax, ebx	;число возвращаем в eax 	test	edi, edi	;учтем знак (0,1 > 0), (-1 < 0) 	jge	stoi_ret 	neg	eax stoi_ret: 	clc 	ret stoi_error: 	mov	eax, 1		;ошибка формата числа 	stc 	ret stoi_overflow: 	mov	eax, 2		;ошибка переполнения 	stc 	ret endp  ;функция f(x), с проверкой корректности x, должен быть в интервале ]1,10] proc	f, x 	cmp	[x], 5 	jg	cmp_return_b 	cmp	[x], 1 	jle	f_err 	mov	eax, [A+4*2]		;третий элемент массива А 	mov	dl, 'a' 		;для вывода сообщения 	clc 	ret cmp_return_b: 	cmp	[x], 10 	jg	f_err 	mov	eax, [B+4*2]		;третий элемент массива В 	mov	dl, 'b' 		;для вывода сообщения 	clc 	ret f_err: 	stc				;x вне интервала 	ret endp  proc	Main uses ebx locals buf	db	16 dup (?)		;буфер для преобразования числа в строку endl ;выведем массивы до сортировки 	mov	eax, sA 	lea	ecx, [A] 	stdcall Print, eax, ecx, 10 	lea	eax, [sB] 	lea	ecx, [B] 	stdcall Print, eax, ecx, 10  ;сортируем 	stdcall Sort, A, 10 	stdcall Sort, B, 10  ;сообщение о массивах после сортировки 	stdcall StdOut, sAfter  ;выведем массивы после сортировки 	mov	eax, sA 	lea	ecx, [A] 	stdcall Print, eax, ecx, 10 	lea	eax, [sB] 	lea	ecx, [B] 	stdcall Print, eax, ecx, 10  	stdcall StdOut, sEnter 	lea	ebx, [buf] 	stdcall StdIn, ebx, 16		;вводим строку-число Х  	stdcall stoi, ebx		;преобразовываем в число 	jc	NumError 	mov	[X], eax  ;считаем eax = f(x) 	stdcall f, eax 	jc	PrintError		;ошибка?  ;сформируем сообщение f(число) = a|b = число 	lea	ebx, [buf] 	invoke	wsprintf, ebx, sF, [X], edx, eax ;выведем 	stdcall StdOut, ebx 	ret PrintError: 	stdcall StdOut, sOutOfRange 	ret NumError: 	dec	eax 	mov	eax, [TableNumErrors+eax*2] 	stdcall StdOut, eax 	ret endp  ; #########################################################################  section '.idata' import data readable writeable    library kernel32,'KERNEL32.DLL',\ 	  user32,'USER32.DLL'    include 'api\kernel32.inc'   include 'api\user32.inc' 

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

5
нет комментария
-----
Дата оценки: 17.01.2012, 12:15

Рейтинг ответа:

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


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

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

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


 
 
Комментировать выпуск
     В избранное

Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать    26 декабря 2011, 21:03
RFpro.ru: Ассемблер? Это просто! Учимся программировать    25 декабря 2011, 16:04
RFpro.ru: Ассемблер? Это просто! Учимся программировать    22 декабря 2011, 15:03

Все выпуски рассылки

19 января 2012 отмечают:
Крещение Господне (Святое Богоявление)
День спасателя Беларуси
Праздник Девятнадцатого дня месяца Султан
Шат-тила Экадаши
День рождения Роберта&nbsp;Ли
 
 

Subscribe рекомендует
 
Компьютеры и интернет  →   рассылки   и   группы
  
Английский от Сергея Смирнова (курс YES)
Two tickets to Dublin. - Куда, блин? - To Dublin. Автор методики Сергей Смирнов научил говорить не одну тысячу человек. Пошлые ассоциации, обучающие анекдоты, тексты фильмов, пинки и бесплатные подзатыльники. Хочешь говорить по-английски? Давай сюда.
Подписчиков: 228837
  Ворчуния о книгах для админов и программистов - 2
Рассылка про бумажные книги по программированию и администрированию.Это не deja vue, это _новая_ рассылка Ворунии, заново созданная в 2006 взамен убитой.Ворчалки о книгах, которые я читала и читаю для себя+обмен мнениями между читателями и т.д.
Подписчиков: 415
  Обзор игр
В данной рассылке Борис Лайон занимается обзором игр. Причем игр, которые лично нравятся и которые по настоящему хороши и интересны. Выберете только лучшие игры! Обзор как новых, так и старых игр, а также игр самых разных жанров.
Подписчиков: 1520
 
 
 
Подписан адрес: admin10383.deep@blogger.com
Код этой рассылки: comp.prog.assembler
Архив рассылки
Отписаться:  На сайте  Почтой
Поддержка подписчиков
Убрать рекламу
Другие рассылки этой тематики
Другие рассылки этого автора
 
Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности

Комментариев нет:

Отправить комментарий