Şimdi anladım; o yüzden Komut1 ve Komut2 altyordamlarına sahip örnekte hiç bir zaman uğranılamayacak bölümler var. Herhalde belirttiğin gibi maksat, bu bölümlere dilediğimizde atlamak.
Bakalım bunu yapabilecek miyiz!
Eğer olmuyorsa, bütünlüğü korumak için bir kısıtlama konulmuştur. Belki yabancı forumda işin uzmanlarına danışmamız gerekebilir. Ben bir kaç deneme yapayım birazdan sonuçları aktarırım...
Evet, pc yerine done yazdığımızda sorunsuz bir şekilde istediğimiz altyordama atlıyor. Ancak adresini aldığımız "subroutine" etiketine geri dönemiyoruz. Dönsek' if()''den dolayı 'asm{}' bloğunu atlayıp "done" etiketine düşmesi gerekiyordu. Bunun sebebi; sanırım, ister köşeli isterseniz doğrudan 'jmp pc' yazalım, bizi değişkenin tanımlandığı adrese götürmesi. Koda bakar mısınız; yanılıyor muyum?
import std.stdio;
void main() {
void * pc;
asm{
call subroutine ; // Branching...
mov pc[EBP], EAX ; // Source of copy to [pc]
// Jumping:
//jmp pc ; /*
jmp [pc] ; /*** jmp dword ptr -4[EBP] ***/
}
subroutine:
if(!pc) asm {
pop EBX ; // Load saved state,
mov EAX, EBX ; // from current stack...
push EBX ; // Save previous stack state
ret ; // Return...
}
done:
"done: ".writeln(pc);
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]