Laman Utama Tanya Wiki English Artikel Komuniti E-Mel Ringtones Search

Bantuan | Carian | Ahli | Kalendar

Google

Selamat Datang ( Log In | Daftar )

> Peraturan Forum

1. Sebarang [b]benda² illegal tidak dibenarkan dibincangkan (di mana-mana forum Putera.com)[/b]. Jika thread berkaitan illegal ini dibuka maka thread² ini akan dikunci / dipadamkan oleh moderator / supervisor / admin. 2. Pengguna [b]dilarang sama sekali SPAM[/b] dengan posting yang tidak mendatangkan faedah seperti smile, "betul tu" dan sebagainya. Jika masih membuat posting yang berbentuk SPAM, maka posting tersebut akan dipadamkan, dan jika kerap berlaku anda mungkin diberi warning. 3. Pengguna seharusnya [b]menggunakan fungsi search[/b] sebelum membuka sesuatu topik. Ini adalah untuk mengelakkan topik yang sama dibuka berulang kali. 4. Sila [b]gunakan PM[/b] jika mahu berkomunikasi secara persendirian dengan individu tertentu atau berkenaan sesuatu yang tidak dibenarkan secara umum.

3 Pages V   1 2 3 >  
Reply to this topicStart new topic
Reverse Code Engineering, tutorial...
Ancient One
post Aug 2 2006, 12:37 PM
Kiriman #1


Ahli
***

Grup: Members
Kiriman: 492
Penyertaan: 12-June 04
Dari: Kota Kinabalu
Ahli ke- 857



intro

Assalamualaikum... Tutorial ni adalah mengenai Reverse Code Engineering (RCE). Ringkasnya, dalam tutorial ni aku akan cuba mendedahkan kepada korang bagaimana untuk menganalisis program binari, dalam kes di mana kita tidak mempunyai akses kepada kod sumber asal program tersebut. Aku hanya fokuskan tutorial ni kepada platform Windows. So kalau aku citer pasal kernel misalnya, aku maksudkan kernel Windows, bukannya Linux, BSD ataupun maner2 OS yang lain. Lebih spesifik lagi, aku personally hanya guna Windows XP Pro (dengan SP2), sebab OS lain.. secara ikhlasnya... takde umphhh!
Dalam bahagian pertama ni aku akan citerkan mengenai beberapa jenis dan kategori tools yang akan kita gunakan dalam sesi menganalisis dan tugas asas setiapnya. Bahagian ni lebih kepada memberi gambaran kepada korang apa yang korang akan buat atau tengok kelak, iaitu apabila korang dah ader pengetahuan asas mengenai RCE. So korang bleh laa anggap bahagian ni sebagai pemanas otak untuk membuka minda korang supaya dapat menerima maklumat2 asas dalam bahagian2 seterusnya. Dalam bahagian2 seterusnya aku akan citer plak basic knowledge dalam RCE dan maklumat2 yang lebih spesifik. Pengetahuan ni amat penting untuk korang yang makan PC, tido PC, mandi PC dan kawin ngan PC korang. Tools yang aku citer kat sini digunakan untuk pelbagai tujuan, di mana asasnya sama sahaja, iaitu untuk membantu menganalisis carakerja program binari. Tools sebegini digunakan oleh security expert untuk mengkaji kod sistem operasi, server, dan komponen2 kritikal suatu program. Tools ni jugak digunakan oleh crackers untuk mengalahkan skim perlindungan suatu perisian. Tools yang sama juga digunakan untuk cheat dalam game. Tools yang sama jugak korang bleh gunakan untuk analisis virus atau aper2 "makhluk asing" yang selalu sangat singgah kat PC korang tuh. Ye laa.. kita sepatutnya jadik tuan kepada PC kita, PC tu cuma hamba abdi dan menatang ni sepatutnya ikut perintah kita, bukan sebaliknya. Tak perlu takut dengan program2 "hantu" yang berlambak2 tu selagi kita penuhkan kepala otak kita dengan ilmu2 ghaib pasal PC ni. Aper2 pun aku harap korang bleh mempelajari sesuatu daripada tutorial yang tak sebrape ni.

disassembler

First sekali aku nak citer pasal disassembler. Tugas asas sebijik disassembler adalah menerima program binari sebagai input dan menghasilkan perwakilan program tersebut dalam bahasa himpunan sebagai output. Output yang kita dapat dari disassembler blehla dikatakan "kod sumber" program tersebut, cuma ia bukannya dalam bentuk yang asal, tapi dalam bahasa himpunan. Contoh2 disassembler adalah IDA (Interactive DisAssembler), PEBrowse Professional, BDASM, W32DASM dan lain2. Untuk mendapat sedikit idea mengenai menatang bahasa himpunan ni, kat bawah aku tunjukkan screenshot dari PC aku, di mana IDA dan Minesweeper tengan berjalan, dan aku tengah analisis kod Minesweeper menggunakan IDA (errr.. kotak2 dan garis2 kaler merah, kuning, ping dan hijau tu aku tambah laaa).



Baris2 teks "push ...", "mov ...", "call ..." dan lain2 tu laa yang kita panggil sebagai bahasa himpunan. Nanti aku citer details lagi pasal ni. Cebisan kod dalam gambar di atas merupakan kod yang digunakan oleh Minesweeper untuk memaparkan "about box" game ni (iaitu menu help->About Minesweeper). Simbol2 teks "LoadIconW", dan "ShellAboutW" dalam prosedur tersebut adalah 2 daripada ribuan Windows API (Application Programming Interface). Semer Windows program gunakan Windows API untuk berinteraksi dengan Windows dan kebanyakannya didokumenkan dalam Platform SDK (Software Development Kit). Memahami Windows API merupakan salah satu kunci untuk memahami fungsi suatu prosedur dalam program Windows. Contohnya, dalam prosedur di atas, kod yang ditandakan dalam petak merah digunakan untuk load string dari string table resource program tersebut (bleh dilihat dengan mana2 program resource viewer, seperti Resource penggodam) ke ruang alamat (virtual memory) winmine dan string tersebut adalah "Minesweeper". Kod yang ditandakan dengan warna kuning plak sama dengan kod sebelum ni, tapi string yang dimuatkan ke memori adalah "by Robert Donner and Curt Johnson". Kod bertanda pink plak digunakan untuk load icon Minesweeper (jugak dari resource) dan akhir sekali, fungsi ShellAboutW digunakan untuk memaparkan "about box" Minesweeper. Kod yang aku tak tanda tu merupakan prolog dan epilog untuk prosedur tersebut, untuk setup storage untuk local variables. Seperti yang dapat dilihat, prosedur ni dinamakan secara automatik oleh IDA dengan nama sub_1003D1D. Bila dah dapat kesan tugas suatu prosedur tu, biasanya kita akan namakannya dengan nama yang lebih bermakna, e.g "DisplayAboutBox" atau sebagainya. IDA dipanggil "interactive" disebabkan kebolehannya menerima input dari kita untuk membantu dalam analisis di mana kebanyakan disassembler lain tidak mampu lakukan. Kolum yang ader teks ".text:xxxxxxxx" tu adalah virtual address untuk kod ni, ".text" means ia ader dalam seksyen bernama ".text". Teks yang ditandakan dengan semikolon tu adalah komen (biasa digunakan dalam pengaturcaraan bahasa himpunan). Note that IDA secara automatik membantu memberikan komen untuk setiap cebisan kod yang dia tahu maknanya. Bukan tu ajer, kita bleh masukkan komen kita jugak. Biasanya dalam RCE kita akan convert laa prosedur ni dalam bentuk yang lebih kita fahami (biasanya high-level language yang kita familiar atau pseudocode). Contohnya, aku bleh convert prosedur ni ke bahasa C seperti berikut :

        void DisplayAboutBox() {
            TCHAR str1[128], str2[128];
            sub_10039E7(12, str1, 128);
            sub_10039E7(13, str2, 128);
            ShellAbout(hWnd, str1, str2, LoadIcon(hInstance, 100));
        }
    

