Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нужно прочитать код

1.9K
20 февраля 2006 года
wishco
59 / / 20.01.2004
Procedure SetPort(p:word;b:byte);stdcall;
{$ifdef RWPort}
var
len: cardinal;
written: cardinal;
{$endif}
begin
{$ifdef RWPort}
len:= 1;
WriteFile(hport,b,len,written,nil);
{$else}
asm
push edx
push eax
mov dx,p
mov al,b
out dx,al
pop eax
pop edx
end;

И что туту значит условная компиляция.
Заранее спасибо.
534
20 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by wishco
Нужно прочитать код. Что тут значит условная компиляция.
Заранее спасибо.


Здесь условная компиляция значит, что если, например, лексема RWPort определена (с помощью {$define RWPort}), то код между директивами {$ifdef RWPort} и {$endif} скомпилируется, а если нет - значит в программе он будет отсутствовать, как буддто его и не было вовсе. Про {$else} ты наверное сам догадаешься. А ассемблерный код делает вот что:
1. сохраняет в стеке содержимое регистров edx и eax
2. помещает в регистр dx (версия edx для 16 бит) значение p, в регистр al (eax для 8 бит)
3. отправляет на порт, 16-битное значение которого находится в регистре dx, значение, находящееся в регистре al.

восстанавливает значения регистров edx и eax. Ассемблер надо учить, батенька!!! Да и теорию по Delphi тоже. (Я об условной компиляции и методах отладки приложений)

1.9K
20 февраля 2006 года
wishco
59 / / 20.01.2004
Цитата:
Originally posted by HarryAxe
Здесь условная компиляция значит, что если, например, лексема RWPort определена (с помощью {$define RWPort}), то код между директивами {$ifdef RWPort} и {$endif} скомпилируется, а если нет - значит в программе он будет отсутствовать, как буддто его и не было вовсе. Про {$else} ты наверное сам догадаешься. А ассемблерный код делает вот что:
1. сохраняет в стеке содержимое регистров edx и eax
2. помещает в регистр dx (версия edx для 16 бит) значение p, в регистр al (eax для 8 бит)
3. отправляет на порт, 16-битное значение которого находится в регистре dx, значение, находящееся в регистре al.

восстанавливает значения регистров edx и eax. Ассемблер надо учить, батенька!!! Да и теорию по Delphi тоже. (Я об условной компиляции и методах отладки приложений)




Спасибо огромное!
я не отрицаю. Delphi пятый день вижу.

5
21 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by wishco
Спасибо огромное!
я не отрицаю. Delphi пятый день вижу.


код делает вот что: если определена RWport то мы будем для записи в порт использовать Win32 API функцию WriteFile, в противном случае - мы пишем всё тот же байт в порт, но на асме.
К сведению, инструкция out на WinNT 2000 XP ... не прокатит в обычном приложении - она привелигированная.

1.9K
21 февраля 2006 года
wishco
59 / / 20.01.2004
Цитата:
Originally posted by hardcase
код делает вот что: если определена RWport то мы будем для записи в порт использовать Win32 API функцию WriteFile, в противном случае - мы пишем всё тот же байт в порт, но на асме.
К сведению, инструкция out на WinNT 2000 XP ... не прокатит в обычном приложении - она привелигированная.



Спасибо огромное. А как обойти out? в XP.

5
21 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by wishco
Спасибо огромное. А как обойти out? в XP.

чтобы можно было обращаться к произвольному порту нужно писать драйвер - больше никак. Можно, правда, использовать апишки типа DeviceIoControl, но их возможности сильно ограничены.

534
21 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by hardcase
чтобы можно было обращаться к произвольному порту нужно писать драйвер - больше никак. Можно, правда, использовать апишки типа DeviceIoControl, но их возможности сильно ограничены.


Да и смысла обращаться к конкретному порту помимо коммуникационных нет. Винда предоставляет кучу библиотек и интерфейсов на все случаи жизни. Методы, связанные с обращением к портам напрямую уже давно умерли вместе с Win9x. Настало время новых высокоуровневых интерфейсов, как выражаются мелкомягкие :D

5
21 февраля 2006 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by HarryAxe
Да и смысла обращаться к конкретному порту помимо коммуникационных нет.


Согласен - смысла мало, разве что так, ради интереса, ну там пару тройку аппаратных функций посмотреть или с BIOS повозиться...

534
22 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by hardcase
Согласен - смысла мало, разве что так, ради интереса, ну там пару тройку аппаратных функций посмотреть или с BIOS повозиться...


Да, с BIOS повоевать не получится, а для аппаратных функций - только DeviceIOControl (зато можно напрямую на жёсткий диск писать или, например, int 21h эмулировать...)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог