Bahasa assembly lanjutan

1. Pengantar
================


Apa itu?
-----------
Bahasa assembly adalah bahasa pemrograman tingkat rendah. Sintaksnya tidak seperti
C / C + +, Pascal, Basic, atau apa pun yang dapat digunakan untuk.


Mengapa belajar itu?
-------------
Jika Anda bertanya kepada seseorang hari ini apa keuntungan dari perakitan, mereka akan memberitahu Anda itu
kecepatan. Yang mungkin telah benar pada hari-hari BASIC atau Pascal, tapi hari ini C / C + +
program yang dikompilasi dengan kompiler yang dioptimalkan adalah sebagai cepat, atau bahkan lebih cepat dari yang sama
algoritma dalam perakitan. Menurut perakitan banyak orang sudah mati. Jadi, mengapa repot-repot
belajar itu?
1. perakitan Learning akan membantu Anda lebih memahami bagaimana komputer bekerja.
2. Jika windows crash, biasanya kembali lokasi / tindakan yang menyebabkan kesalahan.
Namun, tidak kembali di C / C + +. Mengetahui perakitan adalah satu-satunya cara untuk melacak
bawah bug / eksploitasi dan memperbaikinya.
3. Seberapa sering Anda berharap Anda bisa menyingkirkan bahwa layar nag bodoh di
shareware aplikasi yang Anda gunakan? Mengetahui bahasa tingkat tinggi wont membuat Anda sangat jauh bila Anda
buka kotoran di decompiler Anda dan melihat sesuatu seperti CMP EAX, 7C0A
4. rendah dan perangkat keras situasi tertentu masih memerlukan perakitan
5. Jika Anda membutuhkan kontrol yang lebih tepat apa program anda yang melakukan, bahasa tingkat tinggi
jarang cukup kuat.
6. Pokoknya Anda menempatkannya, bahkan yang paling optimal compiler bahasa tingkat tinggi adalah masih
hanya kompiler umum, sehingga kode yang dihasilkan juga umum / kode lambat. Jika
Anda memiliki tugas tertentu, ia akan berjalan lebih cepat dalam perakitan dioptimalkan daripada di lain
bahasa.
7. "Majelis Profesional Programmer" terlihat sangat bagus di resume.
alasan pribadi saya mengapa saya berpikir assembly adalah bahasa yang terbaik adalah fakta bahwa Anda
memegang kendali. Ya semua yang Anda C / C + + / Pascal / Perl / etc coders di luar sana, di semua Anda mewah
bahasa tingkat tinggi anda masih penumpang. Compiler dan bahasa itu sendiri
membatasi Anda. Dalam perakitan Anda hanya dibatasi oleh hardware yang anda sendiri. Anda mengontrol
CPU dan memori, bukan otherway sekitar.


Apa yang akan mengajarkan anda tutorial ini?
----------------------------------
Saya mencoba untuk membuat suatu pendahuluan perakitan, jadi aku mulai dari awal.
Setelah Anda membaca ini Anda harus cukup tahu tentang perakitan untuk mengembangkan grafis
rutinitas, membuat sesuatu seperti sebuah aplikasi database sederhana, menerima masukan dari pengguna,
membuat Win32 GUI, gunakan kode terorganisir dan bisa digunakan kembali, tahu tentang berbagai jenis data
dan bagaimana menggunakannya, beberapa aku dasar / sialan O, dll


2. Memori
==========
Dalam bab ini saya akan meminta Anda untuk melihat baru di komputer. Untuk banyak hal mereka
hanya kotak yang memungkinkan Anda untuk mendapatkan di internet, bermain game, dll Lupakan semua itu
hari ini dan menganggap mereka sebagai apa yang mereka sebenarnya, Kalkulator Big. Semua komputer tidak
adalah Manipulasi Bit. Artinya, ia dapat menghidupkan bit tertentu dan mematikan. Sebuah komputer tidak dapat
bahkan melakukan semua operasi aritmatika. Semua itu dapat Anda lakukan adalah menambahkan. Pengurangan dicapai
dengan menambahkan angka negatif, perkalian adalah repeaded menambahkan, dan membagi adalah
repeaded menambahkan angka negatif.


Nomor sistem
--------------
Semua dari Anda sudah familiar dengan setidaknya satu sistem nomor, Desimal. Dalam bab ini saya
akan memperkenalkan Anda ke 2 lebih, Biner dan Heksadesimal.



Desimal
Sebelum kita masuk ke dalam 2 sistem lain, mari kita meninjau ulang sistem desimal. desimal yang
sistem basis 10 sistem, yang berarti bahwa itu terdiri dari 10 nomor yang digunakan untuk membuat
semua nomor lain. Ini 10 nomor 0-9. Mari kita menggunakan nomor 125 sebagai contoh:
Ratusan Puluhan Unit
Digit 1 2 5
Arti 1x10 ^ 2 2x10 5x10 ^ 1 ^ 0
Nilai 100 20 5
CATATAN: x ^ y berarti x dengan kekuatan y. ex. 13 ^ 3 berarti 13 dengan kekuatan 3 (2197)
Tambahkan nilai-nilai dan Anda mendapatkan 125.

Pastikan Anda memahami semua ini sebelum melanjutkan ke sistem biner!


Biner
Sistem biner terlihat lebih keras dari desimal pada awalnya, tetapi kenyataannya agak sedikit lebih mudah
karena hanya basis 2 (0-1). Ingatlah bahwa dalam desimal Anda pergi "nilai x 10 ^ posisi" untuk
mendapatkan bilangan real, baik dalam biner Anda pergi "nilai x 2 posisi ^" untuk mendapatkan jawabannya.
Terdengar lebih rumit daripada itu. Untuk lebih memahami ini, memungkinkan untuk beberapa konversi.
Ambil bilangan biner 10110:
1 x 2 ^ 4 = 16
0 x 2 ^ 3 = 0
1 x 2 ^ 2 = 4
1 x 2 ^ 1 = 2
0 x 2 ^ 0 = 0
Jawaban: 22


CATATAN: untuk contoh berikutnya aku sudah merubah hal-hal B ^ Ax2 dengan nilai riil:
2 ^ 0 = 1
2 ^ 1 = 2
2 ^ 2 = 4
2 ^ 3 = 8
2 ^ 4 = 16
2 ^ 5 = 32
dll ...

Mari kita gunakan 111101:
1 x 32 = 32
1 x 16 = 16
1 x 8 = 8
1 x 4 = 4
0 x 2 = 0
1 x 1 = 1
Jawaban: 61

Membuat beberapa nomor biner dan mengkonversikannya ke desimal praktik ini. Hal ini sangat
penting bahwa Anda benar-benar memahami konsep ini. Jika Anda tidak, periksa Lampiran B
untuk link dan membaca tentang topik ini SEBELUM terjadi!

Sekarang mari kita mengubah desimal ke biner, lihatlah contoh di bawah ini:
238 / 2 sisa: 0
119 / 2 sisa: 1
59 / 2 sisa: 1
29 / 2 sisa: 1
14 / 2 sisa: 0
7 / 2 sisa: 1
3 / 2 sisa: 1
1 / 2 sisa: 1
0 / 2 sisa: 0
Jawaban: 11101110

Mari kita pergi melalui ini:
1. Membagi nomor asli dengan 2, jika membagi secara merata sisanya adalah 0
2. Bagilah jawaban dari perhitungan sebelumnya (119) dengan 2. Jika wont
membagi secara merata sisanya adalah 1.
3. Round nomor dari perhitungan DOWN sebelumnya (59), dan dibagi oleh 2.
Jawaban: 29, sisa: 1
4. Ulangi sampai Anda mendapatkan 0 ....
Jawaban akhir harus 011101110, perhatikan bagaimana jawaban yang diberikan adalah hilang 1 0?
Itu karena seperti dalam desimal, mereka tidak memiliki nilai dan bisa dihilangkan (023 = 23).

Berlatih ini dengan beberapa angka desimal lainnya, dan periksa dengan mengubah jawaban Anda
kembali ke biner. Sekali lagi pastikan Anda mendapatkan ini sebelum terjadi!

Sebuah tambahan beberapa hal tentang biner:
* Biasanya 1 mewakili TRUE, dan 0 FALSE
* Saat menulis biner, menyimpan nomor dalam kelipatan 4
ex. JANGAN menulis 11001, ubah ke 00011001, ingat bahwa 0 di depan
tidak berarti apa-apa
* Biasanya Anda menambahkan ab setelah nomor untuk sinyal fakta bahwa itu adalah bilangan biner
ex. 00011001 = 00011001b


