'Privileged instruction' hatası?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Misafir

'Privileged instruction' hatası?

Mesaj gönderen Misafir »

Arkadaşlar Bir Step Motor Kontrolu Programı Yazmaya çalışıyorum.Fakat bir hata mesajı ile karşılaştım.
Hatanın sebebini bir türlü bulamadım.Delphinin Helpinde İşlemciyle alakalı olabilir yazıyor.
Ne yapmam lazım?

Hata mesajı şu:


Debugger Exception Notification

Project Project1.exe raised exception class EPrivilege with message 'Privileged instruction'.
Process stoped.Use Step or Run to continue.



Program kodu ise :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls ;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}
procedure WritePort(wPort : Word; bValue : Byte);
begin
asm {Assembly kodlarinin baslayacagini belirtiyor}
mov dx, wPort {Procedure ye disaridan verilern wPort degiskenini dx e aktariyor}
mov al, bValue {Procedure ye disaridan verilen, Porta gidecek Veriyi tutan Deger degiskenini Al ye aktariyor}
out dx, al {Al deki bilgi dx portuna yolluyor}
end; {Assembly kodu bitiyor}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
writeport(378,8);
writeport(378,4);
writeport(378,2);
writeport(378,1);
end;
end.
DotCom
Kıdemli Üye
Mesajlar: 1696
Kayıt: 11 Tem 2003 10:30
Konum: İzmir
İletişim:

Mesaj gönderen DotCom »

Merhablar ,,,

Geçen haftalarda ledlerle bir devre yaptım üniversitede kontrol sistemleri dersinde..

Yazdığım program pascal da ama sanırım vereceğim kodları delphi ye uyarlarsın artık...

şimdi şöyle anlatayım anlatıcaklarım , paralel port a göre...

bilindiği üzere paralel porrtda 8 adet data portumuz var , ve bunlar p2 ve p9 arasındakiler...

DB-25 paralel port üzerinde , 2 ve 9 uncu pinler arasındaki pinler...

pin 1 ise strobe uç yani veri doğrulaması geriye kalan portlar control ve status yani durum bilgisi alma amacı ile...

8 lik bir dizi yarat ve her bir elemana , 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 değerlerini ata...

For Example ;
dizi[1]:=1;
dizi[2]:=2;
dizi[3]:=4;
dizi[4]:=8;
dizi[5]:=16;
dizi[6]:=32;
dizi[7]:=64;
dizi[8]:=128;

bu dizi değerlerinin her biri 1 pine gider ve +5 volt dur.

bunları lpt ye yollarken

writeln(LST,dizi[x]);

şeklinde yollarsın..

eğer delphi için bir örneğini bulursam gönderrim...

Kolay Gelsin...
DotCom
Kıdemli Üye
Mesajlar: 1696
Kayıt: 11 Tem 2003 10:30
Konum: İzmir
İletişim:

Re: Bir Hata.. Yardım!

Mesaj gönderen DotCom »

meteor yazdı:procedure WritePort(wPort : Word; bValue : Byte);
begin
asm {Assembly kodlarinin baslayacagini belirtiyor}
mov dx, wPort {Procedure ye disaridan verilern wPort degiskenini dx e aktariyor}
mov al, bValue {Procedure ye disaridan verilen, Porta gidecek Veriyi tutan Deger degiskenini Al ye aktariyor}
out dx, al {Al deki bilgi dx portuna yolluyor}
end; {Assembly kodu bitiyor}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
writeport(378,8);
writeport(378,4);
writeport(378,2);
writeport(378,1);
end;
end.

Şimdi birazda senin kodu inceledim de ,,, assembly komutlarındada problem var dx e direk değer aktaramazsın.

ilk önce ;

mox ax,wport

şeklinde yolla sen direk dx e yazmışın asm de hiç bir zaman direk dx e yazılmaz benim bildigim kadarı ile....

ayrıca ufak bir hatırlatma daha.

tüm asm kodlarında al , dl kullanmışsın...

bu şekidle yapma...

ax ve dx e yolla ,, zaten ekrana int 20h ile yazılacak olan değer dl nin içinde kalır... den dx e attıgında dl ye gider otomatikman...

al konusuna gelince.. direk al ye aktarma , ax e attıgın değeri al den oku...

yani ,

mov ax,wport
mov dx,ax

şeklinde kullan kısacası....

Kolay Gelsin...
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba @meteor,

forumumuza hoşgeldin :)

Lütfen forum kurallarını oku. Başlığı senin için bu seferlik ben düzelttim.
- Mesajınıza uygun ve konuyu özetleyen kısa bir başlık yazın. Acil, Çok Acil, Önemli gibi ifadeler veya konuyla alakasız bir başlık kullanmayın.
Kolay gelsin.
Misafir

Mesaj gönderen Misafir »

