Bahasa Asembly Tutorial ( x86 )

Assalamualaikum wr wb. Selamat datang di blog Ahmad kurnia,semoga anda dalam keadaan sehat walafiat. semoga artikel yang saya tulis bermanfaat bagi saya dan anda ynag membacanya.

Bahasa Asembly Tutorial ( x86 )



The GNU Assembler , gas , menggunakan sintaks yang berbeda dari apa yang  mungkin akan menemukan di setiap referensi manual x86 , dan instruksi dua - operan memiliki sumber dan tujuan dalam urutan yang berlawanan . Berikut adalah jenis-jenis instruksi gas :
    opcode ( mis. , pushal )
    opcode operan ( misalnya , pushl % edx )
    Sumber opcode , dest ( misalnya , movl % edx , % eax ) ( misalnya , addl % edx , % eax )
Dimana ada dua operan , yang paling kanan adalah tujuan. Yang paling kiri adalah salah satu sumber.
Misalnya, movl % edx , % eax berarti Pindahkan isi edx mendaftar ke eax register . Sebagai contoh lain , addl % edx , % eax berarti Tambahkan isi edx dan eax register , dan menempatkan jumlah dalam eax register .
Termasuk dalam perbedaan sintaksis antara gas dan perakit Intel adalah bahwa semua nama register yang digunakan sebagai operan harus diawali dengan persen ( % ) tanda , dan nama instruksi biasanya berakhir baik " l " , " w " , atau " b " , menunjukkan ukuran operan : long atau real ( 32 bit ) , word ( 16 bit ) , atau byte ( 8 bit ) , masing-masing. Untuk tujuan kita , kita biasanya akan menggunakan " l " ( panjang ) akhiran .
80.386 + Daftar Set
Ada nama yang berbeda untuk register yang sama tergantung pada apa bagian dari register yang ingin Anda gunakan . Untuk menggunakan set pertama dari 8 bit eax ( bit 0-7 ) , Anda akan menggunakan % al . Untuk set kedua dari 8 bit ( bit 8-15 ) dari eax Anda akan menggunakan % ah . Untuk merujuk ke terendah 16 bit eax ( bit 0-15 ) bersama-sama Anda akan menggunakan % kapak . Untuk seluruh 32 bit Anda akan menggunakan % eax ( 90 % dari saat ini adalah apa yang akan Anda gunakan ) . Bentuk nama register harus setuju dengan akhiran ukuran instruksi .
Berikut adalah register prosesor penting :
    EAX , EBX , ECX , EDX - " tujuan umum " , lebih atau kurang saling dipertukarkan
    EBP - digunakan untuk mengakses data pada stack
                    - Ketika register ini digunakan untuk menentukan alamat , SS adalah
                      digunakan secara implisit
    ESI , EDI - register index , relatif terhadap DS , ES masing-masing
    SS , DS , CS , ES , FS , GS - register segmen
                      - ( Ketika Intel pergi dari 286 ke 386 , mereka pikir
                         bahwa menyediakan register segmen yang lebih akan lebih
                         berguna untuk programmer daripada menyediakan lebih umum -
                         register tujuan ... sekarang , mereka memiliki dasarnya
                         Prosesor RISC dengan GPR hanya _FOUR_ ! )
                      - Ini semua hanya 16 bit dalam ukuran
    EIP - program counter (instruction pointer ) , relatif terhadap CS
    ESP - stack pointer , relatif terhadap SS
    EFLAGS - kode kondisi , bendera a.k.a.