Heksadesimal
Beberapa dari Anda mungkin telah melihat beberapa konsistensi dalam hal-hal seperti RAM misalnya. Mereka tampaknya
untuk selalu kelipatan dari 4. Sebagai contoh, adalah umum untuk memiliki 128 MB RAM, tetapi
Anda wont menemukan 127 di mana saja. Itu karena komputer suka menggunakan kelipatan 2, 4, 8,
16, 32, 64 dll Di situlah heksadesimal masuk Sejak heksadesimal adalah basis 16, maka
sempurna untuk komputer. Jika Anda memahami biner bagian sebelumnya, Anda harus memiliki
tidak ada masalah dengan yang satu ini. Lihatlah tabel di bawah ini, dan mencoba untuk mengingatnya. Ini bukan
seperti keras seperti yang terlihat.
Biner Desimal Heksadesimal
0h 0 0000b
1h 1 0001b
2h 2 0010b
3h 3 0011b
4h 4 0100b
5h 5 0101b
6h 6 0110b
7h 7 0111b
8h 8 1000b
9h 9 1001b
Ah 10 1010b
11 bh 1011b
Ch 12 1100b
Dh 13 1101b
Eh 14 1110b
Fh 15 1111b

CATATAN: h setelah setiap angka heksadesimal singkatan

Sekarang mari kita melakukan konversi:
Heksadesimal ke Desimal
2A4F

F x 16 ^ 0 = 15 x 1 = 15
4 x 16 ^ 1 = 4 x 16 = 64
A x 16 ^ 2 = 10 x 256 = 2560
2 x 16 ^ 3 = 2 x 4096 = 8192
Jawaban: 10831

1. Tuliskan nomor heksadesimal dimulai dari angka terakhir
2. Setiap perubahan angka heksadesimal ke desimal dan waktu mereka dengan 16 posisi ^
3. Tambahkan semua nomor final Facebook

Bingung? Mari kita lakukan contoh lain: DEAD
D x 1 = 13 x 1 = 13
A x 16 = 10 x 16 = 160
E x 256 = 14 x 256 = 3584
D x 4096 = 13 x 4096 = 53248
Jawaban: 57005

Berlatih metode ini sampai Anda mendapatkannya, kemudian melanjutkan.

Desimal ke Heksadesimal
Pelajarilah contoh berikut:
1324

1324 / 16 = 82.75
82 x 16 = 1312
1324 - 1312 = 12, dikonversi ke Heksadesimal: C

82 / 16 = 5.125
5 x 16 = 80
82-80 = 2, dikonversi ke Heksadesimal: 2

5 / 16 = 0.3125
0 x 16 = 0
5-0 = 5, dikonversi ke Heksadesimal: 5

Jawaban: 52C

Saya akan melakukan contoh lain, tapi terlalu banyak rasa sakit di pantat, mungkin beberapa waktu lain.

Pelajari bagian ini Anda AKAN membutuhkannya!
Ini sudah salah satu bagian paling sulit, bagian berikutnya harus sedikit lebih mudah

Beberapa hal tambahan abot heksadesimal
1. Ini tidak biasa untuk mengatakan "hex" bukan "heksadesimal" bahkan thechnicaly berbicara
"Hex" berarti 6, bukan 16.
2. Simpan angka heksadesimal dalam kelipatan 4, menambahkan nol yang diperlukan
3. perakit Kebanyakan tidak dapat menangani angka yang dimulai dengan "huruf" karena mereka tidak
tahu apakah Anda maksud label, instruksi, dll Dalam hal bahwa ada sejumlah
cara lain, Anda dapat mengekspresikan nomor. Yang paling umum adalah:
DEAD = 0DEADh (Biasanya digunakan untuk DOS / Win)
dan
DEAD = 0xDEAD (Biasanya digunakan untuk sistem * Nix based)
Konsultasikan manual assembler Anda untuk melihat apa yang digunakannya.


By the way, apakah ada yang pikir aku harus menambahkan Oktal ini ...?




Bit, Kunyahan Makanlah, Byte, Kata, Double Kata
-----------------------------------------
Bit unit terkecil dari data pada komputer. Setiap bit hanya dapat mewakili 2 angka,
1 dan 0. Bits cukup berguna karena mereka begitu keparat kecil sehingga kita punya nibble tersebut.
menggigit adalah kumpulan dari 4 bit. Itu mungkin tidak terlihat sangat menarik, tapi ingat
bagaimana semua 16 angka heksadesimal dapat diwakili dengan satu set 4 bilangan biner?
Itu hampir semua nibble adalah baik untuk.

Struktur data yang paling penting yang digunakan oleh komputer Anda adalah sebuah Byte. byte A adalah
unit terkecil yang dapat diakses oleh prosesor anda. Hal ini terdiri dari 8 bit, atau
2 camilan. Segala sesuatu yang Anda simpan pada hard drive Anda, kirimkan dengan modem Anda, dll adalah dalam
byte. Sebagai contoh, katakanlah anda menyimpan nomor 170 pada hard drive Anda, akan terlihat
seperti ini:

+---+---+---+---+---+---+---+---+
| 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
+---+---+---+---+---+---+---+---+
7 6 5 4 3 2 1 0
H.O Menggigit | L.O Menggigit

10101010 adalah 170 dalam biner. Karena kita bisa muat 2 camilan dalam byte, kita juga bisa merujuk
untuk bit 0-3 sebagai Orde Rendah Menggigit, dan 4-7 sebagai Orde Tinggi Menggigit
Selanjutnya kita punya Kata. Sebuah kata hanya 2 byte, atau 16 bit. Katakanlah Anda menyimpan 43.690, itu akan
terlihat seperti ini:


+---+---+---+---+---+---+---+---+---+---+---+---+- --+---+---+---+
| 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
+---+---+---+---+---+---+---+---+---+---+---+---+- --+---+---+---+
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
High Order Byte | Byte Order Rendah

Sekali lagi, kita dapat merujuk pada bit 0-7 sebagai Low Order Byte, dan 7-15 sebagai High Order Byte.
Terakhir kita memiliki Double Word, yang persis apa yang dikatakannya, 2 kata, 4 byte, 8 camilan
atau 32 bit.

Catatan: Awalnya Firman itu adalah ukuran dari BUS dari CPU ke RAM. Saat ini sebagian besar
komputer memiliki setidaknya sebuah bus 32bit, tetapi kebanyakan orang digunakan untuk
1 kata = 16 bit sehingga mereka memutuskan untuk tetap seperti itu.



Stack
---------
Anda mungkin telah mendengar tentang stack sangat sering. Jika Anda masih belum tahu apa itu
berarti, baca terus. Tumpukan adalah data yang sangat berguna Struktur (sesuatu yang menyimpan data).
Menganggapnya sebagai setumpuk buku. Anda menempatkan satu di atasnya, dan yang satu akan menjadi
pertama datang dari depan. Menempatkan hal baru di stack yang disebut Mendorong, mendapatkan barang
dari stack yang disebut poping. Misalnya, Anda memiliki 5 buku berjudul A, B, C, D,
dan E tumpukan di atas satu sama lain seperti ini:
A
B
C
D
E
Sekarang Anda menambahkan (push) F buku ke tumpukan:
F
A
B
C
D
E
Jika Anda pop stack, Anda mendapatkan F buku kembali dan tumpukan terlihat seperti ini lagi:
A
B
C
D
E
Ini disebut LIFO, Last In, First Out.
Jadi apa gunanya semua ini? Stack yang sangat berguna sebagai "alas" untuk
menyimpan data sementara.




Segmen: Offset
--------------
Semuanya pada komputer Anda terhubung melalui serangkaian kabel disebut BUS. The
BUS untuk RAM adalah 16 bit. Jadi ketika prosesor perlu menulis ke RAM, itu
sehingga dengan mengirimkan lokasi 16 bit melalui bus. Di hari tua ini berarti bahwa
komputer hanya bisa memiliki 65535 byte memori (16 bit = 1111111111111111 = 65535).
Itu banyak kembali daripada, tapi hari itu tidak cukup. Jadi desainer datang
dengan cara untuk mengirim 20 bit melalui bus, sehingga memungkinkan untuk total 1 MB memori
Dalam desain baru, memori tersegmentasi ke dalam kumpulan byte yang disebut Segmen,
dan dapat diakses dengan menetapkan jumlah Offset dalam segmen tersebut. Jadi jika
prosesor ingin mengakses data terlebih dahulu mengirimkan nomor segmen, diikuti oleh
Offset nomor. Sebagai contoh, prosesor mengirimkan permintaan 1234:4321, RAM akan
mengirim kembali 4321 byte dalam jumlah segmen 1234.
Ini semua mungkin terdengar agak rumit, tetapi mempelajarinya dengan seksama dan Anda harus dapat
untuk menguasai segmen: offset.
Cara terbaik untuk seg gambar: off adalah dengan array 2 dimensi. Ingat bahwa X, Y sialan
Anda harus belajar di kelas 9 matematika?
Lihat diagram di bawah ini, * terletak di 4:3. Sumbu Y sama dengan segmen,
dan X-sumbu adalah offset.


