Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 728
от 22.05.2004, 20:30
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 5312 Отправлено ответов: 14637 Активность: 275.5 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Foamplast Статус: Профессиональный Общий рейтинг: 151.25 URL: мой личный сайт [Подробней >>] |
Стас Статус: Доверительный Общий рейтинг: 129.57 [Подробней >>] |
resu Статус: Начальный Общий рейтинг: 106.29 [Подробней >>] |
Евгений Иванов Статус: Профессиональный Общий рейтинг: 133.74 URL: Super Assembler Software Телефон: НСС +7 831 3107039 [Подробней >>] |
Dragoon Статус: Начальный Общий рейтинг: 108.72 [Подробней >>] |
_vt Статус: Профессиональный Общий рейтинг: 118.63 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 116.55 [Подробней >>] |
Pawel Статус: Профессиональный Общий рейтинг: 155.15 [Подробней >>] |
VOVAN Статус: Опытный Общий рейтинг: 105.65 [Подробней >>] |
Artemy Статус: Опытный Общий рейтинг: 111.79 Телефон: 8 905 549 38 66 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 5286. Здравствуйте! Напишите ,пожалуйста, алгоритм перевода числа в шеснадцатеричном формате в регистре al... (ответов: 5)
Вопрос № 5287. Brokensword пробей IP 217.174.98.164, возможно прокси-сервер ЖДУ... (ответов: 2)
Вопрос № 5288. Привет Эксперты: Не могли бы Вы объяснить на примере, что такое мантисса и представление чисел с фи... (ответов: 1)
Вопрос № 5289. Как под XP прочитать данные из параллельного потра LPT1. Пока получается только для win9Х, да и то п... (ответов: 2)
Вопрос № 5290. Уважаемые эксперты Вот тут проблема: препод задал РГЗ – а у нас никто и малейшего представления не ... (ответов: 1)
Вопрос № 5291. Здраствуйте. Как я понял на fasm'е можно писать программы для Intel 80х86. Т.е. это значит, что про... (ответов: 5)
Вопрос № 5292. Здравствуйте! Подскажите пожалуйта: Я рассматривал пример из книги и там в программе был такой кусо... (ответов: 9)
Вопросов: 7, ответов: 25
Вопрос № 5286 |
Здравствуйте!
Напишите ,пожалуйста, алгоритм перевода числа в шеснадцатеричном формате в регистре al в десятичное число.
С ув.
Роберт
Вопрос отправлен: 16.05.2004, 19:31
Отправитель: Robert
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Добрый день, Robert!
Компьютер всё хранит в двоичной системе! Может быть, Вы имели ввиду "перевести число, находящееся в регистре в десятичную строку"?
Посмотрите архив рассылки, этот вопрос часто задают и на него уже есть масса хороших ответов.
Ответ отправлен: 18.05.2004, 23:44
Отправитель: Foamplast
Отвечает Стас
Наконец-то, Robert!
У меня уже неделю лежит твоя прога, (вопрос 5205, 5235).
В ней я показал, что можно обойтись без Int9, и чуть доделал. Кстати там есть и вывод пятизначного (65536) десятичного числа из AX.
А ошибки были такие:
1) Когда берешь в EAX из old_int9 значение DS указывает не туда, ты его изменил для восстановления Int1C.
2) Опять, там же, ES указывает на B800 (через него ты выводил на экран), а ты пытаешся по нему восстановить Int9.
3) В обработчике Int1C ты уже сходил по его старому вектору, там сделали mov al,20h;out 20h,al тебе этого повторно делать не надо.
4) Зачем-то используешь дальние процедуры(Far), когда все находится в одном сегменте.
Приложение:
Ответ отправлен: 16.05.2004, 22:30
Отправитель: Стас
Отвечает resu
Приветствую Вас, Robert!
См книгу Зубкова С.В. "Ассемблер для Dos, Windows и UNIX"!
Ответ отправлен: 16.05.2004, 20:13
Отправитель: resu
Отвечает Евгений Иванов
Приветствую Вас, Robert!
См. архив и rusfaq.faq на сайте Калайджана.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 17.05.2004, 00:20
Отправитель: Евгений Иванов
Отвечает Dragoon
Добрый день, Robert!
Не пониманию смысла. Зачем тебе это надо?!
Ты можешь с ним работать как с десятнеричным числом без перевода. Все равно, при ассемблировании все числа переводятся в шестнадцатириные.
Ответ отправлен: 20.05.2004, 16:02
Отправитель: Dragoon
Вопрос № 5287 |
Brokensword пробей IP 217.174.98.164, возможно прокси-сервер ЖДУ
Вопрос отправлен: 16.05.2004, 23:39
Отправитель: Монах (supersupra@yandex.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Здравствуйте, Монах!
Жди, жди - не дождешься! ;)
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 20.05.2004, 08:00
Отправитель: _vt
Отвечает Foamplast
Доброе время суток, Монах!
Пробил раз. Пробил два. Хотел в третий раз, но итак всё уже разворотил.
Ответ отправлен: 20.05.2004, 00:37
Отправитель: Foamplast
Вопрос № 5288 |
Привет Эксперты:
Не могли бы Вы объяснить на примере, что такое мантисса и представление чисел с фиксированной и плавающей запятой. Заранее благодарен!
Вопрос отправлен: 17.05.2004, 02:11
Отправитель: oscar
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Доброе время суток, oscar!
Ну вот смотри. Пусть есть число A. Его можно записать в виде: A = M * 10 ^ K. Например, 121 = 1,21 * 10 ^ 2.
Тогда M - это мантисса, а K - показатель.
Причем вся эта запись называется представлением числа с плавающей запятой, т.к. положение запятой не фиксировано, а зависит от конкретных значений M и K.
Представление же с фиксированной запятой подразумевает точное выделение положения запятой в записи числа. Причем в обычной жизни запятая физически указывается: 0,0; 21,75 и т.п., а в программировании выделяется место для отображения целой и дробной частей. Соответственно, запятая указывается неявно в этом месте.
Ответ отправлен: 17.05.2004, 16:49
Отправитель: Ayl
Вопрос № 5289 |
Как под XP прочитать данные из параллельного потра LPT1. Пока получается только для win9Х, да и то почему-то не на любом компьютере работает.
Вопрос отправлен: 17.05.2004, 17:31
Отправитель: Oleg
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Добрый день, Oleg!
Вроде бы CreateFile() - ReadFile() - CloseHandle(). Ну и SetCommMask() с WaitCommEvent() тоже можно использовать.
Приложение:
Ответ отправлен: 21.05.2004, 08:42
Отправитель: Foamplast
Отвечает Евгений Иванов
Доброе время суток, Oleg!
Для этого нужна библиотека-драйвер
URL http://www.hasw.net/8rdavcore/giveio.zip
Удалять его этой программой:
URL http://www.hasw.net/8rdavcore/remove-giveio.zip
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 19.05.2004, 00:49
Отправитель: Евгений Иванов
Вопрос № 5290 |
Уважаемые эксперты
Вот тут проблема: препод задал РГЗ – а у нас никто и малейшего представления не имеет как его делать… Может кто посоветует с чего начать или какую-нибудь литературу по этому поводу(можно на мыло)…
Заранее благодарен…
Тема: «Разработка структурной схемы и алгоритма работы процессора и арифметического устройства в соответствии с заданной системой команд, объемом памяти и разрядностью системной шины»
Задание должно быть выполнено в виде графической части и пояснительной записки.
Объем оперативной памяти 1 Мб Разрядность процессора и системной шины 32
Система команд :
ADC
LEA
IMUL
Команды должны быть представлены во всех возможных форматах. Должны присутствовать все аппаратные средства, необходимые для выполнения команд. Способы адресации выбираются в зависимости от разрядной шины и объема памяти.
Вопрос отправлен: 17.05.2004, 22:32
Отправитель: sad (mudvayne@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Здравствуйте, sad!
Здесь, похоже, то, что Вам нужно.
http://bochs.sourceforge.net/
Ответ отправлен: 21.05.2004, 08:47
Отправитель: Foamplast
Вопрос № 5291 |
Здраствуйте.
Как я понял на fasm'е можно писать программы для Intel 80х86.
Т.е. это значит, что программа, написанная на fasm'e,будет работать на любой ОС(которая подддерживат проц Intel), т.е. в Windows,Linux,MINIX и т.д.(кстати как насчет QNX).
Но тогда придется отказатся от виндовых API и писать по-другому - т.е. с помощью прерываний, так?
Да и еще, нужны ли будут тогда строки типа:
include user32.inc
include kernel32.inc(ну или что-то подобное)
...
и т.д.
Вопрос отправлен: 18.05.2004, 12:46
Отправитель: Семен
[Следующий вопрос >>] [Список вопросов]
Отвечает Pawel
Приветствую Вас, Семен!
Ты не прав. RTFM.
Fasm может компилировать программы для разных платформ(win, linux, и др).
Ответ отправлен: 19.05.2004, 19:35
Отправитель: Pawel
Отвечает Стас
Здравствуйте, Семен!
Для Intel80x86 можно писать и на TASM и на FASM и на MASM.
А вот сделать программу которая одинаково работает и под DOS и под Windows и под UNIX вряд-ли получится.
Для DOS и Windows еще ладно один производитель Мелкософт многое одинаково или вообще унаследовано. А Unix подобные вообще постороены по разному. А файловые сиcтемы? Их вообще великое множество.
Вообщем не стоит оно того. Даже и писать для 8086-80286 смысла нет.
А user32.inc,kernel32.inc это только для Win32, содержат описания различных констант кокретной операционной системы.
Для других систем нужны естественно другие. И название у них будет другое и содержание.
Ответ отправлен: 18.05.2004, 15:55
Отправитель: Стас
Отвечает _vt
Добрый день, Семен!
Для того, чтобы программа работала в любой операционной системе, в ней должны быть директива условного компилирования например:
.ifdef WIN32
include windows.inc //заголовочные файлы, и пр. специфичные для этой среды параметры
... // код для Win32-систем (вызов WinAPI и пр.)
.ifdef MSDOS
... // код для DOS-систем (вызов прерываний, прямой доступ к памяти, портам и пр.)
.ifdef LINUX
... // код для Linux
Если выбранный тобой ассемблер имеет возможности условного компилирования, то на нем можно написать программу, собирающуюся под любую нужную тебе ОС. В FASM это как раз хорошо реализовано.
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 20.05.2004, 08:01
Отправитель: _vt
Отвечает Евгений Иванов
Доброе время суток, Семен!
Пиши алгоритм, а уж взаимодействие с системой - другой вопрос.
Ты можешь сам всё сделать - работать на низком уровне: через порты и т.п.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 19.05.2004, 00:49
Отправитель: Евгений Иванов
Отвечает Foamplast
Здравствуйте, Семен!
... написанная на fasm'e,будет работать на любой ОС - да, если программа написана для этой ОС и оформлена соответствующим образом, см. ниже.
... писать по-другому - т.е. с помощью прерываний, так? ... - в некотором смысле так. То есть в том смысле, что под Windows и Linux без прерываний не обойтись, вопрос в том, кому достанется их вызывать - коду прикладного процесса или библиотекам.
Разъяснения
Что в сущности делают программы? Чего-нибудь там себе вычисляют, а затем производят ввод или вывод. Методы ввод-вывода различны: работа с командной строкой, консолью, чтение/запись на диск, просьба к системе нарисовать окошко, послать сообщение процессу; получение информации от клавиатуры, джойстика; рисование страшных монстров на экране - всего не перечесть. В древности программы осуществляли часть ввода-вывода непосредственно, через порты ввода-вывода (или работу с некоторыми участками памяти, так устроено общение с видеоплатой в ДОС - вспомните про видеопямять). Затем люди осознали, что почти все программы либо пишут на экран, либо читают с клавиатуры, либо пишут/читают диски и т.п. Все эти общие действия стали выполнять операционные системы. Эта их функция представления удобного доступа к аппаратным средствам называется "ОС как расширенная машина".
Действия, которые ОС может выполнить по заказу, называются "системные вызовы". Для того, чтобы ОС выполнила какую-либо операцию, её надо об этом "попросить". Это может быть сделано различными способами. На ситемах типа х86 эти способы таковы:
- выполнить команду Call, указав любой адрес и селектор, указывающий на дескриптор шлюза вызова системы. (Solaris, FreBSD и другие строгие системы)
- выполнить команду Jmp, указав любой адрес и селектор, указывающий на дескриптор шлюза вызова системы.
- выполнить команду Int, указав номер прерывания, обрабатываемого системой. (Windows, Linux и вообще все, кто борется за эффективность)
- вызвать библиотечную функцию, а она пусть что хочет, то и делает. (возможно в любой системе)
Как можно догадаться, чаще всего поступают последним образом. Теперь о Windows API. Так как создатели ОС "Виндовс" предполагали совместимость с DOS, OS/2 и UNIX, то создали следующую систему:
|
|
|
| ||
|
|
| |||
|
|
| |||
|
|
|
Как видно из приведённой схемы, работая под "Виндовс", программы производят не системные вызовы, а обращения к подсистемам. Подсистемы - это набор разделяемых библиотек. Подсистема Win32 образована 3 основными библиотеками: kernel32.dll, user32.dll и gdi32.dll (уже знакомо? :). Хотя я лично никогда не сталкивался с прецендентами работы программ, написанных для полуоси под "Виндовс", соответствующая подсистема имеется. То же касается и подсистемы POSIX - она действительно есть. Такое устройство ОС позволяет разработчикам сохранять набор функций, представляемых подсистемами (функции подсистемы Win32 называются Windows API), а сами системные вызовы менять от версии к версии.
Теперь возникает вопрос, если программа написана для определённой подсистемы, или вообще для совершенно другой ОС, то как Windows узнает об этом? Ответ таков: в современный операционных системах исполняемый файл представляет собой не просто кусок кода (как это было в CP/M - MS-DOS: вспомните .com-файлы), он имеет заголовок. Первые байты файла говорят о его формате. Файлы для ДОС и "Виндовс" должны начинаться с MZ или ZM. Далее следует остальной заголовок (заголовки, их бывает несколько). Это выглядит примерно так:
Волшебное число (MZ для "Виндовс") |
... |
размер стека |
размер кода |
размер данных |
требуемый процессор |
требуемая подсистема |
... |
код |
данные |
ресурсы |
То есть, как мы видим, кроме кода и данных в исполняемых файлах для современных ОС есть заголовки, рассказывающие о файле, с чем его едят. Если заголовок неправилен (например, длина файла 4 Кб, а размер ресурсов указан в 15 Мб), то система откажется запускать файл. Естественно, система также откажется запускать файл если не сможет вообще опознать заголовок. Например, если вместо MZ будет что-либо другое, то "Виндовс" подумает, что это .com-файл. Файлы для Menuet OS должны начинаться со слов MENUET, иначе она не станет этот файл считать исполяемым.
ВыводыДля того, чтобы программа заработала под конкретной системой, необходимо, чтобы её исполняемый файл был оформлен строго определённым образом (включал соответствующие заголовки), и она использовала Интерфейс Прикладного Программирования (API) этой ОС (то есть вызывала функции из библиотек для Windows и UNIX, выполняла команду Int в Menuet OS).
Первую задачу поможет решить сам FASM - он для того и сделан, чтобы создавать исполнимые файлы по вкусу. Понадобится только описание формата для соответствующей ОС. А вот описания системных вызовов доступны не для всех ОС (кто знает вызовы "Виндовс"?). Решение простое: ведь под "Виндовс" мы чаще всего вызываем библиотки, а не сами вызовы - значит, можно написать на FASM программу, ассемблировать её в объектный файл, а остальное пусть делает компоновщик (по англ. linker). Если же есть описание системных вызовов, то можно ассемблировать FASM'ом сразу в исполняемый файл.
Ответ отправлен: 21.05.2004, 19:37
Отправитель: Foamplast
Вопрос № 5292 |
Здравствуйте!
Подскажите пожалуйта:
Я рассматривал пример из книги и там в программе был такой кусок. Зачем здесь по ставлен short и почему в одно место он имеется а в другом нет?
main_loop:
...
jmp short main_loop ;Эта ближе к метке
...
jna main_loop ;эта команда находится дальше
;к метке
...
И если можно, то подскажите что по сути означает byte ptr адрес, т.е. это считывает значения по адресу?
С уважением, Александр
Вопрос отправлен: 18.05.2004, 20:23
Отправитель: Alexander
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Приветствую Вас, Alexander!
Переходы бывают короткими (short), ближними (near) и дальними (far). Короткий переход может быть выполнен только на расстояние от -128 до +127 байт от текущего значения указателя команд IP. Все условные переходы являются ближними, поэтому часто при проверке условий приходится заменять один переход на два:
вместо, например, jz @@Metka приходится писать так:
jnz @@Cont
jmp @@Metka
@@Cont:
Безусловные переходы (jmp) являются по умолчанию близкими, поэтому чтобы сгенерировать более компактный код, надо ыявно указать короткий переход (jmp short). В твоем случае мы имеем именно такой случай.
Ну и насчет byte ptr. Это просто указание компилятору, что обращение производится к байтовой величине. Например:
mov byte ptr [si], 8
В этой команде используется индексная адресация к памяти, причем из контекста нельзя определить, какая размерность операндов используется в команде. Сравни такие строки:
mov byte ptr [si], 8
mov word ptr [si], 8
mov dword ptr [si], 8
Если написать просто mov [si], 8, то компилятор не сможет правильно сгенерировать команду, т.к. при этом возможен любой из приведенных вариантов.
А, например, такой код:
mov al, 8
mov [si], al
не потребует дополнительной информации о размерности операндов, т.к. она следует из контекста (регистр al подразумевает байтовый размер операндов).
Ответ отправлен: 19.05.2004, 11:29
Отправитель: Ayl
Отвечает _vt
Доброе время суток, Alexander!
short - директива ассемблеру, чтобы он использовал машинный код короткого перехода (в пределах -127..+128 байт). Во многих современных ассемблерах неиспользуется за ненадобностью - он сам решит, нужен короткий или длинный переход.
byte ptr - директива размерности, показывает, что ты осмысленно пытаешься прочитать один байт из переменной, длиной в слово и наоборот.
Например,
var dw ?
...
mov ah, var // Ошибка!
mov ah, byte ptr var // Так будет верно.
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 20.05.2004, 08:01
Отправитель: _vt
Отвечает VOVAN
Приветствую Вас, Alexander!
jmp short - ближний прыжок куда-либо (в пределах 1 сегмента, если до команды на которую прыгаем меньше 128 байт) на один байт короче, чем без short.
byte ptr означает, что операция будет с одним байтом памяти. если не ставить, то по умолчанию операция будет с двумя байтами (словом). Считывать или сравнивать значение байта за висит от команды. Чтобы считать надо юзать команду mov/
Ответ отправлен: 18.05.2004, 22:22
Отправитель: VOVAN
Отвечает Pawel
Добрый день, Alexander!
short прыжок- это прыжок в пределах 128б.
Ответ отправлен: 19.05.2004, 19:36
Отправитель: Pawel
Отвечает Artemy
Приветствую Вас, Alexander!
Вообще ТАСМ, да и МАСМ тоже сам узнает какой из JMP-ов short а какой нет.
Инструкция short говорит о том, что переход короткий, и занимает инструкция 2 байта, а простой (длинный) JMP - 3 байта, это в режиме .286 в пределах одного сегмента.
Ответ отправлен: 19.05.2004, 11:22
Отправитель: Artemy
Отвечает Foamplast
Приветствую Вас, Alexander!
У Вас же в комментарии написано: "ближе к метке, дальше к метке". Дело в том, что в наборе команд процессоров 80х86 существуют три типа переходов: короткий ближний и дальний. Переход называется коротким, если адрес перехода находится в пределах [-127;+ 128] байт от команды Jmp. Ближним - если адрес находится в том же сегменте, что и Jmp. Дальний переход осуществляется с указанием сегмента и адреса перехода в нём. Легко заметить, что в защищённом режиме ближний переход может быть осуществлён на любой адрес программы. Дальний переход в защищённом режиме применяется только для передачи управления операционной системе или переключения задач.
Есть ассемблеры, которые при отсутствии указания типа перехода вычисляют расстояние до адреса и создают кратчайшую форму (short) перехода везде, где это возможно (FASM). А есть ассемблеры, которым если не указать, что переход может быть коротким, сделают ближний переход (NASM). Поэтому для них, если адрес перехода находится близко, его тип указывают явно.
Ответ отправлен: 22.05.2004, 15:14
Отправитель: Foamplast
Отвечает Стас
Добрый день, Alexander!
Near означает близко, ставится чтобы уменьшить размер кода (JMP near-2 байта), но может быть не дальше +-127 байт (для 16 битной адресации).
Во втором случае вероятно JMP near не достает до метки, поэтому стоит просто JMP(3 байта).
Byte ptr означает "указатель на байт". Ставится когда нужно указать явно что речь идет о байте (Word о слове, DWord о двойном слове, кстати у разных процессоров размер слова может быть различным, в отличие от байта).
Т.е. например:
mov [dx],al - понятно что речь идет о байте (размер AL)
mov [dx],0 - а тут без "byte ptr" не обойтись 0 может быть и байтом и словом и двойным словом.
Ответ отправлен: 19.05.2004, 00:43
Отправитель: Стас
Отвечает Евгений Иванов
Добрый день, Alexander!
Short - указывает для метки, чтобы для машинного кода она была короткой - код EB и ещё один байт в качестве знакового указания, куда переходить, назад или вперёд. Всего на 128 байт можно изменять IP. Если же не короткая, то код будет E9, по моему. И уже два байта. То есть, на 32768 байт можно изменять указатель команд. Если же расстояние большое, то он укажет, что Short не верен (будет ошибка). А вообще ставь >2 проходов при ассемблировании и он потом оптимизирует jmp - изменит на короткий. Так что проблем нет.
Хотя он вроде оставляет NOP...
=======
BYTE PTR - указывает, что значени по адресу - байт.
Byte pointer.
Или указывает, что ты будешь записывать значение байт.
mov [byte ptr esi],90h
mov [esi],byte ptr 128
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 19.05.2004, 00:49
Отправитель: Евгений Иванов
Отвечает Dragoon
Приветствую Вас, Alexander!
Jmp short занимает на 1 байт меньше чем без него.
Byte ptr указывает, что надо работать с 1 байтом.
Ответ отправлен: 20.05.2004, 16:05
Отправитель: Dragoon
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (24) C / C++ (14) Perl (2) Builder / Delphi (14) Pascal (19) Basic / VBA (2) Java / JavaScript (4) PHP (12) Криптография (5) WinAPI (7) Радиоэлектроника (5) |
Пользователю Windows 95/98/Me (35) Windows NT/2000/XP (48) "Железо" (28) Поиск информации (16) |
Администратору Windows NT/2000/XP (24) Linux / Unix (9) |
Юристу Гражданское право (9) Семейное право (7) Трудовое право (8) КоАП (6) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||