Pages

Wednesday, September 29, 2010

Assembly code එකක දළ සැකැස්ම

කලින් පොස්ට් එකෙදි මාධව අතින් Assembly Program එකක් Compile කරලා Run කරන විදිහ විස්තර වෙච්ච නිසා මේ කොටසෙදි මම Assembly Program එකක දළ ව්‍යුහය ගැන කතකරන්නම්.මුලින්ම අපි හුරු පුරුදු "C" code එකක් Model එක විදිහට තියාගෙන ඒ ඔස්සේ කලපනා කරල බලමු මොකද්ද මේ "ව්‍යුහය"කියල.


int main()
{ 
     int x=5; 
     int y;
     printf("hello");
     y=x+5;
}

C program එකක function Code එකේ ප්‍රධාන කොටස් 3 ක් අඳුනගන්න පුලුවන්.
1) අපි program එක Run වෙන අතරදි භාවිතා කිරීමට බලපොරොත්තු වන  දැනටම දන්නා Values (අගයන් සහ නියත) සදහා Main Memory න් ඉඩ වෙන් කිරීම. 
       eg: int x=5;
2) අපි program එක Run වෙන අතරදි මතුවන කිසියම් දත්තයක් ගබඩා කිරීමට භාවිතා කිරීම සදහා බලපොරොත්තු වන දැනට Value එක නොදන්නා Variables සදහා Main Memory න් ඉඩ වෙන් කිරීම. 
      eg: int y;


3)ප්‍රධානම කොටස මෙයයි. program එක මගින් කරගැනීමට බලාපොරොත්තු වන සියලු කාර්යයන් සදහා අදාල instructions අඩංගු කොටස මෙයයි. 
      eg: printf("Hello"); 
            y=x+3;

ඔය කරුණු කාරණා ඔලුවෙ තියාගෙන අපි දැන් Assembly දිහාවට හැරෙමු. Assembly කියන්නෙ Low Level Language එකක් වුනාට ඒකෙ High level යැයි කියාගන්නා C කියන Languages වගේ නෙමේ ඔය ඉහත සදහන් කරපු කොටස් 3 සංවිධානාත්මකව වෙනම කොටස් වලට කඩලයි ලියන්න තියෙන්නෙ. ඕනි ඕනි විදිහට කොටස් කඩනව වගේ නෙමේ nasm හෝ වෙන ඕනිම Assembly compiler (හරියටම කිව්වොත් Assembler) එකකින් කඩපු කොටස් අඳුනගන්න පුලුවන් වෙන්ඩත් එපැයි. ඔන්න ඕක නිසා "segment .data", "segment .bss" , "segment .text" කියලා විශේෂ Key words 3 ක් අපි අදාල Section එක පටන් ගන්න කලින් ලියනවා Assemblor එකට ඔය sections අඳුනගන්න ලේසි වෙන්න.


මෙතනදි ".data" කියන Key word එක යටතේ ඇති කොටසේ ලියන්නෙ උඩ විස්තර කරපු පලවෙනි කොටසට අදාල දේවලුයි. ".bss" සහ ".text" කොටස් වල ලියන්නෙ පිලිවෙලින් ඉහත 2, 3 වලට අදාල දේවලුයි.

මේ කතාවෙච්ච සිද්ධිය පැහැදිලි වෙන්න දැන් අපි Assembly Code දිහා පොඩ්ඩක් බලමු.

-----------------------------------------------------------
segment .data 
     msg db "Hello World",10  
     len equ $-msg
segment .bss
     y resd 1 
 
segment .text  
     global _start   
 
_start:        
     mov eax,4 
     mov ebx,1 
     mov ecx,msg
     mov edx,len   
     int 80h
     mov ebx,0  
     mov eax,1  
     int 80h 
 
------------------------------------------------------------- 
 
ඒක නිසා ගොඩක් බරපතල විදියට මේක දිහා නොබල දැනට දන්න කරුණු එක්ක මේක දිහා බැලුවොත් ලේසි වෙයි මේක තේරුම් ගන්න එක. ඒ කියන්නේ මෙන්න මේ වගේ. 
මුලදිම මම කිව්වා Assembly Code  එකක තියනවා කියලා ප්‍රධාන කොටස් 3ක්. අන්න ඒ කොටස් 3ට අදාල Keywords උඩ තියන Code එකේ Highlight කරලා තියන විත්තිය පැහැදිලිව පේනවනේ.... ඒ Highlight කරලා තියෙන කොටස් වලට පහලින් තියෙන්නේ ඒ ඒ කොටසට අදාල Code කොටස්.වැඩේ තව පැහැදිලි වෙන්න නම් උඩ තියෙන Code එක copy කරල filename.asm විදිට Save කරලා මාධව කලින් සදහන් කලා වගේ,
     nasm -f elf filename.asm
     ld -s -o filename filename.o      ./filename
යන Command 3 භාවිතයෙන් program එක Execute කලහCommand line එකේ Hello World කියල print වෙනව බලාගන්න පුලුවන් වෙයි.
දැනට මේ ඇතිනේ. මේ Code එකේ ඇතුලු කොටස් වලින් කියවෙන දේ ගැන ඉස්සරහට කතාකරමු.

3 comments:

  1. well done..........
    ඒ ටික නම් හොදට තේරුනා...........

    ReplyDelete
  2. මුලින්ම Thanks ආරාධනය පිළිගත්තට....

    නියමයි මචන් post එක. සිරාවටම මාර පැහැදිලියි...
    ලියපන් ඉස්සරහටත්.... :)

    ReplyDelete
  3. nasm -f elf -g -F stabs filename.asm

    In addition we can debug the source code using this command.........

    ReplyDelete

ඔබගේ අදහස් පවසන්න ...
මට ඒව මසුරන් වටිනවා ....