+--+--+--+--+--+
5 | | | | | |
+--+--+--+--+--+
4 | | | * | | |
Sumbu Y +--+--+--+--+--+
3 | | | | | |
+--+--+--+--+--+
2 | | | | | |
+--+--+--+--+--+
1 | | | | | | Majelis
+--+--+--+--+--+
1 2 3 4 5
Sumbu X

Untuk mendapatkan alamat fisik melakukan perhitungan ini:
Segmen x 10h + Offset = alamat fisik
Sebagai contoh, Anda memiliki 1000:1234 untuk mendapatkan alamat fisik Anda lakukan:
1000 X 10h 10000 =

10000
+ 1234
------
11234

Metode ini cukup mudah, tetapi juga cukup usang. Mulai dari 286 Anda dapat
bekerja di Protected Mode. Dalam mode ini CPU menggunakan Look Up Tabel untuk menghitung
seg: off lokasi. Itu tidak berarti bahwa Anda tidak dapat menggunakan seg x 10h + off meskipun, Anda
hanya akan dibatasi untuk bekerja di Real Mode dan program-program anda tidak dapat mengakses lebih dari
1 MB. Namun pada saat Anda tahu cukup untuk menulis sebuah program bahkan mendekati batas ini,
Anda sudah tahu bagaimana menggunakan metode lain (untuk mereka yang berasal dari sebuah pertunjukan 50 hard drive
dunia, sebuah program yang 1 MB adalah sekitar 15x lebih besar daripada file teks).

Register
---------
prosesor berisi wilayah kecil yang dapat menyimpan data. Mereka terlalu kecil untuk menyimpan
file, sebaliknya mereka digunakan untuk menyimpan informasi saat program sedang berjalan.
Yang paling umum adalah tercantum di bawah ini:

Tujuan Umum:
CATATAN: Semua register tujuan umum adalah 16 bit dan dapat dipecah menjadi dua 8 bit
register. Sebagai contoh, AX bisa dipecah menjadi AL dan AH. L singkatan Rendah
dan H untuk High. Jika Anda memberikan nilai pada AX, AH akan berisi bagian pertama
bahwa nilai, dan AL yang terakhir. Misalnya, jika Anda memberikan nilai yang MATI ke AX,
AH akan berisi DE dan AL berisi AD. Demikian juga sebaliknya, jika Anda
menetapkan DE untuk AH dan AD untuk AL, AX akan berisi DEAD
AX - Accumulator.
Terdiri dari: AH, AL
Penggunaan umum:, Matematika operasi I / O operasi, INT 21
BX - Base
Terdiri dari: BH, BL
Penggunaan umum: dasar atau Pointer
CX - Counter
Terdiri dari: CH, CL
Penggunaan umum: Loops dan Mengulang
DX - Pemindahan
Terdiri dari: DH, DL
Penggunaan umum: Berbagai data, output karakter
Ketika 386 keluar itu menambahkan 4 register baru dengan kategori itu: EAX, EBX, ECX, dan EDX.
E singkatan dari Extended, dan itu hanya apa yang mereka, ekstensi 32bit ke
asli. Lihatlah diagram ini untuk lebih memahami bagaimana ini bekerja:

| EAX |

+----+----+----+----+
| | | AH | AL |
+----+----+----+----+

| AX |

Setiap kotak mewakili 8 bit
CATATAN: Tidak ada EAH atau EAL


Segmen Register:
CATATAN: Ini adalah berbahaya untuk bermain-main dengan ini!
CS - Segmen Kode. Blok memori yang menyimpan kode
DS - Data Segmen. Blok memori yang menyimpan data
ES - Segmen Extra. Umumnya digunakan untuk hal-hal video
SS - Stack Segmen. Register yang digunakan oleh prosesor untuk menyimpan alamat kembali dari
rutinitas

Index Register:
SI - Indeks Source. Digunakan untuk menentukan sumber string / array
DI - Index Tujuan. Digunakan untuk menentukan tujuan dari string / array
IP - Pointer Instruksi. Tidak bisa diubah langsung karena menyimpan alamat
instruksi berikutnya.

Stack Register:
BP - Base pointer. Digunakan bersama dengan SP untuk operasi stack
SP - Stack Pointer.

Register Tujuan Khusus:
IP - Pointer Instruksi. Memegang offset instruksi yang sedang dieksekusi
Flags - Ini adalah sedikit berbeda dari semua register lainnya. Sebuah register flag hanya 1
bit dalam ukuran. Ini salah 1 (benar), atau 0 (false). Ada sejumlah register bendera
termasuk bendera Carry, Overflow flag, Parity flag, bendera Arah, dan banyak lagi. Anda
tidak menetapkan nomor ini secara manual. Nilai diatur secara otomatis tergantung pada
instruksi sebelumnya. Salah satu penggunaan yang umum bagi mereka adalah untuk percabangan. Misalnya, Anda
membandingkan nilai BX dengan nilai CX, jika itu sama bendera akan diatur ke
1 (benar) dan Anda dapat menggunakan informasi tersebut untuk cabang ke bidang lain Anda
program.

Ada register lagi, tetapi Anda akan kemungkinan besar pernah menggunakannya juga.


Latihan:
1. Tuliskan semua register tujuan umum dan menghafal mereka
2. Membuat angka acak dan secara manual mengubahnya menjadi Biner dan heksadesimal
3. Membuat grafik 2D dari memori yang terletak di 0106:0100
4. Dapatkan alamat fisik 107A: 0100



3. Memulai
===================
Sekarang akhirnya pada ke perakit nyata! Percayalah, aku sakit dari semua latar belakang ini
kotoran:)


Mendapatkan sebuah Assembler
--------------------
Ada cukup banyak tersedia hari ini. Semua kode dalam tutorial ini telah diuji
dengan TASM, sehingga Anda seharusnya tidak memiliki masalah jika Anda memilikinya. A86 juga harus bekerja dengan
kode thise, tapi aku tidak bisa menjamin bahwa.
A86 - Tersedia dari: Hanya pengguna terdaftar dan diaktifkan [dapat melihat link. ]
Lisensi: Shareware
Harga: A86 hanya - US $ 50 + Pajak / SH
A86 + Manual + D86 + 32-bit versi masing-masing - US $ 80 + Pajak / SH
Manual - Pajak AS $ 10 + / SH
TASM - Tersedia dari: Hanya pengguna terdaftar dan diaktifkan [dapat melihat link. ]
Lisensi: Gotta membelinya
Harga: US $ 129,95 + Pajak / SH
Ada ton lebih di luar sana, periksa Hanya pengguna terdaftar dan diaktifkan [dapat melihat link. ], Saya tahu mereka punya beberapa. Namun sebagai
katakan sebelumnya, semua program dalam tutorial ini hanya telah diuji dengan TASM. Jika
Anda rendah pada kas, hanya mendapatkan A86 dan mengevaluasi lebih lama dari Anda seharusnya.


Program Layout
--------------
Ini adalah praktek pemrograman yang baik untuk mengembangkan semacam standar yang Anda menulis Anda
program. Dalam bab ini anda akan belajar tentang layout COM dan.. File EXE yang
dikecualikan oleh kedua, TASM dan A86.


. COM
Mari kita melihat kode sumber untuk program yang sangat sederhana:

SEGMEN UTAMA
MENANGGUNG CS: MAIN, DS: MAIN, ES: UTAMA, SS: UTAMA

ORG 100H

START:
INT 20
TUJUAN UTAMA
END START

Program ini sama sekali tidak ada, tetapi tidak dengan baik dan cepat. Banyak kode untuk
sesuatu yang tidak melakukan apa-apa. Mari kita memeriksa bahwa lebih dekat:

SEGMEN UTAMA - Deklarasikan segmen disebut UTAMA. Sebuah file. COM harus masuk ke dalam 1 segmen
memori (aka. 65535 bytes - stack - PSP)

MENANGGUNG CS: MAIN, DS: MAIN, ES: UTAMA, SS: UTAMA - ini memberitahu assembler nilai awal
CS, DS, ES, dan SS mendaftar. Karena. COM
harus masuk ke dalam satu segmen mereka semua mengarah ke
segmen ditentukan pada baris di atas.
ORG 100H - Sejak semua mulai file COM di XXXX:. 0100 Anda mendeklarasikan entry point untuk
100H. Lebih lanjut tentang ini nanti.