segmentasi
Kami menggunakan segmen 32 - bit fitur dari 486 Menggunakan 32 - bit dibandingkan dengan 16 - bit memberi kita banyak keuntungan :
Tidak perlu khawatir tentang 64K segmen . Segmen dapat 4 gigabyte panjang di bawah arsitektur 32-bit .
Segmen 32-bit memiliki mekanisme perlindungan untuk segmen , yang Anda memiliki pilihan untuk menggunakan .
Anda tidak harus berurusan dengan semua itu jelek 16 - bit mentah yang digunakan dalam sistem operasi lain untuk PC , seperti DOS atau OS / 2 ; 32-bit segmentasi benar-benar suatu keindahan dibandingkan dengan itu.
alamat i486 terbentuk dari alamat dasar segmen ditambah offset . Untuk menghitung alamat memori mutlak , i486 angka keluar yang register segmen yang digunakan , dan menggunakan nilai dalam register segmen sebagai indeks ke dalam tabel deskripsi global yang ( GDT ) . Masuknya di GDT mengatakan ( antara lain ) apa alamat absolut dari awal segmen ini . Prosesor mengambil alamat dasar ini dan menambahkan pada offset untuk datang dengan alamat absolut akhir untuk operasi . Anda akan dapat melihat di manual 486 Untuk informasi lebih lanjut tentang hal ini atau tentang organisasi GDT itu .
i486 memiliki 6 segmen register 16 - bit , yang tercantum di sini dalam rangka kepentingan :
CS : Daftar Kode Segmen
Ditambahkan untuk mengatasi selama instruksi fetch .
SS : Daftar Stack Segmen
Ditambahkan untuk mengatasi selama akses stack.
DS : Daftar Segmen data
Ditambahkan untuk mengatasi ketika mengakses operan memori yang tidak pada stack .
ES , FS , GS : Register Segmen Ekstra
Dapat digunakan sebagai register segmen tambahan ; juga digunakan dalam instruksi khusus yang mencakup segmen ( seperti tali salinan ) .
Arsitektur x86 mendukung mode pengalamatan yang berbeda untuk operan . Sebuah diskusi tentang semua mode luar cakupan tutorial ini , dan Anda bisa merujuk ke referensi manual x86 favorit Anda untuk diskusi menyakitkan - rinci dari mereka . Register segmen yang khusus, Anda tidak dapat melakukan
    movw seg - reg , seg - reg
Anda bisa, bagaimanapun , melakukan
    movw seg - reg , memori
    memori movw , seg - reg
    movw seg - reg , reg
    movw reg , seg - reg
Catatan : Jika Anda MOVW % ss , kapak % , maka Anda harus xorl % eax , % eax pertama yang menghapus high-order 16 bit dari % eax , sehingga Anda dapat bekerja dengan nilai-nilai lama .
 Umum / Instruksi Berguna
mov ( terutama dengan register segmen )
    - Mis , :
        movw % es , kapak %
        movl % cs : 4 , % esp
        movw _processControlBlock , % cs
    - Catatan : mov itu TIDAK mengatur flag
pushl , popl - panjang mendorong / pop
pushal , Popal - EAX mendorong / pop , EBX , ECX , EDX , ESP , EBP , ESI , EDI
panggilan ( melompat ke bagian dari kode , menyimpan alamat pengirim di stack )
         misalnya, panggilan _cFunction
int - memanggil interrupt software
ret ( kembali dari potongan kode yang dimasukkan karena untuk memanggil instruksi )
iretl ( kembali dari potongan kode yang dimasukkan karena hardware atau software interrupt )
sti , cli - set / menghapus bit interrupt untuk mengaktifkan / menonaktifkan interupsi masing-masing
lea - adalah beban Alamat Efektif , itu pada dasarnya pipa langsung ke alamat yang Anda ingin melakukan perhitungan pada tanpa mempengaruhi bendera , atau kebutuhan mendorong dan muncul bendera .
Sebuah contoh sederhana :
KODE
kekosongan funtction1 ( ) {
int A = 10 ;
A + = 66 ;
}
mengkompilasi ke ...
funtction1 :
1 pushl % ebp #
2 movl % esp , % ebp # ,
3 Subl $ 4, % esp # ,
4 movl $ 10, -4 ( % ebp ) # , A
5 Leal -4 ( % ebp ) , % eax # ,
6 addl $ 66 , ( % eax ) # , A
7 cuti
8 ret
penjelasan :
1 . Mendorong EBP
2 . Menyalin stack pointer ke EBP
3 . Membuat ruang pada stack untuk data lokal
4 . Memasukkan nilai 10 di A ( ini akan menjadi alamat A kini )
5 . Alamat beban A ke EAX ( mirip dengan pointer )
6 . Tambahkan 66 ke A
... Tidak berpikir Anda perlu tahu sisanya
Mencampur C dan Majelis Bahasa
Cara untuk mencampur C dan bahasa assembly adalah dengan menggunakan " asm " direktif . Untuk mengakses variabel C - bahasa dari dalam bahasa assembly , Anda hanya menggunakan nama identifier C sebagai operand memori . Variabel-variabel ini tidak bisa lokal untuk prosedur , dan juga tidak bisa statis di dalam prosedur . Mereka harus global ( tetapi bisa statis global) . Karakter baris baru diperlukan .
a1 panjang unsigned , r ;
kekosongan junk (void )
{
   asm (
        " pushl % eax \ n "
        " pushl % ebx \ n "
        " movl $ 100, % eax \ n "
        " movl a1 , % ebx \ n "
        " int $ 69 \ n "
        " movl % eax , r \ n "
        " popl % ebx \ n "
        " popl % eax \ n "
   ) ;
}

Post a Comment

0 Comments