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