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

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


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

Лучшие эксперты в разделе

Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »
cain52
Статус: 3-й класс
Рейтинг: 0
∙ повысить рейтинг »

Assembler

Номер выпуска:1792
Дата выхода:24.09.2021, 15:15
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:7 / 25
Вопросов / ответов:3 / 12

Консультация # 9412: Всем, здарова. По какому адресу находится инструкция call,exitprocess(в памяти программы)?...
Консультация # 9163: Здравствуйте! Подскажите пожалуйта: Я рассматривал пример из книги и там в программе был такой кусок. Зачем здесь по ставлен short и почему в одно место он имеется а в другом нет? main_loop: ... jmp short main_loop ;Эта ближе к метке ... jna main_loop ;эта команда находится дальше ;к метке ... И есл...
Консультация # 72300: Подскажите плиз как решить такую задачу. Имеется два компьютера в сети, на каждом из них выполняется по одному процессу, которые используют общий для этих двух процессов файл. Необходимо синхронизировать использование этого файла этими двумя процессами. Т.е. если один процесс работает с этим файлом другой - ожидает пока...

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

Всем, здарова.
По какому адресу находится инструкция call,exitprocess(в памяти программы)?

Дата отправки: 01.01.2004, 00:01
Вопрос задал: joker
Всего ответов: 3
Страница онлайн-консультации »


Консультирует Ayl:

Добрый день, joker!
Где поставишь - там и будет находиться. А как иначе-то?

Консультировал: Ayl
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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


Консультирует _vt:

Доброе время суток, joker!
Опять я работаю телепатом... :-)
Вариант 1: тебе задал этот вопрос препод, относительно конкретной программы. Где она?
Вариант 2: в сегменте кода.
P.S. Пока не поздно - бросай институт! ;-)))

* Origin : Life begins at 1000Mhz!

Консультировал: _vt
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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


Консультирует Стас:

Доброе время суток, joker!
Может находится по любому. Или я чегото не понял в твоем вопросе.

Консультировал: Стас
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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

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


Здравствуйте!
Подскажите пожалуйта:
Я рассматривал пример из книги и там в программе был такой кусок. Зачем здесь по ставлен short и почему в одно место он имеется а в другом нет?
main_loop:
...
jmp short main_loop ;Эта ближе к метке
...
jna main_loop ;эта команда находится дальше
;к метке
...
И если можно, то подскажите что по сути означает byte ptr адрес, т.е. это считывает значения по адресу?
С уважением, Александр

Дата отправки: 01.01.2004, 00:01
Вопрос задал: Alexander
Всего ответов: 5
Страница онлайн-консультации »


Консультирует 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 подразумевает байтовый размер операндов).

Консультировал: Ayl
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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


Консультирует _vt:

Доброе время суток, Alexander!
short - директива ассемблеру, чтобы он использовал машинный код короткого перехода (в пределах -127..+128 байт). Во многих современных ассемблерах неиспользуется за ненадобностью - он сам решит, нужен короткий или длинный переход.
byte ptr - директива размерности, показывает, что ты осмысленно пытаешься прочитать один байт из переменной, длиной в слово и наоборот.
Например,
var dw ?
...
mov ah, var // Ошибка!
mov ah, byte ptr var // Так будет верно.

E-Man : Life begins at 1000Mhz!

Консультировал: _vt
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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


Консультирует Artemy:

Приветствую Вас, Alexander!
Вообще ТАСМ, да и МАСМ тоже сам узнает какой из JMP-ов short а какой нет.
Инструкция short говорит о том, что переход короткий, и занимает инструкция 2 байта, а простой (длинный) JMP - 3 байта, это в режиме .286 в пределах одного сегмента.

Консультировал: Artemy
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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


Консультирует Стас:

Добрый день, 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 может быть и байтом и словом и двойным словом.

Консультировал: Стас
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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


Консультирует Евгений Иванов:

Добрый день, 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: -=- Любовь существует! =-=

Консультировал: Евгений Иванов
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

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

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

Подскажите плиз как решить такую задачу.
Имеется два компьютера в сети, на каждом из них
выполняется по одному процессу, которые используют общий
для этих двух процессов файл. Необходимо
синхронизировать использование этого файла
этими двумя процессами. Т.е. если один процесс
работает с этим файлом другой - ожидает пока
первый процесс закончит свою работу.
Как это реализовать? Хотя бы основные принципы!
Спасибо за ответы!

Дата отправки: 23.01.2007, 19:38
Вопрос задал: kool
Всего ответов: 4
Страница онлайн-консультации »


Консультирует ramok:

Здравствуйте, kool!

самое просто это использовать файлов-флагов.
например у вас файл называется share.dat.
первый процесс пытается создать файл share.dat.lock нулевого размера, если ему это удается, то он начинает работать с файлом, и когда заканчивает то стирает этот файл.
процесс два тоже пытается создать файл share.dat.lock, но допустим что этот файл уже создан. значит другой процесс сейчас работает над этим файлом. процесс переодически пытается создать лок файл, до тех пор пока ему это не удается. после окончании работы он в свою очередь стирает лок файл.

Консультировал: ramok
Дата отправки: 23.01.2007, 19:49
Рейтинг ответа:

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


Консультирует Евгений Иванов:

Здравствуйте, kool!

Используй атрибут доступа. Открывай файл с закрытием доступа, и с проверкой на доступ. Если доступ закрыт, то ждёт по циклу, пока доступ будет разрешён. Когда один комп завершит работу, закрывай файл, тогда второй комп откроет его и т.д.

Насчёт задержек - отдавай процессорное время и проверяй через каждые 500 мс, взгляни на прерывание int 21 и её функции 83h и др.

Удачи!

Консультировал: Евгений Иванов
Дата отправки: 23.01.2007, 19:52
Рейтинг ответа:

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


Консультирует Лысков Игорь Витальевич (Мастер-Эксперт):

Здравствуйте, kool!
Хочу предложить взглянуть на проблему по-другому.
Если один процесс является основным и является хозяином файла.
Тогда можно организовать систему по принципу клиент-сервер.
В таком случае основной процесс монопольно работает с файлом сам,
плюс выполняет запросы от клиентов.
Клиент-сервер можно организовать, например, при помощи пайпов или сокетов

Консультировал: Лысков Игорь Витальевич (Мастер-Эксперт)
Дата отправки: 24.01.2007, 11:23
Рейтинг ответа:

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


Консультирует Зенченко Константин Николаевич (Старший модератор):

Здравствуйте, kool!
если Вы используете CreateFile: Вам нужно переменную dwShareMode обнулить
файл открывается блокированным для других процессов до закрытия файла
если файл уже открыт фунция дает ошибку.
если Вы используете OpenFile: Вам нужно переменной uStyle присвоить значение
OF_SHARE_EXCLUSIVE
Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 25.01.2007, 11:41
Рейтинг ответа:

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


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

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

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


В избранное