Akhir sekali, untuk memahami output disassembler ni kita kena laa faham mengenai pengaturcaraan. Untuk contoh ni, kita kena faham pengaturcaraan bahasa himpunan, pengaturcaraan Windows dan juga struktur fail format PE (Portable Executable), iaitu format rasmi program executable dalam Microsoft Windows. Ni laa benda yang kita akan pelajari dalam bahagian2 seterusnya. Korang tak paham penerangan di atas sekarang ni takpe. Lain kali korang akan paham.

Kita perlu menggunakan disassembler yang betul untuk sistem yang betul kerana terdapat pelbagai senibina pemproses untuk komputer, begitu juga dengan format fail program yang biasa disertakan dengan pengepala (header) untuk membantu OS melaksanakan fail program tersebut dengan betul. Kebanyakan disassembler adalah spesifik kepada satu fail format dan satu senibina. IDA pula menyokong pelbagai jenis fail format dan senibina pemproses. Ini bermakna jika kita menggunakan IDA versi Windows, kita masih boleh memproses fail program ELF, yang biasa digunakan dalam Linux, ataupun fail program class, iaitu format yang digunakan oleh Java, dan bermacam-macam lagi laaa...

Satu perkara yang perlu diingati adalah disassembler hanya memproses isi fail program seperti mana ia terdapat dalam fail tersebut (analisis statik). Disassembler sesuai digunakan untuk analisis kod program yang "normal" dan linear. Kebanyakan virus zaman sekarang biasanya encrypt diaorang nyer code, atau guna poly/metamorphic engine yang surely disassembler takleh nak analisis. Untuk melakukan analisis secara dinamik, di mana kita bleh mengawal aliran kod dan ruang alamat sesuatu program, kita perlukan debugger.

debugger

Debugger ni memang tak asing laaa untuk para programmers, sebab ia salah satu tools yang digunakan oleh programmer dalam sesi debugging. Istilah "bug" ni digunakan untuk merujuk kepada "kesilapan" dalam program binari. Tapi tak semestinya ia disebabkan oleh kod program tu. Bleh jadik disebabkan oleh program lain yang berinteraksi dengan program tu, atau bleh jadik kod sistem operasi jugak. Kalau kod program tu tak dapat handle pelbagai cara bagaimana pengguna menggunakannya pun dikira mempunyai bug jugak. Bila dah nampak kesan kesilapan ni (e.g keluar error message ke, tiba2 hang ke), programmer biasanya gunakan debugger untuk kesan punca masalah. Debugger ni basically cam disassembler laaa.. bezanya kita laksanakan program tu di bawah kawalan debugger, maknanya kita bleh tengok setiap baris kod dilaksanakan dan setiap variable atau register berubah in real time.

Contoh2 debugger yang biasa digunakan untuk analisis program binari adalah seperti SoftIce, WinDbg (Platform SDK), OllyDbg, PEBrowse Professional Interactive dan lain2 laaa.. Kalau korang tanya mana2 cracker kat dunia nih, diaorang tentu kenal ngan SoftIce. Rasanya development SoftIce dah stop dah, maknanya takde laa lagi SoftIce baru dari company yang bikin menatang ni. Tapi ader gak rasanya bakal pengganti SoftIce, yang dipanggil Syser. Ni screenshot dari PC aku - SoftIce, tengah stop kat entrypoint (permulaan kod program) Minesweeper.



Seperti yang korang dapat lihat di atas, bahagian yang ditandakan dengan no. 3 tu adalah perwakilan kod program tersebut dalam bahasa himpunan. No. 1 plak tunjukkan registers (storan sementara dalam CPU). No. 2 plak adalah ruang ingatan dan no. 4 tempat kita berikan arahan untuk SoftIce (contohnya arahan "cls" tu laaa). Dari permulaan kod program ni, aku bleh "single step" setiap baris kod assembly ni atau modify kod ni untuk mengubah kelakuan program. Actually ader lagi resources lain yang aku tak tunjuk, contohnya FPU registers, MMX, XMM registers dan lain2 lagi.

Dengan debugger, aku bleh execute program arahan demi arahan, modify memory dan variables yang digunakan dalam program malah mengubah arahan dan banyak lagi laa. Biasanya programmer nyer debugging session disertakan dengan kod sumber dan basically dia debug kod dalam high level language, bukannya level assembly. Dan most programming language system ader debugger khas, terutamanya yang tak kompil ke native machine code. Nanti laa aku citer lagi banyak pasal ni.

hex editor/viewer

hex editor/viewer membolehkan kita melihat isi kandungan sebenar (mentah) sesuatu fail dalam sistem. Kita tau yang setiap fail, tak kira la fail imej ke, audio ke, video ke, exe ke semernya terdiri daripada nombo2 binari 0 dan 1 sahaja. Nombor2 ni mempunyai makna kepada program2 yang memahaminya, memprosesnya dan menterjemahkannya kepada bentuk yang lebih bermakna (e.g Winamp untuk mp3 files). Hex editor/viewer tidak memproses isi kandungan fail ni dan hanya memaparkan nombor2 binari yang membentuk fail tersebut. Contoh2 hex editor adalah seperti WinHex, Hex Workshop, BIEW, AXE, 010Editor dan banyak lagi. Kebanyakan hex editor bukan hanya mampu memaparkan isi kandungan fail, tapi juga disk dan memori. Sebagai contoh, screenshot di bawah adalah dari 010Editor (feveret aku) yang tengah memaparkan isi kandungan sektor pertama hard disk aku, atau yang kita kenali sebagai Master Boot Record (MBR).



