Tam Sürümünü Görmek İçin : register int count = 0;
ankakusu
06/10/2007, 13:55
Merhaba arkadaslar,
ben yine sorularla devam ediyorum.
simdi ben baslikta yazdığım gibi bir
cpp cümlesi yazdım.
register int count = 0;
şimdi ben hangi register'da olduğunu
bir şekilde öğrenmemin bir yolu var mı acaba?
teşekkür ederim...
Benim bildiğim kadarıyla yok. Ancak register anahtar kelimesi ile nitelediğinizde o değişkenin register'da yer alması garanti altında değil. Aynı, C99 ve C++'ta inline anahtar kelimesi kullanıldığında da olduğu gibi. Sizin o değişkeni register ile nitelemeniz yalnızca derleyiciye ilettiğiniz bir rica. Derleyici uygun gördüğü takdirde değişkeni register'a alır veya almaz.
İyi çalışmalar.
ankakusu
06/10/2007, 15:05
hmm anladım..
sağolasın...
Euclides
06/10/2007, 15:09
Eğer mutlaka bişilerin değerini belirlemek gerekiyorsa asm parantezinden yazabilirsin
asm{
xor eax,eax
}
gibi...
ankakusu
06/10/2007, 15:29
asm
{
xor eax,eax
}
buradaki eax filan ne oluyor?
herhangi bir değişken mi?
burada üretilen asm kodunu ben
nereden gözlemleyebilirim?
cout'la bastırılabiliyor mu mesela?
parantezlerin içine her şeyi yazabilir miyim?
Keza
asm
{
int a;
}
yazdığımda hata veriyor.
Compiling...
chap6.cpp
error C2059: syntax error : '{'
error C2143: syntax error : missing ';' before '{'
error C2065: 'xor' : undeclared identifier
error C2143: syntax error : missing ';' before 'constant'
Error executing cl.exe.
asm
{
xor eax,eax
}
yazdığımda da hata veriyor...
Compiling...
chap6.cpp
error C2059: syntax error : '{'
error C2143: syntax error : missing ';' before '{'
error C2065: 'xor' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'eax'
error C2065: 'eax' : undeclared identifier
Error executing cl.exe.
chap6.exe - 5 error(s), 0 warning(s)
asm fonksiyonunun içine sembolik makina dili yazabilirsiniz. xor eax,eax; bunlar da sembolik makina komutları.
Euclides
06/10/2007, 15:55
öncelike bir imla hatası yapmışım "asm" yerine "__asm" olacak (aslında derleyiciye göre değişebilir. ama sanırım visual c++ kullanıyorsunuz, "__asm" geçerli)
Sorunuzda hangi register diye sormuştunuz. bende pc kullandığınız düşüerek bunu yazdım. eax, 32 veya 64 bit pc101 uyumlu sistemledeki bir register.
parantezlerin içine sadece assembly kodu yazabilirsiniz. cout ile bastırmanız mümkün değil.
ancak şu mümkün
int nTmp;
__asm
{
mov nTmp,eax
}
std::cout << "0x" << std::hex << nTmp << std::endl;
ankakusu
06/10/2007, 17:20
anladım eax registerlardan biri ...
quasimodo
06/10/2007, 17:24
@Euclides
__asm{ }
icinden CS:IP ciftiyle oynayabilirmiyiz?
Euclides
06/10/2007, 17:53
tabii ki, yanlız dikkat edilmesi gereken bir nokta var. cs ve eip'e direkt değer atanamaz
mov eax,1234 ;doğru
mov eip,1234 ;yanlış
mov es,ax ;doğru
mov cs,ax ;yanlış
gibi komutlar hatalıdır.
iretd, far call ve far jump'larla değiştirmek mümkündür
push <yeni cs>
push <yeni eip>
jmp far ptr [esp]
(Not: kod 32bit bir sistem için geçerlidir. 64bit'de muhtemlen esp yerine rsp gelecektir.)
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.