site logo
  • Կայքի մասին
  • Ծրագրավորում
  • Ժեշտ
  • Անվտանգություն
  • Հարց ու Պատասխան (ՀուՊ)
Մայիս 4, 2014  |  By Neutrino In

Կանչում ենք C ֊ական ֆունկցիաներ Assembler ֊ի կոդից:

asm

Բոլորը գիտեն, որ C/C++ ֊ի կոդից կարելի է կանչել ասսեմբլերական հրամաններ inline assembler ֊ի միջոցով։ Պարզվում է, որ հակառակ կանչը ոչ միայն հնարավոր է, այլ նաև օգտագործվում է օպերացիոն համակարգի սկզբնական բեռնիչից (bootloader) միջուկի (kernel) կոդի թողարկման համար (քանի որ որպես կանոն օպերացիոն համակարգի բեռնիչը գրված է assembler֊ով, իսկ միջուկը C֊ով)․ ասսեմբլերի կոդից կարելի է կանչել C֊ական ֆունկցիաներ։ Կոդը գրելուց առաջ, պետք է համոզվել, որ բոլոր անհարեշտ գործիքները առկա են մեր օպերացիոն համակարգում։

Ասսեմբլերի կոդից օբյեկտային ֆայլ (*.o) ստանալու համար ես օգտագործում են nasm ասսեմբլերը: Իմ օպերացիոն համակարգը ubuntu ֊ն է, իսկ դրա համար nasm ֊ը տեղադրվում է հետևյալ հրամանով․

sudo apt-get install nasm

Մեզ պետք է նաև gcc կոմպիլյատորը։ linux ֊ում այն լռությամբ տեղակայված չէ և տեղակայման համար պետք գրել հետևյալ հրամանը․

sudo apt-get install build-essential

ՈՒնենք երկու ֆայլ print.asm և main.c։
print.asm

extern c_main
 section .text
 global _start
 _start:
       call c_main       
       mov eax, 1
       xor ebx, ebx
       int 80h

main.c

 #include <stdio.h>
 
 int c_main()
 {
    char str[] = "print from C";
     printf("%s\n", str); 
     return 0;
 }

Կարծում եմ կոդերը չափազանց պարզև բոլորի համար հասկանալի են։ Թերևս միան պետք է նշել, որ  extern c_main հրամանով նշում ենք, որ կանչվող  c_main() ֆունկցիան հանդիսանում է արտաքին ֆունկցիա։

Նախ անհրաժեշտ է main.c և print.asm ելայետային կոդի ֆայլերից ստանալ համապատասխան օբյեկտային ֆայլերը՝ main.o և print.o: Թե ինչ է օբյեկտային ֆայլը կարող էք կարդալ այստեղից object file: Եթե կարճ, ապա օբյեկտային ֆայլը դա անմիջապես կոմպիլյատորի ելքն է։ Այն երկուական ֆայլ է, որը պարունակում է մեքենայական կոդ և կատարողական ֆայլից տարբերվում է միայն նրանով,  որ link ֊ի փուլը չի անցել (կոպիտ ասած ֆունկցիաների կանչերի հասցեները կապակցված չեն)։

print.asm ֊ից օբյեկտային ֆայլ ստանում ենք հետևյալ հրամանով․

nasm -g -f elf printf.asm -o printf.o

Այստեղ -g ֊ով պահում ենք debug֊ի համար անհրաժեշտ ինֆորմացիան, ֊o ով տալիս ենք օբյեկտային ֆայլի անունը, իսկ -f elf ով էլ ասում ենք, որ ուզում ենք ելքում ստանալ օբյեկտային ֆայլ։

main.c ֊ից օբյեկտային ֆայլ ստանում ենք հետևյալ հրամանով․

gcc -c -o main.o main.c -g

Այստեղ -g և ֊o նույն նշանակությունն ունեն ինչ հաջորդ հրամանում էր, իսկ -c ով նշում ենք, որ ելքում պետք է ստանալ միայն օբյեկտային ֆայլ։

Այժմ այս երկու օբյեկտային ֆայլերը միասին link ենք անում և ստանում ենք կատարողական ֆայլ։

ld -o print print.o main.o -lc -I/lib/ld-linux.so.2

 

Մեզ մնաց միայն աշխատացնել ստացված print կատարողական ֆայլը, ինչն էլ անում ենք հետևյալ հրամանով․

./print

ld

Կանչում ենք C ֊ական ֆունկցիաներ Assembler ֊ի կոդից:, 10.0 out of 10 based on 5 ratings
Assembler assembler C և C++ C++ linking nasm Ժեշտ Ծրագրավորում
Previous Storyrawtherapee -ի մասին. կամ ինչպես խմբագրել RAW լինուքսի տակ
Next StoryԾրագրավորման խնդիրների ժողովածու

Comments: no replies

Join in: leave your comment Cancel Reply

(will not be shared)

Որոնում

Նշագրեր

*Nix-եր (18) android (17) C++ (19) C և C++ (27) Excel (10) html (10) Network Administration (16) System Administration (28) Windows 7 (14) Ալգորիթմներ (15) Անվտանգություն (29) ԳՆՈՒ/Լինուքս (16) Թեյնիկներին (57) Ժեշտ (44) Լակոնիկ (21) Լինուքս/Յունիքս հրամաններ (29) Լուսանկարչություն և մշակում (15) Խելախոսներ (19) Ծրագրավորման լեզուներ (16) Ծրագրավորում (64) Ծրագրեր (48) Հայականացում (28) Հումոր (11) Ուսումնական նյութեր (34) Սոցցանցային Հմտություններ (19) Վեբ (25) Վերլուծություն (10) Վորդպրես (21) ՏՏ և փիլիսոփայություն (21) Տվյալների բազաներ (12) Օպերացիոն համակարգեր (27) Օֆիսային ծրագրեր (22) անդրոիդ (16) բաշ (10) ինտերնետ (11) խելախոսներ (13) համացանց (15) հայատառ (10) հայերեն (11) հայերեն ստեղնաշար (11) հայկական սոֆթ (11) ստեղնաշար (10) սքրիփթ (14) վինդոուս (12) տեսանյութ (23)
Copyright ©2017 ThemeFuse. All Rights Reserved