Tetingkap utama dalam hex editor tu laa yang ader 3 kolum tu. Yang first untuk address/offset, yang kedua adalah isi kandungan fail dalam asas perenambelas (hex) dan yang ketiga adalah perwakilan ASCII (control character ngan ascii code > 127 dia wakili dengan dot jer). Hex editor/viewer memang sesuai laa kalau nak kaji format2 fail tertentu. Daripada gambar di atas, aku bleh nampak yang hard disk 40 GB aku cuma ader 1 partition jer, dengan ID 7 (NTFS filesystem). Ader jugak hex editor yang bleh paparkan isi fail selain daripada asas perenambelas (yang biasa adalah asas 2, 8 dan 10), dan kebanyakan hex editor jugak sediakan data interpreter (cam 010Editor Inspector kat sebelah kiri tu) untuk memudahkan analisis. Lain kali aku citer plak lebih details lagi mengenai hex editor feveret aku, terutama mengenai "template" feature.

monitoring programs

Program2 yang monitor system resources ni memang sangat berguna laa terutama untuk detect masalah dalam sistem dan melakukan pra-analisis. Terdapat banyak jenis resources yang kita bleh monitor, bergantung kepada keperluan kita. Contoh paling mudah adalah task manager di mana kita bleh tengok pelbagai maklumat mengenai proseses, users dan network connections dalam sistem. Dalam bahagian ni aku citer sikit jer dulu..

First sekali, aku perkenalkan korang dengan tools feveret aku, iaitu Process Explorer. Process Explorer ni bleh dikatakan cam Task Manager laa, cuma dia fokus kepada proses monitoring. Maknanya kita bleh dapatkan pelbagai maklumat mengenai setiap proses yang wujud dalam sistem, termasuklah fail program dan dll yang terlibat dan handles yang dipegang oleh setiap proses. Aku akan sentuh lagi pasal ni nanti.

Then kita ader File Monitor, yang monitor aktiviti filesystem, so kalau ader program sentuh fail2 sensitif korang bleh nampak laa dalam log File Monitor ni.

Kemudian kita ader Registry Monitor, yang monitor aktiviti registry, so kalau korang nak tau samada suatu program simpan data dalam registry korang, bleh laa tengok dengan Registry Monitor. Contohnya, dalam screenshot di bawah adalah tetingkap Registry Monitor tengah monitor registry access oleh Minesweeper.



Kita bleh nampak Minesweeper simpan settings kat subkey "HKCU\Software\Microsoft\winmine\" (HKCU means HKEY_CURRENT_USER). Dan nampak gayanya dia try QueryValue ke atas Tick dan Menu value tapi tidak berjaya (dua2nya takde dalam registry). Kita jugak bleh nampak kegunaan key lain seperti Time*, Name*, Height dan yang pastinya Minesweeper menggunakan registry untuk menyimpan setting dia. Bila kita ubah setting dalam game, ia akan menulis ke registry setting yang baru.

Actually ader banyak lagi monitoring programs yang lain yang sangat2 laa berguna dalam menganalisis program binari. Errr.. antivirus pun monitor gak, tapi ni menatang lain sama sekali, sebab virus bukan system resources. Dan sebenarnya ader banyak lagi tools yang tugasnya very specific dan sangat membantu dalam keje2 kotor kita ni. Tapi aku cuma akan perkenalkan korang kepada tools ni bila kita nak gunakannya dalam analisis contoh2 program dalam bahagian2 seterusnya.

----- tamat bahagian 1 -----

bersambung...




Kiriman ini telah diubahsuai oleh Ancient One: Aug 2 2006, 12:44 PM
Go to the top of the page
 
+Quote Post
hampeh
post Aug 2 2006, 12:45 PM
Kiriman #2


Ahli Sangat Rajin
******

Grup: Members
Kiriman: 3,988
Penyertaan: 19-November 04
Dari: teka la sampai dapat!!!
Ahli ke- 3,979



menarik gak ni .. smile.gif


--------------------
Selamat Hari Raya Maaf Zahir Batin
Go to the top of the page
 
+Quote Post
talapia
post Aug 2 2006, 12:57 PM
Kiriman #3


Ahli
***

Grup: Members
Kiriman: 350
Penyertaan: 30-December 05
Dari: peN drIve
Ahli ke- 13,332



ilmu tu..okie gak klu try


--------------------
..aKu buDak baRu bLajar..
Go to the top of the page
 
+Quote Post
takatoo
post Aug 2 2006, 01:01 PM
Kiriman #4


Ahli
***

Grup: Members
Kiriman: 126
Penyertaan: 17-April 06
Ahli ke- 16,231



akhirnya muncul juga ilmu ni dalam BM.Kalau baca english memang pening tak faham.

PUSH PUSH MOV CALL PUSH PUSH = buffer overflow


--------------------
http://www.blogeek.net
だってお腹がすいたもん
Go to the top of the page
 
+Quote Post
menatekera
post Aug 2 2006, 01:39 PM
Kiriman #5


Ahli
*

Grup: Learning
Kiriman: 28
Penyertaan: 14-July 06
Ahli ke- 18,299



Sapa-sapa yang dapat menguasai assembler/disassembler (ASM), nanti senang je nak reverse program (krack), terutamanya menerusi penggunaan OllyDBg. Belajar dari asasnya supaya dapat memahami setiap kod binary dan bagaimana program berfungsi. Kebanyakkan cracker hari ini menggunakan tools tersebut untuk menganalisa program untuk dibuat kracknya. Kalau dulu SoftIce yang paling masyhur sekarang OllyDbg pulak.

Reverse Engineering ni dianggap satu 'seni' juga, bukannya untuk melakukan krack semata2. Ini yang perlu diambil perhatian oleh setiap orang yang berminat dalam bidang ni. Sebaiknya kena ada asas untuk programming juga( samada VB, C, C++, Java, Delphi/Borland, Pascal, .Net dan lain-lain) bagi mereka yang berminat untuk belajar disassembler atau debugger. Walaubagaimanapun seseorang masih boleh menguasai Disassembler atau Debugger walaupun tidak tahu langsung bahasa programming kerana ilmu ini boleh berdiri dengan sendirinya.

Sekadar pendapat, betul tidak aku mana tau, aku sendiri pun tak tau. laugh.gif
Go to the top of the page
 
+Quote Post
Slvrchair
post Aug 2 2006, 04:19 PM
Kiriman #6


Ahli
***

Grup: Members
Kiriman: 304
Penyertaan: 5-October 05
Dari: Mutiara Damansara, PJ
Ahli ke- 11,013



hmmm gogogo ader jgk org yang bijok hal2 reverse-mereverse ni .....ok2.....dah lama tak main kut blkg nih...hahaha laugh.gif

leh gak refresh skit2 hehe wink.gif


--------------------
it's me: slvrchair[at]multive.com.my
//Training/Class Booking [Private/Group Adobe Flash 8/9 Training] : training[at]multive.com.my
//Product & Services [Enquiry/Request] : sales[at]multive.com.my
Go to the top of the page
 
+Quote Post
azz2005
post Aug 3 2006, 12:25 PM
Kiriman #7


Ahli
***

Grup: Members
Kiriman: 137
Penyertaan: 2-April 06
Ahli ke- 15,918



fuhh,best r ko Ancient One.. ohmy.gif
ko tau sume tuh..blaja dr ko r..buat la byk2 sket tutorial..
bley aku tumpang belajar..aku xtau apekebenda pun sal tuh.. unsure.gif blink.gif
Go to the top of the page
 