START: - Label

INT 20 - Kembali ke DOS

UTAMA ENDS - Mengakhiri segmen UTAMA

END START - Mengakhiri label START

CATATAN: Ini adalah jenis layout kita akan menggunakan sebagian besar waktu. Mungkin nanti (Bab 9 +)
Kita masuk ke yang berikutnya ...

Sekarang bagaimana Anda membuat sampah ini menjadi program yang sebenarnya? Pertama, tipe ini keluar program
editor favorit Anda (notepad, dos edit, dll). Jika Anda memiliki A86, hanya masuk ke DOS,
daripada ke direktori A86 dalam dan ketik "a86 filename.asm". Jika Anda memiliki TASM,
masuk ke DOS dan ke dalam direktori TASM dan ketik "filename.asm TASM", lalu ketik
"Tlink / filename.obj t". Dalam kedua kasus, anda akan mendapatkan sebuah file yang bernama Filename.com. Lebih
pada apa. com adalah dan tidak kemudian.



. EXE
Perhatikan kode berikut:

DOSSEG
MODEL KECIL.
STACK 200h.
. DATA
. KODE

START:
INT 20
END START

Sekali lagi, program-nya tidak apa-apa. Mari kita memeriksa secara detail setiap baris:

DOSSEG - macam segmen dalam urutan:
Kode
Data
Tumpukan
Ini tidak diperlukan, tetapi disarankan ketika anda masih belajar

. MODEL KECIL - memilih model memori KECIL, model yang tersedia adalah:
Tiny: Semua kode dan data digabungkan menjadi satu kelompok tunggal yang disebut DGROUP. Digunakan untuk. COM
file.
KECIL: Kode adalah dalam satu

segmen. Semua data digabungkan dalam DGROUP. Kode dan data
keduanya lebih kecil dari 64k. Ini adalah standar untuk perakitan mandiri
program.
MEDIUM: Kode menggunakan beberapa segmen, satu per modul. Semua data digabungkan dalam DGROUP
Code bisa lebih besar dari 64k, namun data harus lebih kecil dari 64k
COMPACT: Kode berada dalam segmen tunggal. Semua data dekat di DGROUP. Data dapat lebih
dari 64k, tetapi kode tidak bisa.
BESAR: Kode menggunakan beberapa segmen. Semua data dekat di DGROUP. Data dan kode bisa
lebih dari 64k, tapi array tidak bisa.
HUGE: Kode menggunakan beberapa segmen. Semua data dekat di DGROUP. Data, kode dan array
bisa lebih dari 64k
Sebagian besar waktu Anda ingin menggunakan KECIL untuk menjaga kode efisien.

STACK 200h -. Mengeset ukuran stack. Dalam hal ini 200h byte

DATA -. Segmen data. Di sinilah semua data Anda berjalan (variabel misalnya).

KODE -. Segmen kode. Di sinilah sebenarnya program anda pergi.

START: - Hanya label, lebih pada nanti

20 INT - keluar program, lebih pada nanti

END START - Ambil menebak apa ini tidak! Tidak diperlukan untuk semua perakit, saya
tahu TASM membutuhkannya, dan A86 tidak.

CATATAN:. Untuk file EXE, JANGAN menggunakan switch / t saat menautkan!


Latihan:
1. Buatlah program yang menggunakan model memori BESAR, membuat sebuah 100H panjang stack, dan keluar
ke DOS.







4. Dasar ASM
=============
Dalam bab ini kita benar-benar mulai membuat beberapa kode kerja


Pendaftaran Dasar operasi
-------------------------
Anda sudah tahu apa yang register, tapi Anda belum belajar bagaimana memodifikasi mereka.
Untuk memberikan nilai pada sebuah register:

MOV TUJUAN, NILAI

Misalnya, Anda ingin untuk 56h AX sama:
MOV AX, 56h
Anda juga dapat menggunakan lain mendaftarkan diri sebagai nilai:
MOV AX, BX
Ingat bagaimana semua register tujuan umum yang terdiri dari H dan L register? Sekarang Anda
dapat benar-benar menggunakan info yang:
MOV AL, 09
Sekarang AL sama dengan 09 dan sama AX 0009

Operator mendaftar berikutnya adalah XCHG, yang hanya swap 2 register. Perintahnya adalah:

XCHG register1, REGISTER2

Sebagai contoh, perhatikan kode berikut:

MOV DX, 56h
MOV AX, 3Fh
XCHG DX, AX

1. DX sama dengan 3Fh
2. AX sama dengan 56h
3. DX dan AX mendapatkan bertukar dan AX sekarang sama 56h, dan DX sama 3Fh

CATATAN: PERNAH mencoba untuk menukar sedikit 8 (h / l) mendaftar dengan sedikit 16 (X)!
Kode berikut tidak valid:
XCHG AH, BX

Selanjutnya kita punya 2 operasi yang sederhana, INC dan Desember
INC selisih nilai register dan decrements Desember itu.

Contoh:

MOV DX, 50h
INC DX

DX sekarang sama dengan 51h (50h + 1h = 51h).

Contoh:

MOV DX, 50h
Desember DX

DX sekarang sama dengan 4F (50h - 1h = 4Fh).



Stack operasi
----------------
Sekarang saatnya untuk menempatkan bahwa tumpukan kotoran untuk beberapa penggunaan aktual. Dan itu sangat mudah. Ada
6 stack operator, 2 dari yang akan Anda gunakan sebagian besar waktu. Perintahnya adalah:
POP REGISTER
PUSH REGISTER
Katakanlah Anda ingin menyimpan sementara nilai dalam AX di stack untuk digunakan kemudian,
hanya melakukan:
PUSH AX
Sekarang Anda bermain-main dengan AX dan ingin mengembalikan nilai asli:
POP AX

CATATAN: stack hanya akan menerima 16 bit register! Yang seharusnya tidak menjadi masalah meskipun
sejak register 16 bit termasuk nilai dari bit 8.

Ini sedikit kode yang berikutnya melakukan beberapa poping dan mendorong, mengambil kira tentang apa BX dan AX adalah
sama dengan di akhir.

MOV AX, 51h
MOV BX, 4Fh

XCHG AX, BX

PUSH AX
MOV AX, 34h

POP BX

PUSH BX

POP AX

Pertama AX sama dengan 51h dan BX untuk 4Fh, dari 2 mendapatkan dipertukarkan. Sekarang kita punya
AX = 4Fh dan BX = 51h. AX akan mendorong pada stack, kemudian set ke 34h:
AX = 34h dan BX = 51h. BX mendapat poped, dari mendorong:
AX = 34h dan BX = 4Fh. Akhirnya AX mendapat poped. Jadi, hasil akhir adalah:
AX = 4Fh dan BX = 4Fh.

Selanjutnya kita punya dua variasi register tumpukan, POPF dan PUSHF. Kedua
bendera tempat mendaftar di tumpukan. Terdengar lebih rumit daripada POP dan PUSH, tetapi
itu sebenarnya lebih mudah. Perintahnya adalah:
POPF
PUSHF
operan Tidak diperlukan. Misalnya, Anda ingin AX untuk memegang bendera saat mendaftar
Nilai:

PUSHF
POP AX

PUSHF meletakkannya di tumpukan, POP AX tempat ke dalam AX.

Dua yang terakhir stack operator Pusha dan Popa.
Pusha menempatkan semua register tujuan umum di stack
Popa mengambil semua register tujuan umum dari stack
CATATAN: Ini 2 adalah instruksi 32bit, sehingga mereka hanya bekerja pada 386 + dan tidak akan
bekerja dengan. COM file.

Contoh:
MOV AX, 1h
MOV BX, 2h
MOV CX, 3h
MOV DX, 4h

Pusha

MOV AX, 5h
MOV BX, 6h
MOV CX, 7h
MOV DX, 8h

Popa

Pada akhir program ini, semua register dikembalikan ke nilai awal mereka

Berlatih beberapa petunjuk ini! Jika Anda membuat sebuah program yang berisi semuanya
yang telah Anda pelajari sejauh ini tidak akan melakukan apapun, tetapi jika tidak crash itu kemungkinan besar
bekerja. Jadi beberapa kode program yang sederhana dan bermain-main dengan nilai-nilai dan register.




