6802 işlemci simulasyon da bir sorun yardım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
unnamed
Üye
Mesajlar: 24
Kayıt: 01 Nis 2006 05:13

6802 işlemci simulasyon da bir sorun yardım

Mesaj gönderen unnamed »

s.a. delphi türkiye ,
forumda pek gözüken bi kişi değilim çünkü kendi internetim yok:(
neyse bi derdim var programlamayla ilgili tabiki bide size sorayım dedim
biliyorum karışık bir konu umarım sizi uzun yazarak sıkmam.

usta programcılardan yardım bekliyorum lütfen.

şimdi ben bir 6802 işlemci simulasyonu yapmam lazım ödev için :(
biz üç kişiyiz aslında da diğer ikisi anlamıyo :) böyle bir ödev lisede kaç kişiye
verilmimştir merak ediyorum

neyse soruma geçeyim

bu işlemci nin assembly kodları var ldaa,aba,bne vb..gibi

bunların hepsini prosedürler olarak yazmalıyım.ayrıca programın çalıştırılma algoritması var.

şindi taslak olarak şöyle bir kod yazdım.

Kod: Tümünü seç

var
  Form1: TForm1;
  acca,accb:integer;
  x,y,w:integer;
  h,i,n,z,v,c:bool;
  he:bool;
  runarray_a:array[0..5] of string;
  runarray_b:array[0..5] of string;
implementation

{$R *.dfm}

procedure ldaa(param:integer);//acca yani akümülatör a burası bir bellek bölümdür lda komutu buraya istediğimiz sayıyı yükler
begin
acca:=param;
end;

procedure ldab(param:integer);
begin
accb:=param;
end;

procedure aba();
begin
acca:=acca+accb;
end;

procedure deca();
begin
dec(acca);
if acca=0 then z:=true;
end;
procedure decb();
begin
dec(accb);
if accb=0 then z:=true;
end;

procedure bne(param:integer);//bne yapılan işlem sonucu 0 ise istediğim satıra gitmesi gerekiyor goto gibi yani
begin
if z=false then x:=param;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   for x:=0 to 2 do
   begin
   if runarray_a[x]='ldaa' then ldaa(StrToInt('$'+runarray_b[x]));
   if runarray_a[x]='deca' then deca;
   if runarray_a[x]='bne' then bne(1);   //ben burada dedimki deca (a yı 1 eksiltir ) işleminin sonucu 0 olana kadar 
   //deca ya geri dön  
      showmessage(inttostr(acca)+runarray_a[x]); 
   end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
runarray_a[0]:='ldaa';
runarray_b[0]:='0a';
runarray_a[1]:='deca';
runarray_b[1]:='';
runarray_a[2]:='bne';
runarray_b[2]:='';
end;
::::::::::::
programın çalışma mekanizması button1 in click i nde sorunum var
acca=0 olana kadar bne 1in kod satırına göndermesi gerekiyor.
0 olduğunda ise programın bitmesi gerekiyor

bne kodunun mantığını şöyle düşündüm

programın çalışma ana döngüsü x değişkenine bağlı bir for döngüsü
olur.x i istediğim sayıya ayarlarsam programda geri dönmesini istedğim koda tekrar
döner.ver onu çalıştırır.tekrar çaışınca şartlar sağlandığında ise program biter.

fakat böyle olmuyor .mesela acca ya 10 sayısını yüklüyorum
geriye doğru dec komutu ile azaltıcam 0 olana kadar
10 ,9 da takılıyor sürekli 9,9,9, kalıyor showmessaghe yi de kontorl için koymuştum

buradaki mantık hatası ne acaba?

edit:hali hazırda mevcut olmayan mantığı nasıl üretiriz dicektim :lol:

yardımcı olursanız Allah razı olsun dicem valla :) [/code]
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

İncelememde yanılmıyorsam sonsuz döngüye girmesi doğal..

Kod: Tümünü seç

   if runarray_a[x]='bne' then bne(1);   //ben burada dedimki deca (a yı 1 eksiltir ) işleminin sonucu 0 olana kadar 
demişsin ya...

Kod: Tümünü seç

runarray_a[2]:='bne'; 
olduğuna göre x değeri ne zaman 2'ye ulaşsa sen bunu bu komut ile 1'e geri döndürüyorsun. Bu da sonsuz döngü demektir.

- Bence bne(1) değil bne(0) olmalı ki aynı işlemi en baştan yapsın, yani senin tabirinle GOTO gibi değerlendirsin... :idea:
Resim
Resim ....Resim
unnamed
Üye
Mesajlar: 24
Kayıt: 01 Nis 2006 05:13

Mesaj gönderen unnamed »

hocam cevap için teşekkürler,

yalnız bne direk dönmüyor şartlı döngü sağlıyor.

z yi kontrol ediyor ne zaman ki z=1 oldu buradan sonucun 0 olduğunu anlıycak ve tekrar geri dönme(meli)yecek.

fakat dediğiniz şeyi dikkatle tekrar gözden geçiricem benim gözümdfen
kaçan bir şeyin olamsı da kuvvetle muhtemel .. :roll:
Cevapla