+Quote Post
FryShadow
post Aug 3 2006, 02:26 PM
Kiriman #8


Ahli Rajin
*****

Grup: Members
Kiriman: 1,807
Penyertaan: 1-June 05
Dari: Johorian
Ahli ke- 8,198



wohoo.. mmg best biggrin.gif harap2 leh sampai 10-20 page smile.gif


--------------------
http://fiviobusiness.qassia.com/
Go to the top of the page
 
+Quote Post
Slvrchair
post Aug 4 2006, 05:17 PM
Kiriman #9


Ahli
***

Grup: Members
Kiriman: 304
Penyertaan: 5-October 05
Dari: Mutiara Damansara, PJ
Ahli ke- 11,013



leh bagi jadual?takut terlepas kelas tutorial la.....smile.gif


--------------------
it's me: slvrchair[at]multive.com.my
//Training/Class Booking [Private/Group Adobe Flash 8/9 Training] : training[at]multive.com.my
//Product & Services [Enquiry/Request] : sales[at]multive.com.my
Go to the top of the page
 
+Quote Post
Ancient One
post Aug 8 2006, 12:20 PM
Kiriman #10


Ahli
***

Grup: Members
Kiriman: 492
Penyertaan: 12-June 04
Dari: Kota Kinabalu
Ahli ke- 857



Bahagian I : Asas pengaturcaraan

intro

Sebelum ni aku citer mukadimah jer (bahagian 0). Sekarang meh kita start dengan basic. RCE, secara umumnya bleh laa dikatakan songsangan untuk proses pembinaan program. Kalau dalam proses pembinaan program kita bermula daripada kod sumber dan berakhir menjadi program binari, songsangannya plak adalah untuk mendapatkan semula kod sumber daripada program binari ni. So, tak dapat dinafikan lagi memahami proses pembinaan program adalah sangat penting untuk memahami RCE. Tu sebab dalam bahagian ni kita akan belajar mengenai asas pengaturcaraan, khususnya untuk PC kita. Tapi sebelum aku citer pasal pengaturcaraan, meh kita kembali semula ke sekolah untuk belajar matematik. Ni kira matematik tahap tadika laa ni, sebab sebenarnya kita nak belajar mengira semula.


sistem pernomboran

Aku tak tau laa brape banyak bangsa manusia yang wujud kat dunia nih, tapi aku rasa laa kebanyakannya (kalau tak semer) sekarang mengira menggunakan sistem pernomboran asas 10 (decimal). Dalam sistem decimal, 10 simbol digunakan untuk mewakili kuantiti, iaitu angka 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 (ni kita nyer simbol laa.. lain bangsa lain plak simbolnya). Walaupun kecik2 dulu kita selalu start kira dengan nombor 1, rasanya sekarang ni kita tau laa yang simbol pertama dalam sistem ni adalah 0. Untuk mewakili nombor yang lebih besar dari 9 plak, kita cuma recycle simbol2 0 hingga 9 ni, iaitu turutan simbol ni kita ulang semula tapi dengan bilangan digit yang semakin bertambah. Contohnya penambahan sebanyak 1 kepada 9 kita tulis sebagai 10. "1" dalam "10" tu maksudnya turutan simbol asas dah disempurnakan sekali, dan "0" dalam "10" tu plak menandakan kita sedang berada pada simbol pertama untuk turutan yang baru nih.
Konsep yang perlu difahami di sini adalah dengan simbol2 asas ni, kita gunakannya untuk mewakili kuantiti yang semakin bertambah mengikut urutan, sehinggalah semernya telah digunakan, dan kemudian tambah satu digit lagi dan ikut semula turutan tersebut. Ni laa prinsip utama yang digunakan dalam semer sistem nombor, yang berbeza hanyalah bilangan simbol asas yang digunakan. Bila dah paham konsep ni, meh aku perkenalkan plak 2 lagi sistem pernomboran yang sangat penting dalam subjek RCE kita nih, iaitu sistem pernomboran asas 2 (binary) dan sistem pernomboran asas 16 (hexadecimal).


sistem binary. Dalam sistem binary, kita hanya gunakan dua simbol asas, iaitu 0 dan 1. Dengan mengikut konsep yang aku sebut kat atas tadi, jadual di bawah menunjukkan 10 nombor pertama dalam sistem decimal dan perwakilannya dalam sistem binary :


  decimal        binary
  -------        ------
     0             0
     1             1
     2             10
     3             11
     4             100
     5             101
     6             110
     7             111
     8             1000
     9             1001
  


sistem hexadecimal. Oleh kerana hanya ader 2 simbol dalam sistem binary, dah tentu banyak sangat laa digit yang perlu digunakan untuk mewakili nombor yang besar, dan dah tentu jugak payah kita nak manipulasi. So, wujud laa plak sistem hexadecimal, atau ringkasnya hex, menggunakan 16 simbol asas untuk mewakili kuantiti. Oleh kerana kita cuma ader 10 simbol jer untuk mewakili angka, iaitu 0-9, maka sistem hex, selain dari menggunakan 0-9, jugak menggunakan abjad A, B, C, D, E dan F untuk mewakili 6 simbol lagi, so kita ader turutan 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, dan F sebagai simbol asas. Aku letakkan plak kat bawah 20 nombor pertama dalam sistem decimal, binary dan jugak hexadecimal sebagai perbandingan :


  decimal        binary        hexadecimal
  -------        ------        -----------
     0             0                0
     1             1                1
     2             10               2
     3             11               3
     4             100              4
     5             101              5
     6             110              6
     7             111              7
     8             1000             8
     9             1001             9
     10            1010             A
     11            1011             B
     12            1100             C
     13            1101             D
     14            1110             E
     15            1111             F
     16            10000            10
     17            10001            11
     18            10010            12
     19            10011            13
  


*Note that 1 digit nombor hex (0 hingga F) bleh mewakili maner2 4 digit nombor binary (0 hingga 1111)*.

Tu jer laa yang aku nak citer pasal sistem pernomboran ni. Tak details lagi tu, just untuk memperkenalkan jer. Yang penting di sini kita patut paham yang sistem pernomboran yang berbeza-beza ni hanyalah kaedah yang berbeza untuk mewakili kuantiti. Kuantitinya tak berubah, cuma simbol yang kita gunakan untuk mewakilinya saja yang berbeza. Perhatikan jugak nombor yang dinyatakan dalam asas sistem tersebut, e.g asas 2, 10, 16 dan sebagainya adalah bilangan simbol asas yang digunakan dalam sistem tersebut. So kalau aku guna asas 36 misalnya, ader 36 simbol asas laa, maknanya 1 digit dalam simbol asas 36 ni bleh mewakili 36 nombor pertama dalam sistem decimal. Aku bleh guna simbol2 0-9 dan A-Z sebagai simbol untuk mewakili nombor2 dalam asas 36 ni. Tu contoh laa. In case korang tertanya-tanya aper kepentingan aku kenalkan 2 sistem nombor - binary dan hex ni, meh laa pakat2 bacer topik seterusnya kat bawah.