Operasi aritmatika
---------------------
Semua orang suka aritmatika. Terutama jika Anda melakukannya di hex atau biner. Bagi mereka yang
tidak tahu apa aritmetika, itu hanya menambah dan mengurangkan. Mengalikan dan
membagi benar-benar penambahan dan pengurangan hanya mengulangi. Jadi singkatnya, ini adalah
mewah nama untuk kelas 3 matematika. Dalam bab ini saya akan memperkenalkan Anda ke 4 dasar
operator aritmatika, ADD, SUB, MUL, DIV. Ada beberapa lagi yang saya akan mencakup
nanti.
Mari kita mulai dengan ADD. Perintahnya adalah:
ADD register1, REGISTER2
ADD REGISTER, NILAI

Contoh 1:
MOV AX, 5h
MOV BX, 4Fh

ADD AX, BX

Ini menambahkan AX dan BX dan menyimpan nilai mengakibatkan AX. Jadi setelah menjalankan ini
Program AX = 9h

Contoh 2:
MOV AX, 5h

ADD AX, 4Fh

Hasilnya adalah sama seperti pada contoh 1. AX diatur ke 5h, dan 4Fh ditambahkan untuk itu.

Sekarang mari kita pergi ke SUB. Perintahnya adalah:
SUB register1, REGISTER2
SUB DAFTAR, NILAI

Contoh 1:
z

Hal ini akan mengurangi nilai BX dari nilai AX. Dalam hal ini hasilnya akan
akan 4A.

CATATAN: Jika Anda masih tidak sepenuhnya mendapatkan heksadesimal, Anda dapat dengan mudah dapat memeriksa ini dengan
mengkonversi 5, 4F, dan 4A ke desimal.
4F 79 =
4A 74 =
5 = 5

Seperti ADD Anda juga dapat menggunakan nilai:
MOV BX, 4Fh

SUB BX, 5h

Yang membuat Anda dengan BX = 4A

Berikutnya sejalan adalah operator MUL. Sintaks:
MUL REGISTER

Perhatikan bahwa hanya satu operan diperlukan. Itu karena prosesor mengasumsikan bahwa anda
ingin melipatgandakan memberikan mendaftar dengan AX atau AH.

Contoh:
MOV AX, 5h
MOV BX, 4Fh

MUL BX

Ini daun AX sama dengan 18B (4Fh x 5h = 18B). Perhatikan bahwa hasilnya disimpan di AX,
atau AH, tergantung pada apa yang digunakan untuk operasi.

Terakhir kita memiliki operator DIV. Sintaks:
DIV REGISTER

Sama seperti operator MUL, hanya ada satu operan, dan AX diasumsikan menjadi
kedua satu.

Contoh:
MOV AX, 5h
MOV BX, 4Fh

DIV BX

Sekarang AX sama Fh sejak 4Fh / 5h = Fh.
CATATAN: Hasilnya adalah dibulatkan ke angka terendah berikutnya:
4Fh 79 =
5h = 5
79 / 5 = 15.8

15 = Fh

CATATAN: Untuk saat ini tidak apa-apa jika Anda menggunakan MUL dan DIV, tetapi mereka operator sangat lambat.
Itu berarti jika Anda membutuhkan kecepatan (dalam grafik misalnya), TIDAK PERNAH menggunakan MUL / DIV!
Anda dapat menggunakan Pergeseran dikombinasikan dengan penambahan / pengurangan untuk mencapai kode
yang kadang-kadang bisa 3000% lebih cepat! Namun pergeseran agak sulit untuk
memahami jika Anda tidak tahu banyak tentang perakitan belum, saya akan membahas completly
mereka di bagian grafis dari tutorial ini.



Bit bijaksana operasi
-----------------
Kedengarannya keras tetapi sangat mudah. Ada operator bit 4 bijaksana: AND, OR, XOR, dan BUKAN.
Apa ini lakukan adalah membandingkan dua bit nilai untuk bit. Hal ini dapat sangat berguna!

DAN sintaks:
DAN register1, REGISTER2
DAN REGISTER, NILAI

DAN mengembalikan 1 (TRUE) hanya jika KEDUA operan adalah 1 (TRUE)

Contoh 1:
MOV AX, 5h
MOV BX, 6h

DAN AX, BX

Hasilnya disimpan dalam AX. Jadi untuk contoh ini AX = 4. Mari kita melihat bahwa hasil yang lebih
erat:
5h = 101b
6h = 110b

101b
110b
---
100B

100B = 4h

Contoh 2:
MOV AX, 5h

DAN AX, 6h

Hasilnya adalah sama seperti pada Contoh 1 (AX = 4h).

DAN tabel kebenaran:
0 DAN 0 = 0
1 DAN 0 = 0
0 DAN 1 = 0
1 DAN 1 = 1


ATAU sintaks:
ATAU register1, REGISTER2
ATAU REGISTER, NILAI

ATAU mengembalikan 1 (TRUE) jika salah satu operan adalah 1 (TRUE).

Contoh 1:
MOV AX, 5h
MOV BX, 6h

ATAU AX, BX

AX sekarang sama dengan 7h

5h = 101b
6h = 110b

101b
110b
----
111b

111b = 7h

ATAU tabel kebenaran:
0 OR 0 = 0
1 OR 0 = 1
0 OR 1 = 1
1 OR 1 = 1


XOR sintaks:
XOR register1, REGISTER2
XOR REGISTER, NILAI

kembali XOR 1 (TRUE) jika satu atau operan lainnya adalah 1 (TRUE), tapi tidak keduanya

Contoh:
MOV AX, 5h
MOV BX, 6h

XOR AX, BX

AX tidak sama dengan 3h

5h = 101b
6h = 110b

101b
110b
----
011b

11b = 3h

XOR Tabel kebenaran:
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0


Dan akhirnya kita TIDAK. TIDAK adalah yang paling mudah karena hanya membalikkan setiap bit.

TIDAK sintaks:
TIDAK REGISTER
TIDAK NILAI

Contoh:
MOV AX, F0h

TIDAK AX

AX sekarang sama dengan F sejak

F0h 11110000 =
Balikkan itu:
00001111
yaitu:
F

Catatan: Kalkulator windows tidak akan bekerja untuk ini, melakukannya dengan tangan.

TIDAK tabel kebenaran:
TIDAK 1 = 0
TIDAK 0 = 1



Interupsi
---------
Menyela adalah salah satu hal yang paling berguna dalam perakitan. Interrupt hanya itu apa
mengatakan, sebuah gangguan terhadap pelaksanaan program normal. Cara terbaik untuk menggambarkan
ini adalah salah satu dari mereka "Tekan sembarang tombol untuk melanjutkan" hal. Program ini berjalan namun
bila Anda menekan tombol berhenti untuk sepersekian detik, periksa apa kunci Anda menekan dan
terus berlanjut. Semacam ini mengganggu ini dikenal sebagai Hardware Interrupt karena menggunakan
hardware (keyboard). Jenis interrupt yang akan Anda gunakan dalam program perakitan Anda
yang dikenal sebagai interupsi perangkat lunak karena mereka disebabkan oleh perangkat lunak, bukan perangkat keras. Sebuah
contoh dari sebuah software interrupt adalah membaca dan menulis ke file. Ini adalah DOS
mengganggu karena dilakukan oleh DOS, daripada yang terdapat interrupt lain yang dilakukan oleh lain
hal. Misalnya BIOS anda atau Video Card semua telah membangun di interupsi pada Anda
eksposur. Jadi bagaimana komputer ini mengetahui apa yang mengganggu adalah apa? Setiap interupsi
diberi sebuah nomor dan disimpan dalam Interrupt Vector Table (IVT untuk pendek). IVT adalah
terletak di 0000:0000 (ingat segmen:. sialan offset Lokasi ini akan menjadi
asal jika diplot pada grafik 2D). Semua penangan interrupt adalah 1 DWORD dalam ukuran
(Kata ganda, 32bit, atau 4 byte). Jadi 1h interrupt handler untuk dapat ditemukan di
0000:0004 (karena ini sebuah DWORD ia pergi oleh 4 byte). Yang mengganggu paling umum adalah
21h dan dapat ditemukan di 0000:0084.

Jadi bagaimana Anda menggunakan interupsi?
Sangat sederhana:
INT mengganggu

Sebagai contoh, pada bagian Layout Program sebelumnya program mengandung baris
INT 20h
The 20h interrupt kembali ke DOS.

Beberapa interupsi seperti ini hanya memiliki satu fungsi, tapi lain memiliki lebih banyak. Jadi bagaimana
apakah sistem operasi yang tahu apa fungsi yang Anda inginkan? Anda mengatur AX mendaftarkan.

Contoh:
MOV AH, 02
MOV DL, 41

INT 21
INT 20

Program ini sangat menakjubkan. Ia mencetak karakter A. Mari membuatnya lebih baik
dengan cara menghubungkannya ke layout kami:

