[{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-32 мин."},"isBanned":false,"roleString":"Мастер-Эксперт","roleIcon":"fa-user-ninja","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"Facta loquuntur.","signatureHTML":"Facta loquuntur.","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.979,"absoluteRating":109927,"dynamicRating":1675.071,"dynamicRatingStars":10,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-05-06T04:32:02.6626555+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":11,"counters":{"daysAtPortal":6562,"questions":12,"questionsPosts":18345,"questionsAnswers":6663,"questionsPostsEvaluations":2831,"forumPosts":5698},"isRfproUserClass":true,"id":17387,"name":"Гордиенко Андрей Владимирович","email":"","role":10,"registDate":"1000-01-01T00:00:00","lastDate":"2024-05-06T05:00:12","photo":"users/17387/f4979bc95a484b9f43f75cfe66538acd.jpg","lastDateIndicatorClass":"red","lastDateIndicatorText":"давно","photoPreview200":"users/17387/200_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview120":"users/17387/120_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview100":"users/17387/100_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview80":"users/17387/80_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview40":"users/17387/40_f4979bc95a484b9f43f75cfe66538acd.jpg","isPhotoExists":true,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-32 мин."},"isBanned":false,"roleString":"Мастер-Эксперт","roleIcon":"fa-user-ninja","socialMedia":[],"aboutText":"Я пенсионер. Образование высш, радио-инж. Работал инж-электроником, ведущим средств телевидения, связи, слесарем и инженером КИП, грузчиком, программистом. На моём счету десятки рац-предложений, в тч с большим экономич эффектом.\nЯ люблю компьютеры, ремонтирую их друзьям и соседям. Пишу полезные программки в vbs-файлах, автоматизирующие настройку Win-систем, приложений и работу с ними.","aboutHTML":"Я пенсионер. Образование высш, радио-инж. Работал инж-электроником, ведущим средств телевидения, связи, слесарем и инженером КИП, грузчиком, программистом. На моём счету десятки рац-предложений, в тч с большим экономич эффектом.\u003Cbr\u003EЯ люблю компьютеры, ремонтирую их друзьям и соседям. Пишу полезные программки в vbs-файлах, автоматизирующие настройку Win-систем, приложений и работу с ними.","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.935,"absoluteRating":25753,"dynamicRating":460.291,"dynamicRatingStars":8,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-05-06T04:32:02.6629063+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":11,"counters":{"daysAtPortal":5595,"questions":25,"questionsPosts":7459,"questionsAnswers":1225,"questionsPostsEvaluations":788,"forumPosts":399},"isRfproUserClass":true,"id":259041,"name":"Алексеев Владимир Николаевич","email":"","role":10,"registDate":"1000-01-01T00:00:00","lastDate":"2024-01-30T15:24:45","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-32 мин."},"isBanned":false,"roleString":"Старший Модератор","roleIcon":"fa-user-tie","socialMedia":[],"aboutText":"634034, г.Томск, ул.Красноармейская 122, кв.173","aboutHTML":"634034, г.Томск, ул.Красноармейская 122, кв.173","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.985,"absoluteRating":21746,"dynamicRating":411.899,"dynamicRatingStars":8,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-05-06T04:32:02.6630565+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":13,"counters":{"daysAtPortal":5279,"questions":1,"questionsPosts":1973,"questionsAnswers":1283,"questionsPostsEvaluations":588,"forumPosts":91},"isRfproUserClass":true,"id":312929,"name":"Коцюрбенко Алексей Владимирович","email":"","role":12,"registDate":"1000-01-01T00:00:00","lastDate":"2023-11-05T17:20:40","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-32 мин."},"isBanned":false,"roleString":"Советник","roleIcon":"fa-user-ninja","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":5,"absoluteRating":9460,"dynamicRating":385.726,"dynamicRatingStars":8,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-05-06T04:32:02.6631942+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":10,"counters":{"daysAtPortal":2452,"questions":0,"questionsPosts":472,"questionsAnswers":398,"questionsPostsEvaluations":298,"forumPosts":1},"isRfproUserClass":true,"id":401284,"name":"Михаил Александров","email":"","role":9,"registDate":"1000-01-01T00:00:00","lastDate":"2024-04-21T19:50:04","photo":"users/401284/48171011af39b6bb3a74df8c0fcf97d0.jpg","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"users/401284/200_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview120":"users/401284/120_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview100":"users/401284/100_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview80":"users/401284/80_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview40":"users/401284/40_48171011af39b6bb3a74df8c0fcf97d0.jpg","isPhotoExists":true,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-32 мин."},"isBanned":false,"roleString":"Посетитель","roleIcon":"fa-user","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.987,"absoluteRating":6052,"dynamicRating":221.606,"dynamicRatingStars":7,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-05-06T04:32:02.6633647+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":2,"counters":{"daysAtPortal":2731,"questions":0,"questionsPosts":527,"questionsAnswers":250,"questionsPostsEvaluations":155,"forumPosts":0},"isRfproUserClass":true,"id":400669,"name":"epimkin","email":"","role":1,"registDate":"1000-01-01T00:00:00","lastDate":"2024-02-19T23:46:05","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":false},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-32 мин."},"isBanned":false,"roleString":"Посетитель","roleIcon":"fa-user","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"[i]С уважением[/i]\n[i]shvetski[/i]","signatureHTML":"\u003Ci\u003EС уважением\u003C/i\u003E\u003Cbr\u003E\u003Ci\u003Eshvetski\u003C/i\u003E","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.963,"absoluteRating":11493,"dynamicRating":200.879,"dynamicRatingStars":7,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-05-06T04:32:02.6635306+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":2,"counters":{"daysAtPortal":5721,"questions":35,"questionsPosts":1567,"questionsAnswers":588,"questionsPostsEvaluations":324,"forumPosts":44},"isRfproUserClass":true,"id":226425,"name":"Konstantin","email":"","role":1,"registDate":"1000-01-01T00:00:00","lastDate":"2024-05-04T19:58:35","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"red","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":false}]
Здравствуйте, Эксперты! Для учебной цели дали задание: Разработать программу, работающую в реальном режиме, располагающуюся в
загрузочном секторе носителя (дискета, usb-flash, жесткий диск) и
выполняющую операцию считывание заданных параметров и вывод на экран в
заданной форме с последующим вводом и установкой. Считывание и установка минут и секунд Формат считывания: Десятичный формат установки: Шестнадцатиричный
Это задание для процессора семейства x86 Использую компилятор FASM
В интернете нашел исходный код для загрузчика:
Код:
USE16 org 0x7C00 start: xor eax, eax xor esi, esi xor edi, edi mov ds, ax mov es, ax mov bp, 0x7c00 mov ax, 0x0003 int 0x10 mov si, msg_Load call print_string_16 jmp 0x0000:0x8000 print_string_16: pusha mov ah, 0x0E .repeat: lodsb cmp al, 0 je .done int 0x10 jmp short .repeat .done: popa ret
msg_Load db "Hello World!", 0
mov ah,0 int 16h
times 510-$+$$ db 0
sign dw 0xAA55
times 512-$+$$ db 0
Скомпилировалось нормально, появился файл bin
Теперь о возникших трудностях:
1) Как записать этот загрузчик на флешку и создать образ ISO для запуска
на виртуальной машине? Про флешку так толком ничего и не нашел, а по поводу образа, в интернете
я находил такое решение: "в WinImage создаю дискету на 1.44, далее выбираю опцию boot sector
properties и там открываю свой .bin файл. сохраняю как ima образ и
открываю его в CDBurnerXP. Далее - диск - загрузочные опции - сделать
диск загрузочным - указываю путь к ima и тип эмуляции ставлю 1.44.
сохраняю как ISO образ" Все сделал как написано, запускаю ISO на виртуальной машине VMware
player, вижу только черный экран и немигающий курсор в левом верхнем
углу.
2) Как считать и установить минуты и секунды в заданных в задании формате? Нашел такой исходник:
Код:
;---установка времени MOV CH,HOURS ;вводим значения времени MOV CL,MINUTES ; MOV DH,SECONDS ; MOV DL,HUNDREDTHS ; MOV AH,2DH ;номер функции установки времени INT 21H ;устанавливаем время CMP AH,0FFH ;проверяем правильность значения JE ERROR ;переход на обработку ошибки
;---получение времени MOV AH,2CH ;номер функции получения времени INT 21H ;получаем время MOV DAY_OF_WEEK,AH ;получаем день недели из AH
Не знаю, работает ли этот код, ведь я не могу проверить из-за того что не могу запустить мой загрузчик.
Второй код можно выбросить он для Вас бесполезен. Т.к. задание:
Насколько можно судить с задания, то Вы должны создать загрузочный образ для последующего запуска с него. В момент загрзки в памяти находится только BIOS и соответсвенно нужно пользоватся её функциями или работать на прямую с портами устройств. Ни о каких INT 21H неможет быть и речи, это функции DOS.
В MBR важна не только сигнатрура 0xAA55, там как минимум должна быть заполнена одна из четырех записей о диске, т.е. в 66-ти последних байтах должно быть заполнено как минимум 16-ть байт + 2 байта(0xAA55). BIOS их проверяет и только потом передает управление на 0x7C00.
Я смогу занятся Вашим вопросом только в понедельник, т.к. доступ в сеть ограничен.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Неизвестный
28.04.2013, 13:26
общий
Пока с MBR не особо понятно. Попробую разобраться. Спасибо!
Обратите внимание на признак активности раздела, BIOS при загрузке ищет в определенной позиции 0х80, а не только 0х55АА, и только тогда передает управление самому загрузчику.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Формируется не загрузочный диск, без активных разделов.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Неизвестный
29.04.2013, 13:11
общий
Здравствуйте, Константин Николаевич!
Если я правильно понял
Каждый раздел содержит:
Если все так, то тогда у меня такой вопрос: какие должны быть признаки активности разделов, если я пытаюсь загрузить что-то с флешки или с CD (с образа диска ISO)? Если правильно понял, то я должен определиться куда записывать мой загрузчик (имею ввиду на флешку или создавать образ CD), прежде чем мне задать код типа раздела. Еще вопрос, он так, для моего понимания, зачем задается сигнатура 55h AAh, если это константа и должна задаваться всегда?
Неизвестный
29.04.2013, 13:13
общий
Это наверное и есть причина почему был черный экран с немигающим курсором?
Сигнатура 0х55АА указывает, что данный сектор содержит в себе данные о разделах диска. Основную программу уже набросал: [code h=200]USE16 org 0x7C00 start: ; push cs push cs push cs pop ds pop es pop ss mov sp,7C00h ; mov ax,3h int 10h ; call GetTime mov si,dbMinutes call GetData mov [oldTime_M],al mov si,dbSeconds call GetData ;Int 1A/AH=03h ;SET REAL-TIME CLOCK TIME ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) mov dh,al; mov ch,[oldTime_H]; mov cl,[oldTime_S]; mov ah,03h; int 1Ah; ; call GetTime ; ; GetData: mov al,20h call OutMess xor di,di GData: xor ax,ax int 16h ; cmp al,13h; jz GD_Stop; cmp al,'0' jb GData; cmp al,'9' ja GData; ; push ax; mov ah,0Eh; mov bx,06; int 1Ah; pop ax; ; shl di,4; and al,0Fh; or di,ax; jmp short GData; ; GD_Stop: mov ax,di; ret ; GetTime: ; ;Int 1A/AH=02h ;GET REAL-TIME CLOCK TIME ;return: ;CF clear if successful ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) ;CF set on error (i.e. clock not running or in middle of update) mov ah,02h int 1Ah mov [oldTime_H],ch ; mov al,cl; call BCD2ASCII; mov [l_min],al; mov [h_min],ah; ; mov al,dl; call BCD2ASCII; mov [l_sec],al; mov [h_sec],ah; ; mov si,message; mov al,20h; call OutMess; ret ;
;sub-program ; BCD2ASCII: mov ah,al; shr al,4; call Num2Char; xchg ah,al; ; Num2Char: and al,0Fh; or al,30h; ret ; ; OutMess: ; ;Int 10/AH=0Eh ;VIDEO - TELETYPE OUTPUT ;input: ;AL = character to write ;BH = page number ;BL = foreground color mov ah,0Eh; mov bx,07h; int 10h lodsb or al,al jnz OutMess ret ; ; dbMinutes db 10,13,'Enter minutes:',0 dbSeconds db 10,13,'Enter seconds:',0 message db 10,13,'Time ' h_min db ? l_min db ?,':' h_sec db ? l_sec db ?,0 oldTime_H db ? oldTime_M db ? ;jmp 0x0000:0x8000
times 510-$+$$ db 0
sign dw 0xAA55
times 512-$+$$ db 0[/code] Сейчас займусь записью её на флоп и преобразованием его в загрузочный. Комментарии тоже позже.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Рабочий код вашего задания: [code h=200]USE16 org 0x7C00 start: ;адресуем сегментные регистры данных и стека push cs push cs push cs pop ds pop es;в программе не используется, так за компанию pop ss mov sp,7C00h ; ;Int 10/AH=00h ;SET VIDEO MODE ;AH = 00h ;AL = desired video mode ;необязательно, т.к. монитор уже находится в текстовом режиме mov ax,3h;вызываем функцию BIOS int 10h;так для приличия ;начало программы call GetTime;выводим текущее время ; mov si,dbMinutes;сообщение о вводе минут call GetData;вводим значение минут mov [oldTime_M],al;запоминаем значение введенных минут mov si,dbSeconds;сообщение о вводе секунд call GetData;вводим значение секунд mov dh,al;запоминаем секунды в регистре ; ;записываем новое значение минут и секунд ; ;Int 1A/AH=03h ;SET REAL-TIME CLOCK TIME ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) mov ch,[oldTime_H];востанавливаем старое значение часов mov cl,[oldTime_M];востанавливаем новое значение минут mov ah,03h;вызываем функцию BIOS int 1Ah ;выводим новое время call GetTime ;передаем упраление BIOS int 18h ;Подпрограммы: ; ;ввод числа GetData: mov al,20h;пробел для вывода call OutMess;выводим сообщение xor di,di;сбрасываем аккумуятор введенного числа GData: ; ;считываем символ с клавиатуры ; ;Int 16/AH=00h ;KEYBOARD - GET KEYSTROKE ;Return: ;AH = BIOS scan code ;AL = ASCII character xor ax,ax;вызываем функцию BIOS int 16h ; cmp al,13;клавиша "ENTER" jz GD_Stop;да заканчиваем ввод cmp al,'0';проверка минимальной границы jb GData;меньше-переходим cmp al,'9';проверка максимальной границы ja GData;больше-переходим push ax;сохраняем значение введенной цифры ; ;выводим символ на экран ; ;Int 10/AH=0Eh ;VIDEO - TELETYPE OUTPUT ;input: ;AL = character to write ;BH = page number ;BL = foreground color mov ah,0Eh;;вызываем функцию BIOS mov bx,07 int 10h pop ax;востанавливаем введенную цифру ; shl di,4;сдвигаем аккумулятор and ax,0Fh;получаем цифру or di,ax;суммируем jmp short GData;повторяем ввод цифры ; GD_Stop: mov ax,di;записываем результат п/программы ret;возврат из п/программы ; ;получаем текущее время GetTime: ; ;Int 1A/AH=02h ;GET REAL-TIME CLOCK TIME ;return: ;CF clear if successful ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) ;CF set on error (i.e. clock not running or in middle of update) mov ah,02h;вызываем функцию BIOS int 1Ah mov [oldTime_H],ch;запоминаем значение часов ; mov al,cl;начинаем с минут call BCD2ASCII;переводим BCD число в символ ASCII mov [l_min],al;запоминаем минуты mov [h_min],ah;запоминаем десятки минут ; mov al,dl;теперь секунды call BCD2ASCII;см. выше mov [l_sec],al mov [h_sec],ah ; mov si,message;сообщение о текущум времени в минутах и секундах mov al,20h;начальный пробел call OutMess;выводим сообщение ret;возврат из п/программы ; ;переводим BCD число в символ ASCII BCD2ASCII: mov ah,al;зоапминаем младшую часть числа shr al,4;сдвигаем старшую часть числа call Num2Char;вызываем п/пограмму xchg ah,al;меняем местами старшую и младшую части числа ; Num2Char: and al,0Fh;выделяем цифру or al,30h;переводим в символ ASCII ret;возврат из п/программы ; ;вывод сообщения как Си-строки OutMess: ;см. выше mov ah,0Eh;вызываем функцию BIOS mov bx,07h int 10h lodsb;считываем символ or al,al;проверяем на нулевое значение jnz OutMess;не ноль-переходим ret;возврат из п/программы ; ;данные программы dbMinutes db 10,13,'Enter minutes:',0 dbSeconds db 10,13,'Enter seconds:',0 message db 10,13,'Time ' h_min db ? l_min db ?,':' h_sec db ? l_sec db ?,0 oldTime_H db ? oldTime_M db ? ;jmp 0x0000:0x8000
times 510-$+$$ db 0
sign dw 0xAA55
times 512-$+$$ db 0[/code]
На дискету бинарный файл записывался с помощью программки: [code h=200]use16 org 100h start: mov ah,3Dh mov dx,dbName int 21h mov [dwHndl],ax ; mov bx,ax mov ah,3Fh mov dx,dbSector mov cx,512 int 21h ; mov ah,3Eh mov bx,[dwHndl] int 21h ; xor ax,ax int 13h xor ax,ax int 13h xor ax,ax int 13h ; mov ax,0301h mov bx,dbSector mov cx,1 mov dx,0 int 13h ; ret dbName db 'q187303.bin',0 dwHndl dw ? dbSector db 512 dup(?)[/code]
ps:всё писалось под FASM 1.67.26
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Оказалось, что вполне достаточно для BIOS сигнатуры 0xAA55, признак активности раздела используется только загрузчиками MBR.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Неизвестный
30.04.2013, 01:24
общий
03.05.2013, 19:41
Спасибо большое за код! Удалось записать загрузчик на флешку. Флешка работает только если с него загружаться, а сама оперционка ее прочитать не может... Файловую систему чтоль повредил...
Секунды, правда, не отображаются. Показывает все время 0, но я нашел ошибку
; mov al,dh;теперь секунды call BCD2ASCII;см. выше
приблизительно так, только тут не учитывается регистр нажимаемых клавиш, в коде только проверки прописные буквы, если будет интерестно, то по аналогии можете написать и проверку строчных букв. [code h=200]getnumber: xor di,di;сбрасываем аккумулятор mov bx,16;система счисления GN0: xor ax,ax int 16h cmp al,13;клавиша ENTER jz GN2 cmp al,'0' jb GN0 cmp al,'9' jbe GN1 cmp al,'A' jb GN0 cmp al,'F' ja GN0 GN1: push ax mov ah,0Eh mov bx,07 int 10h pop ax cmp al,'9';доп.проверка на НЕХТ код jbe GN2 sub al,7;коррекция числа GN2: and ax,0fh;получаем цифру xchg di,ax;меняем местами аккумулятор и введенное число xor dx,dx;сбрасываем старший регистр результата mul bx;умножаем на систему счисления add di,ax;суммируем в аккумуляторе новое число jmp short GN0 GN3: mov ax,di ret[/code]
Введение такого кода заставляет дополнительно заниматся подготовкой данных для функции BIOS, т.к. там на входе должен быть BCD-код.
Это всё потому, что не расписаны таблицы разделов, ОСь их не находит и пишет, что диск не форматирован, поврежден вирусом и т.д.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Да, сорри замотался, имено поэтому и писал в комментах полную информацию по функциям. ps: приятно помогать, когда не просто глотают код, а разбираются в нём.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Неизвестный
04.05.2013, 01:40
общий
04.05.2013, 19:37
Исправил в еще одном месте cmp al,13;клавиша ENTER jz GN3
Если ввести А, то выводит 07, В -> 0' ', C-> тоже непонятный символ 11 -> 08, 12 -> 09
Вот весь код [code h=200] USE16 org 0x7C00 start: ;адресуем сегментные регистры данных и стека push cs push cs push cs pop ds pop es;в программе не используется, так за компанию pop ss mov sp,7C00h ; ;Int 10/AH=00h ;SET VIDEO MODE ;AH = 00h ;AL = desired video mode ;необязательно, т.к. монитор уже находится в текстовом режиме mov ax,3h;вызываем функцию BIOS int 10h;так для приличия ;начало программы call GetTime;выводим текущее время ; mov si,dbMinutes;сообщение о вводе минут call GetData;вводим значение минут mov [oldTime_M],al;запоминаем значение введенных минут mov si,dbSeconds;сообщение о вводе секунд call GetData;вводим значение секунд mov dh,al;запоминаем секунды в регистре ; ;записываем новое значение минут и секунд ; ;Int 1A/AH=03h ;SET REAL-TIME CLOCK TIME ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) mov ch,[oldTime_H];востанавливаем старое значение часов mov cl,[oldTime_M];востанавливаем новое значение минут mov ah,03h;вызываем функцию BIOS int 1Ah ;выводим новое время call GetTime ;передаем упраление BIOS int 18h ;Подпрограммы: ; ;ввод числа GetData: mov al,20h;пробел для вывода call OutMess;выводим сообщение xor di,di;сбрасываем аккумуятор введенного числа mov bx,16;система счисления GData: ; ;считываем символ с клавиатуры ; ;Int 16/AH=00h ;KEYBOARD - GET KEYSTROKE ;Return: ;AH = BIOS scan code ;AL = ASCII character GN0: xor ax,ax int 16h cmp al,13;клавиша ENTER jz GN3 cmp al,'0' jb GN0 cmp al,'9' jbe GN1 cmp al,'A' jb GN0 cmp al,'F' ja GN0 GN1: push ax mov ah,0Eh mov bx,07 int 10h pop ax cmp al,'9';доп.проверка на НЕХТ код jbe GN2 sub al,7;коррекция числа GN2: and ax,0fh;получаем цифру xchg di,ax;меняем местами аккумулятор и введенное число xor dx,dx;сбрасываем старший регистр результата mul bx;умножаем на систему счисления add di,ax;суммируем в аккумуляторе новое число jmp short GN0 GN3: mov ax,di ret ; ;получаем текущее время GetTime: ; ;Int 1A/AH=02h ;GET REAL-TIME CLOCK TIME ;return: ;CF clear if successful ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) ;CF set on error (i.e. clock not running or in middle of update) mov ah,02h;вызываем функцию BIOS int 1Ah mov [oldTime_H],ch;запоминаем значение часов ; mov al,cl;начинаем с минут call BCD2ASCII;переводим BCD число в символ ASCII mov [l_min],al;запоминаем минуты mov [h_min],ah;запоминаем десятки минут ; mov al,dh;теперь секунды call BCD2ASCII;см. выше mov [l_sec],al mov [h_sec],ah ; mov si,message;сообщение о текущум времени в минутах и секундах mov al,20h;начальный пробел call OutMess;выводим сообщение ret;возврат из п/программы ; ;переводим BCD число в символ ASCII BCD2ASCII: mov ah,al;зоапминаем младшую часть числа shr al,4;сдвигаем старшую часть числа call Num2Char;вызываем п/пограмму xchg ah,al;меняем местами старшую и младшую части числа ; Num2Char: and al,0Fh;выделяем цифру or al,30h;переводим в символ ASCII ret;возврат из п/программы ; ;вывод сообщения как Си-строки OutMess: ;см. выше mov ah,0Eh;вызываем функцию BIOS mov bx,07h int 10h lodsb;считываем символ or al,al;проверяем на нулевое значение jnz OutMess;не ноль-переходим ret;возврат из п/программы ; ;данные программы dbMinutes db 10,13,'Enter minutes:',0 dbSeconds db 10,13,'Enter seconds:',0 message db 10,13,'Time ' h_min db ? l_min db ?,':' h_sec db ? l_sec db ?,0 oldTime_H db ? oldTime_M db ? ;jmp 0x0000:0x8000 times 510-$+$$ db 0 sign dw 0xAA55 times 512-$+$$ db 0 [/code]
Неизвестный
04.05.2013, 14:42
общий
Есть ли какой-нибудь отладчик, чтобы можно было пошагово контролировать изменения значения регистров. У меня только компилятором FASM и программой записи на флешку. Это первая программа на х86. Тяжело пока без отладчика представлять что происходит с регистрами
В коде меняется система счисления. Единственный выход использовать ещё не используемый регистр SI как указатель системы счисления, для этого нужно заменить его в строках: mov bx,16 mul bx
Отладчик в WINXP -debug.exe, запускается так(важные команды помечены):
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Обратите внимание на параметры команды LOAD, я загружал без них, а код под 0х0000:0х7С00. Можно сгенерировать простой СОМ-файл и тестировать без различных условий
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Неизвестный
04.05.2013, 20:20
общий
04.05.2013, 22:40
Теперь не вижу что ввожу, но те же результаты... Ниже сам код подпрограммы
[code h=200] GetData: mov al,20h;пробел для вывода call OutMess;выводим сообщение xor di,di;сбрасываем аккумуятор введенного числа mov bx,16;система счисления GData: GN0: xor ax,ax int 16h cmp al,13;клавиша ENTER jz GN3 cmp al,'0' jb GN0 cmp al,'9' jbe GN1 cmp al,'A' jb GN0 cmp al,'F' ja GN0 GN1: push ax mov ah,0Eh ; mov bx,07 mul bx int 10h pop ax cmp al,'9';доп.проверка на НЕХТ код jbe GN2 sub al,7;коррекция числа GN2: and ax,0fh;получаем цифру xchg di,ax;меняем местами аккумулятор и введенное число xor dx,dx;сбрасываем старший регистр результата mul bx;умножаем на систему счисления add di,ax;суммируем в аккумуляторе новое число jmp short GN0 GN3: mov ax,di ret [/code]
Вы меня несколько не правильно поняли, входной параметр-регистр функции
Код:
mov ah,0Eh mov bx,07;-------------- int 10h
Мы поменять не можем, т.к. он стандартный и не нами придуман. А вот использовать в качестве системы счисления другой регистр мы можем, я предлагал SI в каких строках его нужно было менять. Сейчас исправленный Ваш код с моим предложением ниже:
[code h=200]USE16 org 0x7C00 start: ;адресуем сегментные регистры данных и стека push cs push cs push cs pop ds pop es;в программе не используется, так за компанию pop ss mov sp,7C00h ; ;Int 10/AH=00h ;SET VIDEO MODE ;AH = 00h ;AL = desired video mode ;необязательно, т.к. монитор уже находится в текстовом режиме mov ax,3h;вызываем функцию BIOS int 10h;так для приличия ;начало программы call GetTime;выводим текущее время ; mov si,dbMinutes;сообщение о вводе минут call GetData;вводим значение минут mov [oldTime_M],al;запоминаем значение введенных минут mov si,dbSeconds;сообщение о вводе секунд call GetData;вводим значение секунд mov dh,al;запоминаем секунды в регистре ; ;записываем новое значение минут и секунд ; ;Int 1A/AH=03h ;SET REAL-TIME CLOCK TIME ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) mov ch,[oldTime_H];востанавливаем старое значение часов mov cl,[oldTime_M];востанавливаем новое значение минут mov ah,03h;вызываем функцию BIOS int 1Ah ;выводим новое время call GetTime ;передаем упраление BIOS int 18h ;Подпрограммы: ; ;ввод числа GetData: mov al,20h;пробел для вывода call OutMess;выводим сообщение xor di,di;сбрасываем аккумуятор введенного числа mov si,16;система счисления GData: ; ;считываем символ с клавиатуры ; ;Int 16/AH=00h ;KEYBOARD - GET KEYSTROKE ;Return: ;AH = BIOS scan code ;AL = ASCII character GN0: xor ax,ax int 16h cmp al,13;клавиша ENTER jz GN3 cmp al,'0' jb GN0 cmp al,'9' jbe GN1 cmp al,'A' jb GN0 cmp al,'F' ja GN0 GN1: push ax mov ah,0Eh mov bx,07 int 10h pop ax cmp al,'9';доп.проверка на НЕХТ код jbe GN2 sub al,7;коррекция числа GN2: and ax,0fh;получаем цифру xchg di,ax;меняем местами аккумулятор и введенное число xor dx,dx;сбрасываем старший регистр результата mul si;умножаем на систему счисления add di,ax;суммируем в аккумуляторе новое число jmp short GN0 GN3: mov ax,di ret ; ;получаем текущее время GetTime: ; ;Int 1A/AH=02h ;GET REAL-TIME CLOCK TIME ;return: ;CF clear if successful ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) ;CF set on error (i.e. clock not running or in middle of update) mov ah,02h;вызываем функцию BIOS int 1Ah mov [oldTime_H],ch;запоминаем значение часов ; mov al,cl;начинаем с минут call BCD2ASCII;переводим BCD число в символ ASCII mov [l_min],al;запоминаем минуты mov [h_min],ah;запоминаем десятки минут ; mov al,dh;теперь секунды call BCD2ASCII;см. выше mov [l_sec],al mov [h_sec],ah ; mov si,message;сообщение о текущум времени в минутах и секундах mov al,20h;начальный пробел call OutMess;выводим сообщение ret;возврат из п/программы ; ;переводим BCD число в символ ASCII BCD2ASCII: mov ah,al;зоапминаем младшую часть числа shr al,4;сдвигаем старшую часть числа call Num2Char;вызываем п/пограмму xchg ah,al;меняем местами старшую и младшую части числа ; Num2Char: and al,0Fh;выделяем цифру or al,30h;переводим в символ ASCII ret;возврат из п/программы ; ;вывод сообщения как Си-строки OutMess: ;см. выше mov ah,0Eh;вызываем функцию BIOS mov bx,07h int 10h lodsb;считываем символ or al,al;проверяем на нулевое значение jnz OutMess;не ноль-переходим ret;возврат из п/программы ; ;данные программы dbMinutes db 10,13,'Enter minutes:',0 dbSeconds db 10,13,'Enter seconds:',0 message db 10,13,'Time ' h_min db ? l_min db ?,':' h_sec db ? l_sec db ?,0 oldTime_H db ? oldTime_M db ? ;jmp 0x0000:0x8000 times 510-$+$$ db 0 sign dw 0xAA55 times 512-$+$$ db 0[/code]
Это основная беда дебугеров реального времени. Начинайте обрастать полезными ссылками, к примеру как эта Всякая всячина, но есть и кое-что полезное... В составе пакета Turbo Assembler 4.1 есть программка TD(Turbo Debuger). Проблема останется(ввод данных на экране дебугера), но засчет световой разкраски самого дебугера Вы свои вводимые данные увидете на черных полях.
Можно ещё какбы эмулировать вводимые значения задавая нужные значения и проверять порегистровую обработку.
ps:Смотрите над полем ввода сообщений есть есть выпадающий список"КОМУ", адресуйте сообщения мне.
Лысков Игорь Витальевич, как администратор рассылки получает уведомления о всех сообщениях(именные и безимянные) в его рассылках, а также сами безимянные. Т.е. о Ваших сообщениях он узнает дважды.
и ещё в теге [ cоde ][ /code ] добавляйте параметр h=200 или 300, т.е примерно так [ cоde h=200] [ /code ] тогда, чтобы добратся до последнего сообщения не нужно проматывать долго всесь экран.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
На скорую руку могу предложить ещё один отладчик из пакета masm611-613.zip (6.15 Mб), скачайте и установите его, на все вопросы отвечайте "ДА",Вам нужно будет только указать путь к папке BIN, уменя сейчас на этом РС такой адрес D:\Cat\Lang\MASM61\BIN(синим мои дополнения от стандартного запроса), в конце появится список установки, выбираете без изменений и всё. отладчик CV.EXE(CodeView) ps: с MASM'om и TASM'om работать нужно из командной строки.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Неизвестный
05.05.2013, 00:20
общий
05.05.2013, 00:21
Адресаты:
Теперь вижу что ввожу, но работает все же неправильно... Ввожу А минут и 1А секунд, по идее, должен после ввода вывести 10 минут и 26 секунд, а показывает 0 минут и 0; секунд... Может надо переводить в BCD?
Да, к примеру так, сразу предупреждаю, писалось без проверки:
Код:
hext2BCD: ;input: ax HEXT code ;output: ax BCD code xor cx,cx mov si,10;тут была ошибка: 10 а не 16 H2B: xor dx,dx div si inc cx push dx or ax,ax jnz H2B ; ; B2H: shl ax,4 pop dx or ax,dx loop B2H ret
Но должно быть что-то похожее.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Неизвестный
05.05.2013, 01:27
общий
Адресаты:
Спасибо большое! Все, наконец, заработало. Осталось только разобраться что к чему. Если писать ту же программу, но в защищенном режиме, то программа сильно будет отличаться?
Конечно. Если условия останутся теже(запускать с дискеты, флешки и т.д.) то практически это будет полноценная ОСь. 1)переход из реального в защиту (настройка GDT, LDT и т.д.), изменяется адресация физической памяти-страничная 2)работа на уровне портов с железом, т.е. для всего Вам нужно будет писать исключения, даже для таймера часов. 3)сам защищенный режим в литературе описан плохо, в различных книгах встречаются примеры построенные по одной схеме: реальный режим - подготовка - "приг в защиту", что-то сделали, "приг обратно". Более длительное нахождение в "защите" описано в книгах по ОСям, но как теория без конкретики.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
В приложении компиляция ответа из мини-форума. Удачи!
Приложение: USE16 org 0x7C00 start: ;адресуем сегментные регистры данных и стека push cs push cs push cs pop ds pop es;в программе не используется, так за компанию pop ss mov sp,7C00h ; ;Int 10/AH=00h ;SET VIDEO MODE ;AH = 00h ;AL = desired video mode ;необязательно, т.к. монитор уже находится в текстовом режиме mov ax,3h;вызываем функцию BIOS int 10h;так для приличия ;начало программы call GetTime;выводим текущее время ; mov si,dbMinutes;сообщение о вводе минут call GetData;вводим значение минут mov [oldTime_M],al;запоминаем значение введенных минут mov si,dbSeconds;сообщение о вводе секунд call GetData;вводим значение секунд mov dh,al;запоминаем секунды в регистре ; ;записываем новое значение минут и секунд ; ;Int 1A/AH=03h ;SET REAL-TIME CLOCK TIME ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) mov ch,[oldTime_H];востанавливаем старое значение часов mov cl,[oldTime_M];востанавливаем новое значение минут mov ah,03h;вызываем функцию BIOS int 1Ah ;выводим новое время call GetTime ;передаем упраление BIOS int 18h ;Подпрограммы: ; ;ввод числа GetData: mov al,20h;пробел для вывода call OutMess;выводим сообщение xor di,di;сбрасываем аккумуятор введенного числа mov si,16;система счисления GData: ; ;считываем символ с клавиатуры ; ;Int 16/AH=00h ;KEYBOARD - GET KEYSTROKE ;Return: ;AH = BIOS scan code ;AL = ASCII character GN0: xor ax,ax int 16h cmp al,13;клавиша ENTER jz GN3 cmp al,'0' jb GN0 cmp al,'9' jbe GN1 cmp al,'A' jb GN0 cmp al,'F' ja GN0 GN1: push ax mov ah,0Eh mov bx,07 int 10h pop ax cmp al,'9';доп.проверка на НЕХТ код jbe GN2 sub al,7;коррекция числа GN2: and ax,0fh;получаем цифру xchg di,ax;меняем местами аккумулятор и введенное число xor dx,dx;сбрасываем старший регистр результата mul si;умножаем на систему счисления add di,ax;суммируем в аккумуляторе новое число jmp short GN0 GN3: mov ax,di mov si,10;система счисления xor cx,cx:счетчик цифр GN4: xor dx,dx div si;получаем последнюю цифру push dx;сохраняем её в стеке inc cx;увеличиваем счетчик цифр числа or ax,ax;пока не ноль jnz GN4 GN5: shl ax,4:сдвигаем на 4-е позиции pop dx;востанавливаем из стека or ax,dx;"суммируем" loop GN5;пока есть цифры ret ; ;получаем текущее время GetTime: ; ;Int 1A/AH=02h ;GET REAL-TIME CLOCK TIME ;return: ;CF clear if successful ;CH = hour (BCD) ;CL = minutes (BCD) ;DH = seconds (BCD) ;DL = daylight savings flag (00h standard time, 01h daylight time) ;CF set on error (i.e. clock not running or in middle of update) mov ah,02h;вызываем функцию BIOS int 1Ah mov [oldTime_H],ch;запоминаем значение часов ; mov al,cl;начинаем с минут call BCD2ASCII;переводим BCD число в символ ASCII mov [l_min],al;запоминаем минуты mov [h_min],ah;запоминаем десятки минут ; mov al,dh;теперь секунды call BCD2ASCII;см. выше mov [l_sec],al mov [h_sec],ah ; mov si,message;сообщение о текущум времени в минутах и секундах mov al,20h;начальный пробел call OutMess;выводим сообщение ret;возврат из п/программы ; ;переводим BCD число в символ ASCII BCD2ASCII: mov ah,al;зоапминаем младшую часть числа shr al,4;сдвигаем старшую часть числа call Num2Char;вызываем п/пограмму xchg ah,al;меняем местами старшую и младшую части числа ; Num2Char: and al,0Fh;выделяем цифру or al,30h;переводим в символ ASCII ret;возврат из п/программы ; ;вывод сообщения как Си-строки OutMess: ;см. выше mov ah,0Eh;вызываем функцию BIOS mov bx,07h int 10h lodsb;считываем символ or al,al;проверяем на нулевое значение jnz OutMess;не ноль-переходим ret;возврат из п/программы ; ;данные программы dbMinutes db 10,13,'Enter minutes:',0 dbSeconds db 10,13,'Enter seconds:',0 message db 10,13,'Time ' h_min db ? l_min db ?,':' h_sec db ? l_sec db ?,0 oldTime_H db ? oldTime_M db ? times 510-$+$$ db 0 sign dw 0xAA55 times 512-$+$$ db 0
5
Спасибо за помощь! Можно многому научиться
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
Форма ответа
Отправка постов/ответов доступна только зарегистрированным и подтвержденным пользователям.
{"canUserNotesAccess":false,"canUserAdminsNotesAccess":false,"canAskQuestion":false,"canEditQuestions":false,"canSeeQuestionsComplains":false,"isSuperAdmin":false,"isAdmin":false,"isModer":false,"canCreateNewUser":false,"canConfirmUser":false,"canEditUserName":false,"canEditUserRole":false,"canEditUserEmail":false,"canEditUserPhone":false,"canEditUserBirthdate":false,"canEditUserCountry":false,"canEditSocialMedia":false,"canDeleteUserPhoto":false,"canDeleteUser":false,"canEditUserAbout":false,"canBanUser":false,"canResetUserPassword":false,"canEditRegistDate":false,"canChangeUserRating":false,"canAccessToAdmin":false,"canAnnouncements":false,"canManageQuestionPosts":false,"canManageForumSections":false,"canManageForumThreads":false,"canManageForumPosts":false,"canCreateForumThreads":false,"canSeeUserEmail":false,"canSeeUserPhone":false,"canSeeIPAddress":false,"canSeeUserRegistDate":false,"canSeeUserSocialMedia":false,"canSeeBirthDate":false,"canSeeUserCountry":false,"canSeeUserSettings":false,"canSeeDeletedPosts":false,"isEmailConfirmed":false,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":0,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-32 мин."},"isBanned":false,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":0,"absoluteRating":0,"dynamicRating":0,"dynamicRatingStars":0,"timezone":{"id":283,"baseUtcOffset":"03:00:00","displayName":"(UTC\u002B03:00) Москва","linuxid":"Europe/Moscow"},"currentDateTime":"2024-05-06T07:32:02.6642593+03:00","isValid":false,"isUnconfirmed":true,"isConfirmed":false,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":1,"counters":{"daysAtPortal":0,"questions":0,"questionsPosts":0,"questionsAnswers":0,"questionsPostsEvaluations":0,"forumPosts":0},"isRfproUserClass":true,"id":0,"name":"Неизвестный","email":"","role":0,"registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":false,"isNewUser":false,"isExisted":false,"isExpert":false}