kenali PC kita

Errr.. tak masuk lagi sebenarnya topik pengaturcaraan. Kita berkenalan dulu dengan lebih rapat dengan PC kita. Ye laa.. orang cakap... tak kenal maka tak cinta smile.gif.

PC, secara dasarnya mempunyai 3 komponen utama iaitu CPU, memori dan alat input/output (I/O) dan CPU bleh berkomunikasi dengan memori dan I/O secara terus.

CPU. CPU (Central Processing Unit) adalah komponen yang bertanggungjawab melaksanakan arahan komputer dan memproses data2 yang terlibat semasa perlaksanaan arahan2 ni. Aku guna istilah CPU untuk merujuk kepada pemproses utama dalam PC. CPU ni la menatang paling penting dalam PC kita dan ia bleh laa dianggap "otak" untuk PC. Errr.. komponen lain pun penting gak, tapi keadaan kat dalam CPU jer laa yang paling meriah. CPU amik arahan yang perlu dilaksanakan daripada memori dan data plak bleh disimpan/dibaca ke/dari memori atau I/O.

CPU ni sebenarnya blehlaa kita anggap sebagai koleksi suis2 elektronik. Aku yakin korang penah nampak suis lampu kat maner2 yang bleh mempunyai 2 keadaan, samada On atau Off. Kalau kiter On, lampu menyala dan kekal camtu selagi kita tak ubah suis ke Off, dan sebaliknya. Camtu laa jugak suis2 elektronik dalam CPU ni. Bezanya suis ni takde laa beso cam suis lampu, tapi dalam saiz mikroskopik, kena guna mikroskop baru bleh nampak. Dalam CPU, suis2 elektronik ni dibentuk daripada transistor. Kita bleh perhatikan yang sifat suis elektronik ni yang hanya bleh bezakan 2 keadaan fizikal memang "ngam" sangat laa dengan sistem binary yang aku citer kat atas tadi. Kita bleh anggap yang keadaan On mewakili 1 dan keadaan Off mewakili 0. So, secara matematiknya, CPU (dan komputer umumnya) hanya memanipulasi nombor dalam sistem binary. Satu digit nombor binary kita panggil sebagai bit (BInary digiT) dan ni laa unit data paling asas dalam CPU. Transistor kat dalam CPU bukan hanya ader sikit, tapi juta2. Transistor2 ni disusun mengikut konfigurasi tertentu (dipanggil get logik) sehingga ia bleh digunakan untuk melakukan operasi2 tertentu ke atas nombor2 binari ni. Tak perlu laa aku citer details pasal struktur fizikal ni.. nanti lain plak jadinya...

Setiap CPU telah dibina di dalamnya set arahan yang ia fahami dan tugas2 yang perlu dilakukan untuk melengkapkan arahan ni. Setiap arahan diwakili oleh siri nombor binari yang unik, iaitu opcode (OPeration CODE). Contohnya kalau CPU tengah amik nombor binary 10010010 dari memori sebagai arahan, unit yang bertanggungjawab dalam CPU akan mencari arahan yang mempunyai opcode 10010010 dan memprosesnya jika arahan ni wujud. Ringkasnya cam tu laa....

Semer CPU yang kita guna kat PC tergolong dalam satu keluarga CPU yang kita panggil sebagai 80x86, atau x86. Bila aku sebut satu keluarga kat sini basically maknanya semer CPU dalam keluarga ni menyokong set arahan asas yang sama. Latest CPU dalam satu keluarga, walaupun ditambah dengan arahan2 baru, masih menyokong arahan2 asas CPU sebelumnya. Aku yakin korang tentu lebih tau nama2 CPU yang dikeluarkan oleh Intel dan AMD. Contohnya 80386, K6, Pentium, Celeron, Duron, Athlon, Sempron dan lain2 laa. PC dulu2 guna CPU 16-bit, cam 8088, 8086. Then PC kita guna plak CPU 32-bit cam 80386, Pentium dan lain2. Sekarang ni plak kita dah bleh guna CPU 64-bit, cam Athlon 64. Orang selalu sebut CPU 64-bit dari AMD sebagai AMD64, dan Intel plak panggil EM64T, aper2 pun kat sini aku rujuk dua2 dengan nama x86-64. 16/32/64 bit kat sini biasanya merujuk kepada saiz satu general purpose register so kalau kita ader CPU 16-bit maknanya dia bleh manipulasi data bersaiz 16 bit sekaligus.

memori. Memori ni merujuk kepada memori utama dalam PC, yang selalu kita sebut sebagai RAM, atau nama penuhnya Random Access Memory. Program dan data disimpan dalam RAM sebagai storan sementara sehinggalah ia diperlukan oleh CPU. "Random Access" maknanya kat sini bukanlah ia diakses secara rawak oleh CPU, tapi ia diakses mengikut alamat. Kita bleh anggap RAM sebagai terbahagi kepada "bilik"2, yang kita panggil sebagai sel memori di mana data disimpan dan diambil. Setiap sel ni mempunyai saiz yang sama dan bleh menyimpan beberapa bit data. Setiap sel mempunyai alamat yang unik dan dinomborkan mengikut urutan bermula dari 0, so sel pertama mempunyai alamat 0. Oleh kerana setiap setiap sel mempunyai alamat yang unik, maka CPU bleh laa gunakan alamat ni untuk akses mana2 sel yang ia kehendaki secara direct. Actually dalam PC, setiap sel memori ni bersaiz tepat 8 bit. Satu kumpulan 8 bit data kita panggil sebagai byte, maknanya 1 byte bleh mewakili 8 digit nombor binari. RAM disebut sebagai "byte-addressable memory" kerana setiap alamat adalah dalam turutan 1 byte. So bila kita cakap byte ke 100 dalam memori, kita merujuk kepada sel memori ke 100. Byte adalah unit asas data dalam memori dan bila2 masa kita read/write data dari/ke memori, kita hanya berurusan dengan data dengan saiz minimum 1 byte, takleh laa suka2 nak akses 1 atau 2 bit jer secara direct. Nanti kita akan belajar plak aper beza physical memory dengan virtual memory, physical address, logical address, virtual address dan lain2 laa..

I/O. I/O ni, bagi kita adalah menatang cam monitor, keyboard, mouse, printer dan sebagainya yang kita gunakan untuk berinteraksi dengan komputer. I/O ni perantara kita dengan CPU laa kiranya. Bagi CPU plak, I/O ni lebih kurang sama laa cam memori, di mana ia bleh read/write data dari/ke I/O dan setiap alatan input/output ni mempunyai alamat yang unik gak.