SEGMEN UTAMA
MENANGGUNG DS: MAIN, ES: UTAMA, CS: UTAMA, SS: UTAMA

START:
MOV AH, 02h
MOV DL, 41h

INT 21h
INT 20h
TUJUAN UTAMA
END START

Simpan dan merakit itu. Merujuk kembali ke bab 2 jika Anda lupa bagaimana melakukan hal itu.
Jadi apa yang terjadi di sini?
Pertama itu akrab set up, daripada mengatur AH ke 02, yang merupakan keluaran karakter
21 mengganggu fungsi. Kemudian bergerak ke DL 41, 41 adalah karakter A. Akhirnya
itu panggilan 21 interrupt yang menampilkan A dan berhenti dengan 20 menyela.
Bagaimana Anda tahu apa yang harus mengatur semua register ke? Anda mendapatkan DOS interrupt
daftar. Periksa Lampiran B untuk url.
Cukup sebuah prestasi di sana, setelah membaca 970 baris teks membosankan Anda bisa akhirnya
membuat sebuah program 11 baris yang akan mengambil 1 baris yang harus dilakukan di Perl! Pad diri Anda pada yang kembali
dan memungkinkan melanjutkan.


Latihan:
1. Buatlah program yang mendapat nilai dari AX, meletakkannya ke dalam DX dan BX, kemudian berkembang biak
nilai-nilai di DX dan BX dan menyimpan hasilnya dalam CX.
Ini terdengar lebih mudah daripada yang sebenarnya, gunakan stack untuk membantu Anda.
2. Buatlah program yang mencetak string ABC, dari berhenti untuk DOS
Petunjuk: A B = 41, = 42, C = 43
3. Buatlah program yang melakukan operasi bit SEMUA bijak menggunakan nilai 5h dan 4Fh



5. Tools
=========
Sepanjang tutorial ini Anda telah tidak menggunakan software selain perakit Anda.
Dalam bab ini anda akan belajar bagaimana untuk menguasai software lain yang dapat menjadi luar biasa
membantu Anda.



