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

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



В избранное