Aku nak tambah lagi 2 menatang yang penting jugak cam 3 komponen kat atas. First sekali aku nak citer pasal storan tetap (e.g disk) sebagai tempat simpanan untuk data yang tak digunakan oleh CPU pada satu2 masa. Meh kita bayangkan disk ni sebagai kabinet fail kat opis korang dan RAM tu plak meja kerja korang, dan korang plak adalah CPU. Fail yang korang nak guna (proses) maser tu dah tentu lebih mudah diakses kalau letak atas meja dan fail yang tak berkaitan dengan keje korang maser tu bleh laa simpan kat kabinet, untuk tidak menyesakkan meja. For sure memang payah laa nak proses data dalam fail kalau biar jer kat kabinet, mesti kena letak kat meja gak. Camtu laa kiranya kegunaan storan tetap ni. Satu lagi adalah benda bukan fizikal, kita tak nampak tapi memang sangat menakjubkan, iaitu program. Tanpa program, PC kita basically tak best laa.. Program ni laa yang menjadik "penterjemah" kita bila berinteraksi dengan komputer. Terdapat pelbagai jenis program yang ader untuk melakukan pelbagai tugas dan menyelesaikan pelbagai masalah manusia dan yang paling penting sekali antaranya adalah OS (sistem operasi) yang menjadi antaramuka antara kita dan komponen komputer dan juga menyediakan servis2 kepada program2 lain seperti penyunting teks, kalkulator dan sebagainya.



konsep pengaturcaraan

Pengaturcaraan komputer, bagi aku maknanya ringkas jer, iaitu mengarahkan komputer untuk melakukan sesuatu. Secara tradisionalnya, kita mengaturcara dengan membina program yang mengandungi arahan2 untuk dilaksanakan oleh CPU. Proses pembinaan program bleh diringkaskan seperti yang ditunjukkan dalam rajah di bawah :



Kod sumber biasanya disediakan dalam bentuk fail dalam storan komputer yang ditulis mengikut spesifikasi bahasa pengaturcaraan yang tertentu. Ia bleh dianggap sebagai arahan yang kita hendak CPU laksanakan daripada perspektif bahasa pengaturcaraan tersebut. Kemudian kod sumber ni diberikan sebagai input kepada compiler (penyusun ke aper tah). Compiler adalah program yang menterjemahkan kod sumber ni kepada program yang terdiri daripada bahasa mesin (siri nombor binary), iaitu satu-satunya bahasa yang difahami oleh komputer. Aku gunakan istilah compiler untuk merujuk kepada semer program yang menterjemahkan kod sumber kepada bentuk kod yang akan dilaksanakan. Juga bleh jadik terdapat lebih dari satu program yang digunakan untuk menterjemahkan kod sumber (compiler system). Kod sumber yang ditulis dengan bahasa pengaturcaraan biasanya ader laa iras2 English gabung ngan formula matematik. Contohnya, untuk membina program yang menambah 3 nombor, kita tulis kod sumbernya seperti berikut, dalam satu bahasa pengaturcaraan yang dipanggil C :


  #include <stdio.h>

  void main() {
    int x, y, z;
    printf("Berikan 3 nombor integer : ");
    scanf("%i %i %i", &x, &y, &z);
    printf("Jumlah %i+%i+%i = %i", x, y, z, x+y+z);
  }
  


Kod sumber ni kemudiannya diproses oleh compiler yang memahami bahasa C (C compiler laa). Sebagai penerangan ringkas, pernyataan matematik x+y+z dalam kod C di atas mewakili arahan untuk menambah 3 nombor yang disimpan dalam pembolehubah x, y, dan z dalam memori. #include adalah arahan untuk komponen dalam compiler (prapemproses), scanf dan printf membolehkan kita menerima input dan memaparkan output ke paparan komputer. Kalau kod sumber ditulis dengan betul, hasilnya merupakan program binari yang kalau kita lihat isinya di dalam memori adalah siri2 nombor binari, e.g (dalam hex) :


55 8B EC 83 EC 0C 68 40 A0 40 00 E8 5C 00 00 00
83 C4 04 8D 45 F4 50 8D 4D FC 51 8D 55 F8 52 68
5C A0 40 00 E8 2C 00 00 00 83 C4 10 8B 45 F8 03
45 FC 03 45 F4 50 8B 4D F4 51 8B 55 FC 52 8B 45
F8 50 68 68 A0 40 00 E8 20 00 00 00 83 C4 14 33
C0 8B E5 5D C3 8D 44 24 08 50 FF 74 24 08 68 88
A0 40 00 E8 69 02 00 00 83 C4 0C C3 53 56 57 BE
A8 A0 40 00 56 E8 78 11 00 00 8B F8 8D 44 24 18
50 FF 74 24 18 56 E8 B9 12 00 00 56 57 8B D8 E8
...... dan seterusnya


*Note that 2 digit nombor hex bleh mewakili mana2 8 digit nombor binari (8 bit, atau 1 byte). Oleh kerana 1 byte data adalah unit asas dalam memori, kita selalu tulis data menggunakan sistem nombor hex. Setiap dua digit nombor hex bleh mempunyai nilai di antara 0 hingga 255 decimal.*

Sepertimana kita berkomunikasi sesama manusia dengan menggunakan bahasa manusia (e.g Melayu, English, Jepun, Esperanto dan sebagainya), kita "berkomunikasi" dengan komputer menggunakan bahasa pengaturcaraan. Macam bahasa manusia jugak, bahasa pengaturcaraan ada banyak jenis dan dialek. Rasanya ader beribu-ribu gak bahasa pengaturcaraan yang wujud sejak komputer digital mula wujud sampai laa sekarang ni. Kita bleh kategorikan bahasa pengaturcaraan dalam beberapa cara, tapi kat sini, ikut cara aku, aku cuma bahagikan kepada 3 - bahasa mesin, bahasa aras rendah (Low Level Language - LLL) atau lebih dikenali sebagai bahasa himpunan dan bahasa aras tinggi (High Level Language - HLL).

Bahasa C adalah salah satu dari ribuan HLL yang wujud dan HLLs dinamakan sedemikian sebab kita lebih cenderung memahaminya daripada LLL dan bahasa mesin. Ader banyak laa nama2 HLL, contohnya C, Fortran, Cobol, Pascal, Ada, Lisp, Algol, C++, Basic, Perl, C#, Forth, Javascript, Java dan macam2 lagi laa.. Model yang digunakan oleh HLLs ni untuk menyelesaikan masalah kita panggil sebagai paradigma pengaturcaraan. Kita ader procedural paradigm cam C, Pascal dan Fortran; kita ader object-oriented paradigm cam SmallTalk; kita ader functional paradigm cam Lisp ngan Haskell dan lain2 model lagi laa.. Selalunya setiap bahasa pengaturcaraan menyokong satu model tapi ader gak yang support lebih dari 1, contohnya C++ support procedural model ngan object-oriented model.