Debug
-----
Mari kita mulai dengan sesuatu yang tidak hanya sangat berguna, tapi juga gratis dan sudah
pada komputer Anda.
Masuk ke dos dan ketik "debug", Anda akan mendapatkan prompt seperti ini:
-
"?" Sekarang tipe, Anda harus mendapatkan respon berikut:
merakit A [alamat]
Kisaran alamat membandingkan C
dump D [range]
masukkan alamat E [list]
mengisi daftar berbagai F
go G [= address] [alamat]
hex H nilai1 nilai2
masukan saya port
load L [address] [drive] [firstsector] [jumlah]
M bergerak kisaran alamat
nama N [pathname] [arglist]
output O port byte
lanjutkan P [= address] [jumlah]
berhenti Q
register R [register]
S pencarian kisaran daftar
jejak T [= address] [value]
unassemble U [range]
menulis W [address] [drive] [firstsector] [jumlah]
mengalokasikan memori diperluas XA [# pages]
deallocate memori diperluas XD [handle]
peta memori diperluas halaman XM [Lpage] [Ppage] [menangani]
XS menampilkan status memori diperluas

Mari kita pergi melalui masing-masing perintah:


Gabungkan:
-A
107A: 0100
Pada titik ini Anda dapat mulai merakit beberapa program, seperti menggunakan sebuah perakit.
Namun debug assembler sangat terbatas karena Anda mungkin akan melihat. Mari kita mencoba
untuk memasukkan program yang sederhana:
-A
107A: 0100 MOV AH, 02
107A: 0102 MOV DL, 41
107A: 0104 INT 21
107A: 0106 INT 20
-G
A
Program dihentikan biasanya

Itu program yang sama yang kami lakukan di akhir bab sebelumnya. Perhatikan bagaimana Anda
menjalankan program baru saja Anda masukkan dengan "g", dan juga perhatikan bagaimana bagian set-up yang tidak
ada? Itu karena debug hanya terlalu terbatas untuk mendukung itu.
Hal lain yang dapat Anda lakukan dengan merakit adalah menentukan alamat di mana Anda ingin memulai,
secara default ini adalah 0100 karena itulah di mana semua file COM. mulai.


Bandingkan:
Bandingkan memakan waktu 2 blok memori dan menampilkan mereka berdampingan, byte untuk byte. Mari kita lakukan
contoh. Cukup keluar dari debug jika Anda belum sudah menggunakan "q".
Sekarang ketik "debug c: \ command.com"
-C 0100 l 8 0200
10A3: 0100 7A 06 10A3: 0200
Perintah ini dibandingkan dengan offset 0100 0200 untuk panjang 8 byte. Debug menanggapi
dengan lokasi yang BERBEDA. Jika 2 lokasi adalah debug, sama akan hanya
menghilangkan mereka, jika semua adalah sama debug hanya akan kembali ke prompt tanpa
respon.


Dump:
Dump akan dump segmen memori tertentu. Untuk menguji ini, kode program assembly lagi:
C: \ debug>
-A
107A: 0100 MOV AH, 02
107A: 0102 MOV DL, 41
107A: 0104 INT 21
107A: 0106 INT 20
-D l 8 0100
107A: 0100 B4 02 B2 41 CD 21 CD 20 ... A.!.

The "B4 02 B2 41 CD 21 CD 20" adalah program yang baru saja dibuat dalam bahasa mesin.
B4 02 MOV AH =, 02
B2 41 MOV DL =, 41
CD 21 = INT 21
CD 20 = INT 20
The "... A.!." bagian merupakan program Anda dalam ASCII. The "." merupakan karakter non-printable.
Perhatikan A di sana.


Enter:
Ini adalah salah satu perintah keras. Dengan itu Anda dapat memasukkan / mengubah area memori tertentu.
Mari kita ubah program kami sehingga mencetak B bukannya suatu A.
-E 0103 <- mengedit program di segmen 0103
107A: 0103 41,42 <- perubahan 41-42
-G
B
Program dihentikan biasanya
-
Bukankah itu menakjubkan?


Isi:
Perintah ini cukup berguna, tapi siapa yang tahu ....
Ini mengisi jumlah tertentu memori dengan data tertentu. Mari kita contoh yang jelas untuk
semua memori dari segmen 0100-0108, yang kebetulan program kami.
-F 0100 l 8 0 <- file offset 0100 untuk panjang 8 byte dengan 0
-D 0100 l 8 <- memverifikasi bahwa hal itu berhasil
107A: 0100 00 00 00 00 00 00 00 00 .......
Yap, itu berhasil.


Go:
Sejauh ini kami menggunakan pergi (g) untuk memulai program baru saja kita buat. Tapi Go dapat digunakan untuk banyak
lebih. Sebagai contoh, katakanlah kita ingin mengeksekusi program di 107B: 0100:
-R CS <- mengatur CS mendaftar untuk menunjuk ke 107B
CS 107A
: 107B
-G = 100
Anda juga dapat mengatur breakpoints.
-A <- masukkan program asli kita sehingga kita memiliki sesuatu
107A: 0100 MOV AH, 02 untuk bekerja dengan
107A: 0102 MOV DL, 41
107A: 0104 INT 21
107A: 0106 INT 20
-G 102 <- menyiapkan jalur istirahat di 107A: 0102
Pada titik ini program akan berhenti, menampilkan semua register dan instruksi saat ini.


Hex:
Hal ini dapat sangat berguna. Ini mengurangi dan menambah nilai-nilai heksadesimal:
-H 2 1
0003 0001 <- 2h + 1 + = 3h dan 2h - 1h = 1h
Hal ini sangat berguna untuk menghitung panjang program, karena anda akan lihat nanti.


Input:
Ini adalah salah satu perintah yang lebih maju, dan aku memutuskan untuk tidak membicarakannya terlalu banyak
untuk saat ini. Ini akan membaca byte data dari komputer Anda port I / O (keyboard,
mouse, printer, dll).
-I 3FD
60
-
Data anda mungkin berbeda.
Jika anda ingin tahu, 3FD adalah Com port 1, juga dikenal sebagai Asynchronous Pertama Adapter.


Load:
Perintah ini memiliki 2 format. Hal ini dapat digunakan untuk memuat nama file yang ditentukan dengan
nama perintah (n), atau dapat memuat sektor tertentu.
-N c: \ command.com
-L
Hal ini akan memuat command.com ke debug. Ketika sebuah program yang valid dimuat semua register akan
dibentuk dan siap untuk melaksanakan program.
Metode lainnya adalah sedikit lebih rumit, tetapi potensial juga lebih berguna. Sintaks
adalah
L
-L 100 2 10 20 ini akan memuat dimulai pada 0100 offset dari drive C (0 = A, 1 = B, 2 = C, dll), sektor 10h untuk 20h sektor. Hal ini dapat berguna untuk memulihkan file Anda dihapus. Pindahkan: Memindahkan mengambil byte dari alamat awal dan bergerak ke alamat tujuan. Hal ini sangat baik untuk memindahkan data sementara ke daerah bebas, daripada memanipulasi tanpa harus khawatir tentang mempengaruhi program asli. Hal ini terutama berguna jika digunakan bersama dengan perintah r yang saya akan mendapatkan nanti. Mari kita mencoba sebuah contoh:-<- lebih 8 byte mulai dari 107A: 0100 menjadi 107B: 0100-e 107B: 0103 <- edit 107B: 0103 107B: 41,42 0103 <- dan mengubahnya 42 (B)-107A d: 0100 L 8 <- pastikan itu bekerja 107A: 0100 B4 02 B2 41 CD 21 CD 20 ... A.!. -D 107B: 0100 L 8 107A: 0100 B4 02 B2 42 CD 21 CD 20 ... B.!. -M 107B: 0100 L 8 107A: 0100 <- mengembalikan program asli karena kita menyukai perubahan. Nama: ini akan mengatur debug dengan sebuah nama berkas digunakan untuk I / O perintah. Anda harus menyertakan ekstensi file, dan Anda dapat menggunakan perintah tambahan:-nc: \ Output command.com: Tepatnya apa yang Anda pikirkan itu. Output mengirimkan barang ke port I / O. Jika Anda memiliki modem eksternal dengan lampu yang keren di atasnya, Anda dapat menguji hal ini. Cari tahu apa port modem Anda aktif dan menggunakan nomor hex yang sesuai di bawah ini: Com 1 = 3F8 - 3FF (3FD untuk tambang) Com 2 = 2F8 - Com 2FF 3 =??? -??? (Jika seseorang tahu, tolong beritahu saya, saya akan berasumsi bahwa meskipun itu 0F8 - 0FF.) Sekarang giliran pada bit (Data Terminal Ready) DTA dengan mengirimkan 01h untuk itu:-o XXX 1 <- XXX adalah port com dalam hex Segera setelah Anda tekan enter, lihat di modem Anda, Anda akan melihat lampu menyala. Anda bisa bersenang-senang bahkan lebih dengan perintah output. Katakanlah seseorang meletakkan salah satu password BIOS pada komputer "Anda". Biasanya Anda akan harus mengambil baterai untuk menyingkirkan, tapi sekarang tidak lagi: AMI / AWARD BIOS-o-o 70 17 71 17 QPHOENIX BIOS-o 70 FF-o 71 17 QGENERIC-o-o 70 2E 71 FF Perintah-perintah ini akan menghapus BIOS memori, sehingga melumpuhkan password. Namun, perlu diketahui bahwa angka ini cukup tua dan BIOS terus-menerus membuat perubahan mereka, sehingga mereka mungkin tidak bekerja dengan BIOS khusus Anda. Hasil: Hasil dalam pelaksanaan program, biasanya digunakan bersama-sama menganjal jejak, yang saya akan mencakup nanti. Seperti pergi perintah, Anda dapat menentukan alamat dari mana untuk mulai menggunakan alamat-p = 2 Debug akan merespon dengan register dan perintah saat ini akan dieksekusi. Cukup: Ini harus menjadi fitur yang paling maju dari debug, itu keluar debug! -Q Pendaftaran: Perintah ini dapat digunakan untuk menampilkan nilai saat ini dari semua register, atau mengaturnya secara manual. Hal ini sangat berguna untuk menulis file-file karena anda akan lihat nanti. -R AX AX: 011B: 5 - Search: Perintah lain yang sangat berguna. Hal ini digunakan untuk mencari terjadinya byte tertentu, atau serangkaian byte di segmen. Data untuk mencari bisa dengan baik karakter, atau nilai hex. nilai Hex dimasukkan dengan spasi atau koma di antara mereka, dan karakter yang diapit dengan tanda kutip (tunggal atau ganda). Anda juga dapat mencari hex dan karakter dengan string yang sama:-nc: \ <- cari memori seluruh blok untuk "MS-DOS" 10A3: <39E9 - ditemukan string di 10A3: CATATAN 39E9: pencarian kasus sensitif! Trace: Ini adalah fitur yang benar-benar besar debug. Ini akan menelusuri melalui instruksi satu program pada satu waktu, menampilkan instruksi dan register setelah masing-masing. Seperti pergi perintah Anda dapat menentukan di mana untuk memulai eksekusi dari, dan untuk berapa lama. -A <- ya, hal ini lagi 107A: 0100 MOV AH, 02 107A: 0102 MOV DL, 41 107A: 0104 INT 21 107A: 0106 INT 20-t = 0100 8 Jika Anda meninggalkan jumlah instruksi yang Anda inginkan untuk menelusuri, Anda dapat menggunakan dilanjutkan (p) untuk melanjutkan pelaksanaan selama Anda inginkan. 

sumber: burnyozmon

Pengantar Bahasa Assembly

Ini adalah pengenalan singkat bahasa assembly. Bahasa assembly adalah bahasa pemrograman yang paling dasar yang tersedia untuk prosesor apapun. Dengan bahasa assembly, programmer hanya bekerja dengan operasi diterapkan secara langsung pada CPU fisik. Majelis bahasa tidak memiliki kenyamanan tingkat tinggi, seperti variabel dan fungsi, dan tidak portabel di antara berbagai keluarga prosesor. Namun demikian, bahasa assembly adalah bahasa pemrograman komputer paling kuat yang tersedia, dan memberikan wawasan yang dibutuhkan programmer untuk menulis kode yang efektif dalam bahasa tingkat tinggi. Belajar bahasa assembly sangat layak waktu dan upaya masing-masing programmer serius. Dasar-dasar
Sebelum kita dapat menjelajahi proses penulisan program komputer, kita harus kembali ke dasar-dasar dan belajar apa komputer dan bagaimana kerjanya. Setiap komputer, tidak peduli seberapa sederhana atau kompleks, telah pada intinya tepat dua hal: CPU dan memori beberapa. Bersama-sama, kedua hal adalah apa yang memungkinkan bagi komputer Anda untuk menjalankan program.
Pada tingkat yang paling dasar, sebuah program komputer tidak lebih dari sekumpulan nomor yang tersimpan dalam memori. nomor yang berbeda memberitahu CPU untuk melakukan hal yang berbeda. CPU membaca satu nomor pada satu waktu, decode, dan melakukan apa angka katakan. Misalnya, jika CPU membaca nomor 64 sebagai bagian dari sebuah program, akan menambah 1 ke nomor yang tersimpan di lokasi khusus yang disebut AX. Jika CPU membaca nomor 146, maka akan swap nomor yang disimpan dalam AX dengan nomor yang tersimpan di lokasi lain yang disebut BX. Dengan menggabungkan banyak operasi sederhana seperti ini ke dalam program, programmer dapat membuat komputer melakukan banyak hal luar biasa.
Sebagai contoh, berikut adalah jumlah program komputer sederhana: 184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32. Jika Anda adalah untuk memasukkan angka-angka ini ke dalam memori komputer Anda dan menjalankan mereka dengan MS-DOS, anda akan melihat tanda dolar ditempatkan di sudut kanan bawah layar Anda, karena itulah yang angka-angka ini memberitahu komputer untuk melakukan. Bahasa Assembly
Meskipun jumlah program di atas masuk akal ke komputer, mereka tentang sejelas lumpur ke manusia. Siapa yang akan menduga bahwa mereka menempatkan tanda dolar di layar? Jelas, memasukkan nomor dengan tangan adalah cara buruk untuk menulis program.
Tidak harus seperti ini, walaupun. Dulu, seseorang datang dengan gagasan bahwa program komputer dapat ditulis menggunakan kata-kata, bukan angka. Sebuah program khusus yang disebut assembler kemudian akan mengambil kata-kata programmer dan mengkonversikannya ke nomor yang komputer bisa mengerti. Metode baru ini, yang disebut menulis sebuah program dalam bahasa assembly, programmer menyelamatkan ribuan jam, karena mereka tidak lagi harus melihat sulit mengingat nomor di punggung buku pemrograman, tetapi bisa menggunakan kata-kata sederhana sebagai gantinya.
Program di atas, ditulis dalam bahasa assembly, terlihat seperti ini: MOV AX, 47104 MOV DS, AX MOV [3998], 36 INT 32
Ketika assembler membaca ini contoh program, itu mengkonversi setiap baris kode ke dalam satu instruksi CPU-tingkat. Program ini menggunakan dua jenis instruksi, MOV dan INT. Pada prosesor Intel, instruksi MOV memindahkan data sekitar, sedangkan pada kontrol instruksi INT transfer prosesor untuk driver perangkat atau sistem operasi.
Program ini masih belum cukup jelas, tetapi jauh lebih mudah dipahami daripada sebelumnya. Instruksi pertama, MOV AX, 47104, memberitahu komputer untuk menyalin nomor 47104 ke dalam AX lokasi. Instruksi berikutnya, MOV DS, AX, memberitahu komputer untuk menyalin nomor di AX ke DS lokasi. Instruksi berikutnya, MOV [3998], 36 memberitahu komputer untuk menempatkan nomor 36 ke lokasi memori 3998. Akhirnya, INT 32 keluar dari program dengan kembali ke sistem operasi.
Sebelum kita lanjutkan, saya ingin menjelaskan bagaimana program ini bekerja. Di dalam CPU sejumlah lokasi, yang disebut register, yang dapat menyimpan nomor. Beberapa register, seperti AX, adalah tujuan umum, dan tidak melakukan sesuatu yang istimewa. Register lainnya, seperti DS, mengontrol cara CPU bekerja. DS hanya terjadi menjadi sebuah register segmen, dan digunakan untuk memilih area memori CPU dapat menulis. Dalam program kami, kami menempatkan nomor 47104 ke DS, yang memerintahkan CPU untuk mengakses memori pada kartu video. Hal berikutnya program kami ini adalah untuk menempatkan nomor 3998 36 ke lokasi memori kartu video itu. Karena 36 adalah kode untuk tanda dolar, dan 3998 adalah lokasi memori sudut kanan bawah layar, tanda dolar muncul di layar sebuah mikrodetik kemudian. Akhirnya, program kami memberitahu CPU untuk melakukan apa yang disebut interrupt. Sebuah interupsi digunakan untuk menghentikan satu program dan melaksanakan lain di tempatnya. Dalam kasus kami, kami ingin mengganggu 32, yang akan berakhir program kami dan kembali ke MS-DOS, atau apa pun program lain digunakan untuk memulai program kami. Menjalankan Program
Mari kita pergi ke depan dan menjalankan program ini. Pertama, pastikan untuk mencetak instruksi ini keluar, karena Anda akan perlu merujuk kepada mereka seperti yang kita pergi. Selanjutnya, klik pada menu start, dan menjalankan program yang disebut "MS-DOS Prompt." Sebuah layar hitam dengan teks putih akan muncul. Kita sekarang dalam MS-DOS, komputer cara yang digunakan untuk 20 tahun yang lalu. MS-DOS adalah sebelum hari mouse, sehingga Anda harus mengetik perintah pada keyboard untuk membuat komputer melakukan sesuatu.
Pertama, saya ingin Anda mengetik kata "debug," dan tekan enter. kursor harus bergerak ke bawah baris, dan Anda akan melihat prompt Debug, yang merupakan dash sederhana. Kita sekarang dalam sebuah program yang disebut Debug. Debug adalah utilitas yang kuat yang memungkinkan Anda langsung mengakses register dan memori komputer Anda untuk berbagai keperluan. Dalam kasus kami, kami ingin memasukkan program kami ke memori dan menjalankannya, jadi kita akan menggunakan perintah Debug, untuk berkumpul. Pergi ke depan dan ketik "A100" sekarang. Kursor akan bergerak ke bawah garis lain, dan Anda akan melihat sesuatu seperti "1073:0100." Ini adalah lokasi memori kita akan memasukkan instruksi bahasa assembly di. Nomor pertama adalah segmen, dan angka kedua adalah lokasi memori di dalam segmen tersebut. Debug program anda mungkin akan memilih segmen yang berbeda untuk program anda dari saya lakukan, jadi jangan khawatir jika itu berbeda. Satu hal yang perlu diperhatikan adalah bahwa Debug hanya mengerti angka-angka heksadesimal, yang merupakan semacam singkatan komputer. angka Heksadesimal kadang-kadang mengandung huruf serta serta angka, jadi jika Anda melihat sesuatu seperti "63AF," jangan khawatir.
Mari kita pergi ke depan dan memasuki program kami sekarang. Setiap jenis instruksi di bawah ini ke Debug persis seperti mereka muncul, dan tekan enter setelah satu per satu. Ketika Anda selesai memasukkan instruksi terakhir, tekan enter dua kali untuk memberitahu Debug bahwa kita sudah selesai memasukkan instruksi. mov ax, B800 mov ds, ax mov byte [0F9E], 24 int 20
Seperti yang Anda lihat, aku sudah dikonversi semua angka ke dalam heksadesimal, dan telah membuat beberapa perubahan lain sehingga Debug dapat mengerti apa yang sedang terjadi. Jika Anda membuat kesalahan ketika memasuki program di atas, tekan enter dua kali, ketik "A100," dan mulai memasuki instruksi lagi pada awal program.
Setelah Anda memasukkan program, Anda dapat melanjutkan dan menjalankannya. Cukup ketik "g" untuk pergi dan tekan enter saat Anda siap untuk memulai program ini. Anda akan melihat tanda dolar di sudut kanan bawah layar Anda dan kata-kata "Program dihentikan normal." Kata-kata ini yang dikeluarkan oleh Debug untuk memberi tahu bahwa program berakhir normal. Selamat! Anda baru saja masuk dan menjalankan perakitan pertama program bahasa!
Mari kita kembali ke Windows sekarang. Pergi ke depan dan ketik "q" untuk keluar dari Debug. Sekarang, ketik "exit" untuk keluar dari MS-DOS. Anda sekarang akan kembali pada Windows.


translate from swansontec.com

Daftar Instruksi Bahasa Assembly MCS-51


Dalam program bahasa assembly terdapat 2 jenis yang kita tulis dalam program:
1. Assembly Directive (yaitu merupakan kode yang menjadi arahan bagi assembler/compiler untuk menata program)
2. Instruksi (yaitu kode yang harus dieksekusi oleh CPU mikrokontroler dengan melakukan operasi tertentu sesuai dengan daftar yang sudah tertanam dalam CPU)
 


Daftar Assembly Directive
Assembly Directive
Keterangan
EQU
Pendefinisian konstanta
DB
Pendefinisian data dengan ukuran satuan 1 byte
DW
Pendefinisian data dengan ukuran satuan 1 word
DBIT
Pendefinisian data dengan ukuran satuan 1 bit
DS
Pemesanan tempat penyimpanan data di RAM
ORG
Inisialisasi alamat mulai program
END
Penanda akhir program
CSEG
Penanda penempatan di code segment
XSEG
Penanda penempatan di external data segment
DSEG
Penanda penempatan di internal direct data segment
ISEG
Penanda penempatan di internal indirect data segment
BSEG
Penanda penempatan di bit data segment
CODE
Penanda mulai pendefinisian program
XDATA
Pendefinisian external data
DATA
Pendefinisian internal direct data
IDATA
Pendefinisian internal indirect data
BIT
Pendefinisian data bit
#INCLUDE
Mengikutsertakan file program lain

Daftar Instruksi
Instruksi
Keterangan Singkatan
ACALL
Absolute Call
ADD
Add
ADDC
Add with Carry
AJMP
Absolute Jump
ANL
AND Logic
CJNE
Compare and Jump if Not Equal
CLR
Clear
CPL
Complement
DA
Decimal Adjust
DEC
Decrement
DIV
Divide
DJNZ
Decrement and Jump if Not Zero
INC
Increment
JB
Jump if Bit Set
JBC
Jump if Bit Set and Clear Bit
JC
Jump if Carry Set
JMP
Jump to Address
JNB
Jump if Not Bit Set
JNC
Jump if Carry Not Set
JNZ
Jump if Accumulator Not Zero
JZ
Jump if Accumulator Zero
LCALL
Long Call
LJMP
Long Jump
MOV
Move from Memory
MOVC
Move from Code Memory
MOVX
Move from Extended Memory
MUL
Multiply
NOP
No Operation
ORL
OR Logic
POP
Pop Value From Stack
PUSH
Push Value Onto Stack
RET
Return From Subroutine
RETI
Return From Interrupt
RL
Rotate Left
RLC
Rotate Left through Carry
RR
Rotate Right
RRC
Rotate Right through Carry
SETB
Set Bit
SJMP
Short Jump
SUBB
Subtract With Borrow
SWAP
Swap Nibbles
XCH
Exchange Bytes
XCHD
Exchange Digits
XRL
Exclusive OR Logic 


sumber : mikron123

____________


ShoutMix chat widget