m4st3rmus arkadaşım dediklerini aynen yaptım.ama yine olmadı:(Aynı hatayı yine veriyor.Aslında ben bu asm kodlarını başka bir yerden almıştım.araştırdığım baktığım kitaplarda hep aynı kod kullanılmış.Farklı bir yöntem bulamadım.Asm kullanılmadan yapılabilirmi bilmiyorum.

Bu arada Acemiliğimi bağışlayın...:(
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

NT tabanlı sistemlerde in-out gibi asm komutları ile donanım portlarına erisemezsiniz
eger erismek isterseniz Privilidge instruction hatası alırsınız
bunun icin dlportio diye bir surucu kurarak halledebilirsin
http://www.driverlinx.com/ftp/unsupported/port95nt.exe
bunu kurunca o dedigin hatayı almazsın ve sistemin calısır.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

http://antrak.org.tr/gazete/092003/metin.htm

4. Program çalışmıyor. Onlarca hata kutusu çıkartıyor (Error : Privileged instruction). Ne hatam var?

Muhtemelen Windows XP kullanıyorsunuzdur. XP direk port erişimine izin vermediği için programı çalıştırmadan önce Özelliklerden uyumluluk sekmesinde aşağıdaki gibi ayarlayın


Resim
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

meteor yazdı:m4st3rmus arkadaşım dediklerini aynen yaptım.ama yine olmadı:(Aynı hatayı yine veriyor.Aslında ben bu asm kodlarını başka bir yerden almıştım.araştırdığım baktığım kitaplarda hep aynı kod kullanılmış.Farklı bir yöntem bulamadım.Asm kullanılmadan yapılabilirmi bilmiyorum.

Bu arada Acemiliğimi bağışlayın...:(
selam, üstteki mesajda cevap var, birkaç ek yapmak istedim.
bulduğun kod yapmak istediğin iş için en iyi örnek.
dediğin gibi değişik dll'ler ilede yapılabiliyor inout32.dll diye bişey var, ama programınla onuda taşıman lazım ayrıca kurulum falanda gerekecek, küçük uygulamalar için direkt erişşim en iyisi. yukarıda bahsettiğim ayarı delphi ile yapmanın bir yolu varmı bilmiyorum.

hatanını nedenini gkimirti açıklamış, xp ve nt tabanlı sistemlerde in out komutları işletim sistmi tarafından çalıştırıltmıyor. nedeni malum güvenlik.

üstteki linkte ayrıca benzer bir uygulama var. oradaki dizi değerlerini değiştirerekde step programını yapabilirsin,
iyi çalışmalar
Misafir

Mesaj gönderen Misafir »

mege verdiğin ipucu gerçekten çok işe yaradı sağol.Artık o hatayı almıyorum.Yalnız Motor devresini hazırladım ve tekrar denedim.Yine çalışmadı.pascalda denedim çalıştı.koda eklemem gereken daha ne olabilir sizce?
DotCom
Kıdemli Üye
Mesajlar: 1696
Kayıt: 11 Tem 2003 10:30
Konum: İzmir
İletişim:

Mesaj gönderen DotCom »

@Meteor :

Eğer bir sakıncası yok ise ; full pascal kodunu yollıyabilirmisin. Bende delphide çalışıcak hale getirebilirim bu şekilde pascal kodunu.

Ayrıca banada 1 aya kadar banada yazılmış bir kod gerekli olucak. Onun için şimdiden uyarlıyalım.

Kolay Gelsin....
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

m4st3rmus
dostum ben lisedeyken pascal ile yapmıştım hem seri hemde paralel porttan cdlerimi karıştırayım bulursam buraya da yazarım sanada gönderirim oki

Saygılar
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
DotCom
Kıdemli Üye
Mesajlar: 1696
Kayıt: 11 Tem 2003 10:30
Konum: İzmir
İletişim:

Mesaj gönderen DotCom »

@MicroChip

Kardeş sewinirim. Cvp ını bekliycem...

Kolay Gelsin
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

meteor yazdı:mege verdiğin ipucu gerçekten çok işe yaradı sağol.Artık o hatayı almıyorum.Yalnız Motor devresini hazırladım ve tekrar denedim.Yine çalışmadı.pascalda denedim çalıştı.koda eklemem gereken daha ne olabilir sizce?
birkaç gündür şehir dışındaydım pardon..

porta veri gelip gelmediğini bi kontrol etsen, orlara birer led bağlayıp kontrol et.

hata nedenin port adresini yanlış girmenden kaynaklanıyor olabilir. örneğin paralel port 378h 'da ama bunu (assemblyde) desimale çevirmen lazım 378h= 888(10) gibi, bunlarıda bikontrol et.

linkteki o programı bir dene; o çalışıyor(ben yaptım nasıl çalışmaz dimi :D)
oradan portlara bakarsın.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Re: Bir Hata.. Yardım!

Mesaj gönderen fduman »

DotCom yazdı: şeklinde yolla sen direk dx e yazmışın asm de hiç bir zaman direk dx e yazılmaz benim bildigim kadarı ile....
Doğrudan dx e yazılabilir. mov dx,5 çalışır.
DotCom yazdı: tüm asm kodlarında al , dl kullanmışsın...

bu şekidle yapma...

ax ve dx e yolla ,, zaten ekrana int 20h ile yazılacak olan değer dl nin içinde kalır... den dx e attıgında dl ye gider otomatikman...
al ve dl rahatlıkla kullanılabilir ancak 32 bit işletim sisteminde pek bir avantajı yok. ax dx yerine eax edx kullanmak daha iyi.
Cevapla