Bahasa himpunan, atau ringkasnya asm (assembly language), jugak kita panggil sebagai LLL direka untuk memberikan kuasa penuh kepada pengaturcara untuk mengakses setiap arahan mesin dalam set arahan yang difahami oleh CPU dan jugak persekitaran pengaturcaraan yang disediakan oleh CPU. So bleh katakan aper2 menatang yang bleh diprogramkan dalam CPU bleh diakses dengan asm. Oleh kerana CPU berlainan bleh mempunyai set arahan yang berbeza, maka asm pun bleh berbeza-beza antara semer CPU ni. Kita selalu panggil pengaturcaraan asm kat PC sebagai x86 assembly programming, untuk merujuk kepada asm yang khusus kepada CPU dalam keluarga x86. Assembler, atau assembly compiler adalah program yang bertanggungjawab menterjemahkan kod sumber asm kepada bahasa mesin. Arahan mesin, apabila dilihat dari perspektif asm; atau kita bleh cakap setiap arahan asm, mempunyai format berikut :

<mnemonik arahan> <pengoperasi>

<mnemonik arahan> adalah arahan mesin dalam asm, contohnya ADD untuk operasi tambah, JMP untuk JuMP, CMP untuk CoMPare, MOV untuk MOVe dan sebagainya. Kita bleh dapatkan senarai arahan dalam set arahan yang disokong oleh satu2 CPU daripada pengeluar CPU tersebut, dan untuk PC, kita bleh laa mintak kat Intel atau AMD (actually bleh download dari website depa ni laa). Aku tak tau laa exact URL (rasanya URL dia bleh berubah-ubah.. pelik), tapi bleh cari kat developer.intel.com dan dokumen tu tajuk utama dia "IA-32 Intel® Architecture Software Developer’s Manual". Rasanya ader 3 bahagian dan bahagian kedua adalah rujukan set arahan. Kalau korang nak tau basic programming environment untuk x86 ni laa dokumen2 yang patut menjadi rujukan (bahagian 1 dan 2). Bahagian 3 adalah untuk pengaturcara sistem (e.g OS developers). Dari website AMD pun bleh gak download. Tajuk utama dokumen2 ni (ader 4-5 bahagian) adalah "AMD64 Architecture Programmer’s Manual". Setiap arahan bleh menerima 0, 1, 2 atau 3 pengoperasi (parameter), bergantung kepada tugas arahan tersebut. Contohnya, arahan NOP (No OPeration) tak perlukan aper2 parameter, so kita tulis sebagai satu baris kod "nop" sahaja. Bagi arahan yang menerima satu pengoperasi, jenis pengoperasi ni biasanya adalah samada alamat memori atau register (register adalah storan sementara kecik kat dalam CPU, so bleh diakses dengan sangat pantas). Contohnya arahan INC (INCrease) bleh digunakan untuk menambah nilai pada satu alamat memori (misalnya 400000) sebanyak 1, so kita tulis sebagai "inc [400000]". Nanti laa aku citer lagi dengan betul pasal asm programming ni.

Setiap arahan2 mesin biasanya diwakili oleh satu baris arahan dalam asm, iaitu bleh dikatakan kod mesin dan kod asm mempunyai hubungan 1-1. Maknanya lebih mudah menukarkan kod asm kepada kod mesin (dan sebaliknya) daripada menukarkan kod HLL kepada kod mesin (dan sebaliknya). Tu sebab asm ni tersangat laa penting dalam subjek RCE kita. HLL diterjemahkan oleh compiler ke bahasa mesin dan dengan disassembler plak kita terjemahkan semula bahasa mesin ni kepada asm, pendek kata, kita dapatlaa semula kod program tu, tapi dalam LLL, bukannya HLL. Sebab kod HLL adalah kompleks dan pernyataan kod program dalam HLL biasanya diwakili oleh beberapa arahan asm, malah bleh gak sampai beratus-ratus. Tanpa sebarang maklumat yang membolehkan bahasa mesin ditukarkan semula ke HLL, terjemahan ni memang mustahil laa. Kesimpulannya kat sini kita kena kenali asm dengan lebih rapat lagi laa.. yang aku akan citer kat bahagian seterusnya.


bersambung.....


--------------------
NOTE: pengguna ini telah meninggal dunia. kepada sesiapa yang tau kewujudan user ini dalam forum ini, sila doakan kesejahteraan dia. sesiapa yang pernah berdendam dengannya, pohon ampunkan sahaja dia semoga dia dan anda tergolong dalam manusia yang baik dan mulia
(edited by moderator)
Go to the top of the page
 
+Quote Post
Slvrchair
post Aug 8 2006, 02:39 PM
Kiriman #11


Ahli
***

Grup: Members
Kiriman: 304
Penyertaan: 5-October 05
Dari: Mutiara Damansara, PJ
Ahli ke- 11,013



wahh kelas dah start...harap tak lmbt cikgu smile.gif tak sabar utk kelas akan dtg....


--------------------
it's me: slvrchair[at]multive.com.my
//Training/Class Booking [Private/Group Adobe Flash 8/9 Training] : training[at]multive.com.my
//Product & Services [Enquiry/Request] : sales[at]multive.com.my
Go to the top of the page
 
+Quote Post
Syeeikh
post Aug 12 2006, 09:24 AM
Kiriman #12


Ahli
**

Grup: Members
Kiriman: 62
Penyertaan: 3-April 05
Dari: Kuantan
Ahli ke- 7,176



Ok! kelas dah bermula. Saya ikutinya dengan penuh minat. Harap sifu bagilah alamat e-mail untuk tanya soalan yang tak faham...
Go to the top of the page
 
+Quote Post
Ancient One
post Aug 15 2006, 11:41 AM
Kiriman #13


Ahli
***

Grup: Members
Kiriman: 492
Penyertaan: 12-June 04
Dari: Kota Kinabalu
Ahli ke- 857



Bahagian I.I : Pengaturcaraan Bahasa Himpunan

intro

Sebelum ni aku tekankan kepentingan memahami bahasa himpuan (asm) dalam RCE. Oleh sebab tu kat sini kita akan belajar mengenai asm. Menatang yang kita panggil sebagai bahasa himpunan ni sebenarnya hanyalah perwakilan simbolik arahan2 dalam set arahan suatu CPU. Tak lebih dari tu. So, instead of tulis 11000001010000000.... yang takde kesudahan atau tulis tambah nilai pada lokasi 100 ke register eax, kita bleh tulis sebagai add eax, [100]. Bila belajar mengaturcara dengan asm, kita sebenarnya mempelajari menggunakan suatu assembler yang khusus. Maknanya kat sini assembler yang berlainan bleh mempunyai sintaksis yang berbeza untuk mewakili arahan mesin yang sama. Hanya sebagai contoh, katakan kita ingin menulis arahan untuk menyalin suatu nombor bersaiz 4 bytes pada alamat memori x kepada register bernama eax. Dengan assembler tertentu kita akan tulis arahan ni sebagai


  mov eax, dword [x]


tapi dengan assembler tertentu yang lain plak, kita kena tulis


  mov eax, dword ptr x


ader plak satu assembler tu kita kena tulis sebagai


  mov eax, d$x


dan lebih teruk lagi, ader yang terima arahan asm camni


  movl x, %eax


