0x02 – Writing Assembly Programs

Assembly Program မေရးခင္မွာ က်ေနာ္တို႕အေနနဲ႕သိထားရမွာေလးေတြရွိတယ္ Assembly Program တစ္ခုမွာဘာေတြပါဝင္လဲ ဘယ္လုိေတြအလုပ္လုပ္သလဲ စသည္ျဖင့္သိထားဖို႕လိုပါတယ္။  ဒါေၾကာင့္ က်ေနာ္ အဆင္ေျပတဲ့ေနရာကေန ေကာက္ႏွုတ္ေဖာ္ျပထားပါတယ္။ ဘယ္ကေနေလ့လာျပီးေဖာ္ျပထားတယ္ဆိုတာလဲ ေအာက္နားေလးမွာထည့္ေပးထားပါမယ္။

ပထမဆံုးအေနနဲ႕ Compilation & Linking ပံုစံေလးသိထားေအာင္အရင္ေလ့လာမယ္

[ hello.c + stdio.h ] -> preprocessing -> preprocessed (hello.i) -> GCC (compilation) -> hello.s  -> Assembly (as -o hello.o hello.s ) -> Linking [Object File (hello.o) + static library (libc.a) -> a.out

Header file နဲ႕ C file နဲ႕ ေပါင္းျပီး hello.i ဆိုတာေလးထြက္လာတယ္ ဒါကို compile လုပ္တဲ့အခါ assembly file hello.s ထြက္လာတယ္ ဒါကိုမွ assembler နဲက assemble လုပ္ေတာ့မွ Object file ထြက္လာတယ္ Object file ကို library ေတြနဲ႕ Link လုပ္ေပးရတယ္ ။ ဒီေတာ့မွာ ေနာက္ဆံုး Executable File ထြက္လာတာျဖစ္တယ္။

ဒီလိုဆိုရင္ executable file က ဘာ file လဲ

~file hello

ဘာေတြလာျပထားတာလဲ ? hello ဆိုတာက file name ပါ ျပီးရင္ file အမ်ိုးအစား ELF 32 bit LSB executable , CPU အမ်ိုးစား ၊ Dynamic Linking ၊ Kernel , BuildID , strip or not stripped (wiki) စသျဖင့္ သိနိင္တယ္။

Linking & Relocation

a.c + headers.h -> a.i -> a.s -> a.o ->
                                       ->ld (a.o & b.o & libc ) ->a.out
b.c + headers.h -> b.i -> b.s -> b.o ->

Relocation ကေရာဘယ္လိုလုပ္တာလဲ

C7 05 00 00 00 00 2a 00 00 00 [target address] -> C7 05 00 12 34 56 2a 00 00 00 [Relocation Entry]

Assembly Section

unintialized global variables - > .bss section
initialized global variables -> .data section
local variables -> stack
code -> .text section

section ေတြၾကည့္ခ်င္ရင္ objdump -h helloworld.o

ဒါဆို စမ္းေရးၾကည့္မယ္အရင္ဆံုး ျပီးမွျပန္ၾကည့္တာေပါ့ ခုက c file ကို compile လုပ္ထားတာဆိုေတာ့ object file က ျပရတာခက္ေနတယ္ ဒါေၾကာင့္ assembly ကိုစေရးၾကည့္တာေပါ့

Understanding the system calls

exit(0)

exit လုပ္တဲ့ဟာဆိုပါစို႕ assembly မွာ system call ကို eax မွာထည့္တယ္ arguments ေတြကိုေတာ့ ebx,ecx,edx စတာေတြမွာထည့္တယ္။ ဥပမာ

systemcall(first arg ,second arg,third arg) -> eax ( ebx , ecx ,edx )

exit program ဆိုပါစို႕  exit အတြက္ system call က 1 ျဖစ္တယ္ ( system call ref )

eax=1

exit(0) ဆိုေတာ့ first argument ျဖစ္တဲ့ ebx မွာ 0 ထည့္ရမယ္

ebx=0

ျပီးရင္ system call ကိုအလုပ္လုပ္ဖို႕အတြက္ interrupt လိုတယ္ ဒါကေတာ့ int 0x80 ျဖစ္တယ္။

ဒီေတာ့ exit program ေလးေရးၾကည့္မယ္ဆိုပါစို႕ assembly မွာ .text section ထဲမွာ code ကိုေရးတယ္ေျပာထားပါတယ္။ ဒါေၾကာင့္ .text ထဲမွာေရးမယ္ ။

.text

.globl _start

_start:
        movl $1,%eax
        movl $0,%ebx
        int $0x80


New line ဆင္းထားတယ္ေနာ္ မဟုတ္ရင္ assemble လုပ္တဲ့အခါ warning message ေပၚေနလိမ့္မယ္။ မထည့္ပဲစမ္းၾကည့္။

assemble လုပ္မယ္

as -o exit.o exit.s

link လုပ္မယ္

ld -o exit exit.o

hellowold program တစ္ခုေရးၾကည့္မယ္ ဒီလိုဆိုရင္ exit ကအရမ္းလြယ္လြန္းေနတယ္ ဘာ data မွကိုမပါဘူးျဖစ္ေနတယ္။

Hello world ကိုေရးဖို႕အတြက္ ဘာေတြလိုလဲ?

initiated global variable တစ္ခုထည့္မယ္ Helloworld string ကိုထည့္ထားဖို႕အတြက္ျဖစ္ပါတယ္။

ျပီးရင္ output ျပဖို႕ system call တစ္ခုလိုမယ္ write ကိုသံုးရမယ္ printf မရွိဘူး ဒီမွာ

ျပီးရင္ exit လုပ္မယ္

initialized global variable ဆိုရင္ .data section ပါလာျပီ ေရးၾကည့္တာေပါ့။

.data 
#initialized global variable တစ္ခုေၾကညာျခင္း
HelloworldString: 
           ascii "Hello World\n"

.text

.globl _start

start:
       #write(fd=1->standard output,constant char user buf,size)
       movl $4,%eax
       movl $1,%ebx
       movl $HelloworldString,%ecx
       movl $12,%edx
       int $0x80

       #exit 
       movl $1,%eax
       movl $0,%eax
       int $0x80


assembly နဲ႕ပတ္သတ္ျပီး စမ္းစရာေတြအမ်ားၾကီးက်န္ပါေသးတယ္ က်ေနာ္ကေတာ့ အကုန္စမ္းမျပေတာ့ပါဘူး

Data Types ေတြ move လုပ္တာေတြအမ်ားၾကီးက်န္ပါေသးတယ္။

Assembly for Hacker Linux Megaprimer ဆိုတာကို ၾကည့္ေစခ်င္ပါတယ္ Vivek ကရွင္းတာတကယ္ေကာင္းပါတယ္ Free Course ျဖစ္ေတာ့ Down ၾကည့္ေစခ်င္ပါတယ္။

Data Section ကို ၾကည့္ခ်င္ရင္

ေနာက္တစ္ခန္းေရာက္မွ Memory အေၾကာင္းဆက္ေဆြးေႏြးမယ္

ဒီထက္ပိုျပီး အေသးစိတ္သိခ်င္ရင္ေတာ့ က်ေနာ္ဖတ္ခဲ့တဲ့ Slide ေလး လမ္းညႊန္ေပးပါမယ္။ slide ဆိုေပမဲ့ ရွင္းျပထားတာမပါေတာ့ နည္းနည္းေတာ့ စိတ္ရွည္ရွည္ေလး ေလ့လာေစခ်င္ပါတယ္။ အဲ့ Slide နဲ႕ ဘယ္မွာေျပာခဲ့တယ္ဆိုတာလဲ မသိေတာ့ ေျပာတာေတာ့ မသိရပါဘူး ဒါေပမဲ့ ေတာ္ေတာ္ေကာင္းပါတယ္။ ေျပာခဲ့တာလဲ နားလည္ခ်င္မွလည္မွ Taiwan ကဆိုေတာ့ တရုတ္လိုေျပာရင္ က်ေနာ္ေတာ့နားမလည္ဘူး ။

https://www.slideshare.net/jserv/helloworld-internals