Waxaan sii wadaynaa taxanahan taxanaha ah ee ku saabsan sida loo abuuro nidaamkayaga hawlgalka. Maanta diirada kuma saareyno hal mowduuc laakiin waxaan qeexi doonnaa howlo wax ku ool ah wixii hada ka dambeeya. Marka hore waxaynu qeexi doonaa 3 hawlood oo fuliya shaqada xaashi, xusuus y xusuus:
void* ND::Memory::Set(void* buf, int c, size_t len)
{
unsigned char* tmp=(unsigned char*)buf;
while(len--)
{
*tmp++=c;
}
return buf;
}
void* ND::Memory::Copy(void* dest,const void* src, size_t len)
{
const unsigned char* sp=(const unsigned char*)src;
unsigned char* dp=(unsigned char*)dest;
for(;len!=0;len--) *dp++=*sp++;
return dest;
}
int ND::Memory::Compare(const void* p1, const void* p2, size_t len)
{
const char* a=(const char*)p1;
const char* b=(const char*)p2;
size_t i=0;
for(;i<len;i++)
{
if(a[i] < b[i]) return -1; else if(a[i] > b[i])
return 1;
}
return 0;
}
Dhamaantood waa is-fulin. Shaqooyinkan waxaan ka soo qaatay maktabad yar oo C ah, hirgalintu waxay inta badan la mid tahay dhammaan nidaamyada hawlgalka. Hadda waxaan sameyneynaa 3 shaqooyin jilid ah laakiin si aan wax uga qabanno xargaha. Waxay buuxin lahaayeen shaqada strcpy, cidhiidhi y strcmp.
size_t ND::String::Length(const char* src)
{
size_t i=0;
while(*src--)
i++;
return i;
}
int ND::String::Copy(char* dest, const char* src)
{
int n = 0;
while (*src)
{
*dest++ = *src++;
n++;
}
*dest = '';
return n;
}
int ND::String::Compare(const char *p1, const char *p2)
{
int i = 0;
int failed = 0;
while(p1[i] != '' && p2[i] != '')
{
if(p1[i] != p2[i])
{
failed = 1;
break;
}
i++;
}
if( (p1[i] == '' && p2[i] != '') || (p1[i] != '' && p2[i] == '') )
failed = 1;
return failed;
}
char *ND::String::Concatenate(char *dest, const char *src)
{
int di = ND::String::Length(dest);
int si = 0;
while (src[si])
dest[di++] = src[si++];
dest[di] = '';
return dest;
}
Haatan waxaan la soconnaa hawlo aad u xiiso badan. Hawlahaas ayaan ku aqrin karnaa kuna qori karnaa dekedaha qalabka. Tan waxaa caadiyan lagu sameeyaa ASM waxayna u dhigantaa (x86) tilmaamaha in y baxay. Si aad si fudud ugu wacdo ASM oo ka socda C, isticmaal tilmaamaha asm, khatarta ay ka dhalan karto oo ah inaan la qaadi karin. Jumladan waxaan kudaraynaa Iskudheeli si GCC aysan isugu dayin inay qoraalkaas wax ka beddesho. Dhinaca kale, tilmaamta asm waxay leedahay qaab layaableh oo aqbalida cabirrada, laakiin waxaan u maleynayaa in taas sifiican loo fahmay iyadoo la fiirinayo tusaalooyinka.
void ND::Ports::OutputB(uint16_t port, uint8_t value)
{
asm volatile("outb %1, %0" : : "dN"(port), "a"(value));
}
uint8_t ND::Ports::InputB(uint16_t _port)
{
unsigned char rv;
asm volatile("inb %1, %0" : "=a"(rv) : "dN"(_port));
return rv;
}
Illaa iyo hadda boostada 3, maanta waxba kama qaban wax riwaayad ah laakiin waxaan qeexnay howlo imaan doona mustaqbalka. Ogeysiis 64-bit isticmaaleyaasha ah inaan ka shaqeynayo hagaajinta a cayayaanka taas oo ka hortageysa in si sax ah loo soo uruuriyo 64 jajab Qoraalka soo socda waxaan ku arki doonaa qayb muhiim ah oo ka mid ah naqshadaha x86, ee GDT.
Aan aragno haddii aad faallo ka bixisid sida loo xalliyo cayayaanka, maxaa yeelay kama aanan soo hormarin qaybtii hore.
Waxaan u maleynayaa inay faallo ka bixiyeen qaladka faallooyinka boostada 2. Waxay u maleeyeen inay tahay wax ka yimid murugada haddii aan si sax ah u xasuusto
Kusoo koobi bye si aad uhesho
Byte byte sida muuqata ..., 2 guuldarrooyin is xigxiga ma gaaro guul, waa la xaqiijiyay.
Aad baad ugu mahadsantahay qoraalka aad ufiican waana raacayaa, su'aalo ayaan qabaa:
1. Markaad dhahdo 'Si fudud looga waco ASM-ka C tilmaamaha asm-ka ayaa la adeegsadaa, halista ay ka dhalan karto oo ah inaan la qaadi karin', maxaad uga jeeddaa markaad dhahdo 'khatarta ay leedahay ee ah inaan la qaadi karin '?
2. Haddii a 'operating system' qalliin loo samayn lahaa (in la yiraahdo) qaybtaan helitaanka Qalabka waxaa lagu sameyn lahaa Isku-dubaridaha.
3. Sidee lagu qaban lahaa Iskuxirka?
Waad ku mahadsantahay raacay, waxaan mid mid uga jawaabi doonaa su'aalaha:
1- Hagaag, dhibta ka timaada asm-ka ayaa ah inaysan kujirin heer kasta oo C ah, marka iskudarsade kastaa wuxuu u fuliyaa qaabkiisa (haduu fulinayo) Xaaladdan oo kale waxaa lagu soo ururin karaa GCC iyo Clang (waxay u egtahay sida GCC marka loo eego arrintan) laakiin ma awoodi doontid inaad ku dhexjirto kombiyuutarrada kale sida Intel C (tani waxay u adeegsaneysaa Intel Syntax ee ASM).
2-Xirfad ahaaneed, hal qeyb iyo mid kale waa in si cad loo kala saaraa qaab dhismeyaasha iyo qayb kale oo guud. Muhiim maahan in lagu sameeyo isku soo wada duub (Linux ayaa ku dhex leh C)
3- Isku soo wada duuboo waa wax aad u fudud sidoo kale, laakiin waxaad ku haysaa feyl gooni ah. Dhinaca kale, adoo yeelanaya doodo, waa inaan marka hore u gudbino diiwaanka taasna waxay noqon kartaa waxoogaa khalkhal badan, ka dibna outb ama inb ayaa loo yeerayaa oo hawsha waxaa lagu dhawaaqay inay tahay mid caalami ahaan ka muuqata Markaa laga bilaabo C waa inaad ka sameysaa cinwaan sheegaaya hawl "bannaanka" ah. NASM (Intel Syntax) waxay noqon laheyd wax sidan oo kale ah:
dibedda:
riix ebp
dhaqaaq ebp, esp
moax eax, [ebp + 12]
dhaqaaq edx, [ebp + 8]
out dx al
mop esp, ebp
boob ebp
diidmada
Su'aal, maxaad adeegsanaysaa? Ma fahmin sababta asms badan oo kala duwan xD MASM, FASM, NASM, AT & T ...
Hadana haddii aad waqti hesho, ma sharxi kartaa khadka:
asm isbeddelaya ("outb% 1,% 0" :: "dN" (dekedda), "a" (qiime));
Ilaa "asm volatile" ma fahmay xD "outbyte 1,0?"
Mise waa 1 -> »dN» (dekedda), 0 -> «a» (qiime)?
Haddii ay tahay tan dambe, ma fahmin waxa "dn" iyo "a" ...
Aad baad ugu mahadsantahay tabarucaadkaaga! Cajiib !!
Qaaciddada aan adeegsado waa AT&T oo ah waxa GCC ay gudaha ku isticmaasho in kasta oo lagu sameyn karo dhibaato la'aan NASM (la jaanqaadaya qoraalka). Marka laga hadlayo bayaankan adag ee is bedbedelka leh, waxaan kaliya kuu sheegi karaa inay sidaas tahay GCC maadaama ay isticmaasho cabbiro qaar si loo ogaado sida xogta loo gudbin karo. Tusaale "a" waa x86 operand gaar ah oo loo isticmaalo inuu matalo diiwaanka. Liistada oo dhan waa halkaan: http://gcc.gnu.org/onlinedocs/gcc/Constraints.html#Constraints
sifiican, runtii waxaan ubaahanahay caawimaad, waan kucusub nahay tan mana haysto fikrad yar waxa aan ku sameeyo waxa ku qoran terminalka, qof ma i caawin karaa?