Ni laa kita punya standard sintaksis asm, iaitu takde standard. Kalau korang develop assembler korang sendiri, bleh laa cipta sintaksis yang korang suka. Tapi secara umumnya, sintaksis pertama dan kedua biasa digunapakai oleh assembler yang popular dan jugak output dari disassembler atau debugger. Sintaksis yang ketiga tu actually untuk RosAsm dan yang kedua plak untuk GAS (GNU nyer assembler) dan sintaksisnya diaorang panggil sebagai sintaksis at&t. Penting gak untuk kenali sintaksis yang berbeza ni sebab kadang2 kat internet ader kod asm atau senarai disassembly yang ditulis dengan sintaksis tah aper2 so kalau kita tak paham sintaksis ni payah laaa. Tapi oleh kerana dalam asm kita ader sedikit rules (e.g takleh mov data dari memori ke memori) so sesetengah sintaksis ni kita bleh paham laa maknanya secara automatik. Oleh kerana menatang ni takde sintaksis piawai, ader baiknya aku terhadkan tutorial ni dengan mempelajari satu assembler jer, iaitu assembler feveret aku yang dipanggil sebagai Flat Assembler (FASM). Kalau korang rasa2 korang dah expert tang asm ni bleh laa melarikan diri dari bahagian ni.

Sedikit mengenai FASM

SEMUA sample kod asm (bukan senarai disassembly) dalam seluruh tutorial ni adalah menggunakan sintaksis FASM, so aku harap korang bleh download FASM dan install kat sistem korang. FASM bleh dimuatturun dari download section laman web rasmi FASM kat http://flatassembler.net/download.php. Note that ader 4 jenis pakej bleh korang download iaitu untuk DOS, Windows, Linux dan UNIX/libc (dalam bentuk object file, bukan exe). Aku nak korang download versi untuk Windows (fasmwxxx.zip, di mana xxx adalah version number). Maser aku taip ni, latest version adalah 1.67.7. Bila korang dah download, cara nak install mudah jer - just extract ke mana2 folder yang korang suka, aku assume ke folder C:\Dev\FASM\. Bila dah extract tu, dalam folder C:\Dev\FASM\, bleh laa nampak senarai fail dan subfolder berikut :


<EXAMPLES>
<INCLUDE>
<SOURCE>
FASM.EXE
FASMW.EXE
FASM.PDF
LICENSE.TXT
WHATSNEW.TXT


FASM.EXE adalah assembler berasaskan command line, i.e kena run dari command prompt. FASMW.EXE plak penyunting kod yang dilengkapi dengan assembler. Fail FASM.PDF tu manual untuk FASM, kat sini korang bleh bacer laa arahan2 yang berkaitan dengan assembler ni dan camne nak gunakannya. Lain2 tu paham2 sendiri laa yer. Folder SOURCE mengandungi kod sumber untuk FASM, yang korang bleh modified dan assemble semula dengan FASM, dan cipta assembler korang sendiri smile.gif. Kalau aku ader masa karang aku citer pasal FASM nyer internal plak.. tapi ni dah masuk bab lain plak dah. Aper2 pun korang bleh gunakan FASMW.EXE untuk sunting fail kod asm dan compile (menu Run->Compile atau gunakan keyboard shortcut CTRL+F9 untuk compile dan F9 untuk compile dan seterusnya run program).

Bermain dengan FASM

Run FASMW.EXE dan taip teks (italic) berikut : mov ax, 100. Save sebagai fail test.asm kat desktop atau kat maner2 laa yang korang suka. Then tekan CTRL+F9 (compile). Fasm akan hasilkan fail bernama test.bin dalam folder yang sama dengan fail test.asm tadi. Fail test.bin ni bersaiz 3 bytes dan kalau korang tengok isinya dengan hex editor, isinya adalah B8 64 00. Dengan merujuk kepada rajah kod sumber->compiler->program sebelum ni, fail test.asm adalah kod sumber, fasm sebagai compiler dan test.bin plak sebagai program, iaitu output. Kalau korang rename test.bin ke test.exe dan cuba execute fail ni, Windows akan detect fail ni sebagai program binari DOS (plain binary) dan cuba muatkannya ke dalam memori dan melaksanakan kod program ni. Dalam cara yang paling ringkas, camni laa proses pembinaan program berlaku. Tapi realitinya takde laa ringkas camni, dengan melibatkan fail2 kod sumber dan fail sumber yang lain dan memerlukan compiler system yang terdiri daripada beberapa program khas, seperti compiler dan linker.

Sekarang cuba plak taip db "ABC" (padam yang sebelum nih) dan compile. Output test.bin sekarang bersaiz 3 bytes dan isinya adalah 41 42 43 (hex). Bukak dengan notepad kita akan nampak teks ABC[/i]. Kita bleh lihat FASM sebagai byte generator dari satu perspektif di mana kita menggunakan arahan2 tertentu untuk menjana nombor dan FASM jugak adalah assembler sebab ia menterjemahkan arahan asm kepada arahan mesin. Sekarang taip plak format pe dan kita akan dapat output file dengan nama test.exe bersaiz 512 bytes! Ni menunjukkan FASM jugak adalah compiler/linker sebab dia bleh hasilkan format2 tertentu. Arahan2 bukan arahan asm yang mengarahkan assembler untuk melakukan sesuatu, seperti db, format dan lain2 adalah arahan untuk assembler, bukannya arahan asm. Dengan db 0 misalnya, kita mengarahkan FASM untuk meletakkan 1 byte data yang mempunyai nilai 0 pada output file tersebut.

Assembler takde laa suka2 nak terima aper2 arahan yang kita tulis. Kalau dia takleh proses arahan yang dia tak paham, assembler akan paparkan mesej kesilapan dan takleh laa dia hasilkan output. Contohnya, bila kita tulis dx 0 FASM akan paparkan mesej kesilapan error: illegal instruction. sebab dia tak paham arahan ni.

[b]Pengaturcaraan Asm dengan FASM


Actually kat atas tadi aku cuma nak korang familiar dengan FASMW. Takde tujuan lain. Kalau korang nak guna console version (FASM.EXE) bleh laa bukak command prompt dan execute fasm.exe. Console version ni terima paling sikit satu parameter (iaitu nama fail input) dan bleh jugak berikan satu lagi parameter (iaitu nama fail output). Sekarang meh kita belajar camne nak tulis program dengan asm menggunakan fasm sebagai assembler. Kat sini aku cuma citer pasal CPU 32-bit. Kalau ader orang sedekah x86-64 machine kat aku bleh laa plak aku citer pasal pengaturcaraan asm dengan CPU 64-bit wink.gif. Oleh kerana kat sini kita gunakan platform Windows, atau lebih spesifik lagi Windows XP, maka sekaligus aku akan citer gak pasal pengaturcaraan Windows, dari perspektif sorang asm programmer. Pengaturcaraan Windows dengan x86 asm orang selalu panggil sebagai Win32asm, dan kalau guna fasm sebagai assembler, kita panggil sebagai Win32Fasm (aku reka sendiri... hehehe).

First sekali aku nak bagitau cara nak tulis nombor dalam kod asm. Untuk tulis