content:
Mungkin hambatan terbesar yang dihadapi pemula saat mencoba belajar bahasa assembly adalah penggunaan umum dari penomoran biner dan heksadesimal sistem. Banyak programmer berpikir bahwa hexadecimal (atau hex1) angka mewakili absolut bukti bahwa Tuhan tidak pernah meminta siapapun untuk bekerja dalam bahasa assembly. Sementara itu benar angka heksadesimal sedikit berbeda dari yang biasa Anda gunakan keuntungan lebih besar daripada kerugian mereka dengan margin yang besar. Namun demikian, pengertiansistem penomoran ini penting karena penggunaannya menyederhanakan topik rumit lainnya termasuk aljabar boolean dan desain logika, menandatangani representasi numerik, karakter kode, dan data yang dikemas.
Bab ini membahas beberapa konsep penting termasuk biner dan heksadesimal sistem penomoran, organisasi data biner (bit, nibbles, bytes, word, dan double kata-kata), sistem penomoran bertanda tangan dan tidak bertanda tangan, aritmatika, logis, bergeser, dan berputar operasi pada nilai-nilai biner, bidang bit dan data yang dikemas, dan set karakter ASCII. Ini adalah bahan dasar dan sisa teks ini tergantung pada pemahaman Anda tentang ini konsep. Jika Anda sudah akrab dengan istilah-istilah ini dari kursus lain atau belajar, Anda setidaknya harus skim bahan ini sebelum melanjutkan ke bab berikutnya. Jika Anda tidak terbiasa dengan materi ini, atau hanya sedikit yang akrab dengannya, Anda harus mempelajarinya dengan cermat sebelum melanjutkan. Semua materi dalam bab ini penting! Jangan melewatkan materi apa pun.
1.1 Sistem Penomoran
Kebanyakan sistem komputer modern tidak mewakili nilai numerik menggunakan desimal sistem. Sebaliknya, mereka biasanya menggunakan sistem penomoran bilangan biner atau dua. Untuk memahami keterbatasan aritmatika komputer, Anda harus memahami bagaimana komputer mewakili angka.
1.1.1 Tinjauan Sistem Desimal
Anda telah menggunakan sistem penomoran desimal (basis 10) begitu lama sehingga Anda mungkin menerima begitu saja. Saat Anda melihat angka seperti “123”, Anda tidak memikirkan tentang nilai 123; alih-alih, Anda menghasilkan gambaran mental tentang berapa banyak item yang diwakili oleh nilai ini. Namun dalam kenyataannya, angka 123 mewakili:
1*10² + 2 * + 3* or 100+20+3
Setiap digit yang muncul di sebelah kiri titik desimal menunjukkan nilai antara nol
dan sembilan kali peningkatan kekuatan sepuluh. Digit muncul di sebelah kanan desimal
titik mewakili nilai antara nol dan sembilan kali peningkatan daya negatif dari sepuluh.
Misalnya, nilai 123.456 berarti:
1*10² + 2* + 3* + 4*10-1 + 5*10-2 + 6*10
1.1.2 The Binary Numbering System
Sebagian besar sistem komputer modern (termasuk PC IBM) beroperasi menggunakan logika biner. Komputer mewakili nilai menggunakan dua level tegangan (biasanya 0v dan +5v). Dengan dua tingkat seperti itu kita dapat mewakili tepat dua nilai yang berbeda. Ini bisa menjadi dua berbeda nilai-nilai, tetapi berdasarkan konvensi kami menggunakan nilai nol dan satu. Kedua nilai ini, secara tidak sengaja, sesuai dengan dua digit yang digunakan oleh sistem penomoran biner. Karena ada korespondensi antara level logika yang digunakan oleh 80×86 dan dua digit yang digunakan sistem penomoran biner, seharusnya tidak mengherankan bahwa PC IBM menggunakan sistem penomoran biner. Sistem penomoran biner berfungsi seperti sistem penomoran desimal, dengan dua pengecualian: biner hanya memungkinkan digit 0 dan 1 (bukan 0-9), dan menggunakan biner kekuatan dua daripada kekuatan sepuluh. Oleh karena itu, sangat mudah untuk mengkonversi biner angka hingga desimal. Untuk setiap “1” dalam string biner, tambahkan 2n di mana “n” adalah posisi nol dari digit biner. Sebagai contoh, nilai biner 110010102 mewakili:
Untuk mengkonversi desimal ke biner sedikit lebih sulit. Anda harus menemukan kekuatan itu dua yang, bila ditambahkan bersama, menghasilkan hasil desimal. Metode termudah adalah bekerja dari kekuatan besar dua hingga 20. Pertimbangkan nilai desimal 1359:
210 = 1024, 211 = 2048. Jadi 1024 adalah kekuatan terbesar dua kurang dari 1359.Kurangi 1024 dari 1359 dan mulai nilai biner di sebelah kiri dengan “1” angka. Biner = “1”, hasil desimal adalah 1359 – 1024 = 335.
Kekuatan bawah berikutnya dua (29 = 512) lebih besar dari hasil dari di atas, jadi tambahkan “0” ke ujung string biner. Biner = “10”, Desimal hasilnya masih 335.
Kekuatan bawah berikutnya dua adalah 256 (28). Kurangkan ini dari 335 dan tambahkana Digit “1” ke ujung angka biner. Biner = “101”, hasil Desimal adalah 79.
128 (27) lebih besar dari 79, jadi tundukkan “0” ke ujung string biner. Biner = “1010”, hasil Desimal tetap 79.
Kekuatan bawah berikutnya dari dua (26 = 64) kurang dari 79, jadi kurangi 64 dan tambahkan “1” ke ujung string biner. Biner = “10101”, Desimal hasilnya 15.
15 kurang dari dua kekuatan berikutnya (25 = 32) jadi cukup tambahkan “0” ke ujung string biner. Biner = “101010”, hasil Desimal masih 15.
16 (24) lebih besar dari yang tersisa sejauh ini, jadi tambahkan “0” hingga akhir string biner. Biner = “1010100”, hasil desimal adalah 15.
23 (delapan) kurang dari 15, jadi tempelkan angka “1” di ujung biner tali. Biner = “10101001”, hasil Desimal adalah 7.
22 kurang dari tujuh, jadi kurangi empat dari tujuh dan tambahkan satu lagi ke string biner. Biner = “101010011”, hasil desimal adalah 3.
21 kurang dari tiga, jadi tambahkan satu ke ujung string biner dan kurangi dua dari nilai desimal. Biner = “1010100111”, Desimalhasilnya sekarang 1.
Akhirnya, hasil desimal adalah satu, yaitu 20, jadi tambahkan akhir “1” sampai akhir dari string biner. Hasil biner terakhir adalah “10101001111” Dalam arti yang paling murni, setiap bilangan biner mengandung jumlah digit yang tak terbatas (atau bit yang kependekan dari digit biner). Misalnya, kita dapat mewakili nomor lima dengan:
101 00000101 0000000000101 … 000000000000101
Sejumlah bit nol terkemuka dapat mendahului bilangan biner tanpa mengubah bilangan binernya nilai. Kami akan mengadopsi konvensi ini tanpa mengabaikan nol di depan. Misalnya, 1012 mewakili nomor lima. Karena 80×86 berfungsi dengan delapan kelompok bit, kami akan banyak menemukannya lebih mudah untuk nol memperpanjang semua bilangan biner ke beberapa kelipatan empat atau delapan bit. Karena itu, mengikuti konvensi ini, kami mewakili angka lima sebagai 01012 atau 000001012.Di Amerika Serikat, kebanyakan orang memisahkan setiap tiga digit dengan koma jumlah yang lebih besar lebih mudah dibaca. Misalnya, 1.023.435.208 jauh lebih mudah dibaca dan dipahami dari 1023435208. Kami akan mengadopsi konvensi serupa dalam teks ini untuk bilangan biner.
Kami akan memisahkan setiap kelompok dari empat bit biner dengan spasi. Misalnya, biner nilai 1010111110110010 akan ditulis 1010 1111 1011 0010. Kami sering mengemas beberapa nilai bersama ke dalam bilangan biner yang sama. Salah satu bentuk dari 80×86 instruksi MOV (lihat lampiran D) menggunakan pengkodean biner 1011 0rrr dddd dddd ke bungkus tiga item menjadi 16 bit: kode operasi lima-bit (10110), bidang register tiga-bit (rrr), dan nilai langsung delapan bit (dddd dddd). Untuk kenyamanan, kami akan menetapkan nilai numerik untuk setiap posisi bit. Kami akan memberi nomor masing-masing sebagai berikut:
1) Bit paling kanan dalam bilangan biner adalah posisi bit nol.
2) Setiap bit ke kiri diberikan nomor bit berikutnya yang berurutan
Nilai biner delapan bit menggunakan bit nol hingga tujuh:
X7 X6 X5 X4 X3 X2 X1 X0
Nilai biner 16-bit menggunakan posisi bit nol hingga lima belas:
X15 X14 X13 X12 X11 X10 X9 X8 X7 X6 X5 X4 X3 X2 X1 X0
Bit nol biasanya disebut sebagai bit low order (L.O.). Bit paling kiri biasanya disebut bit orde tinggi (H.O.). Kami akan merujuk ke bit menengah dengan bit masing-masing angka.
1.2 Data Organisai
Dalam matematika murni suatu nilai dapat mengambil sejumlah bit yang acak. Komputer, di sisi lain, umumnya bekerja dengan sejumlah bit tertentu. Koleksi umum adalah bit tunggal, kelompok empat bit (disebut nibbles), kelompok delapan bit (disebut byte), grup 16 bit (disebut kata), dan banyak lagi. Ukurannya tidak sembarangan. Ada alasan bagus untuk itu nilai-nilai khusus ini. Bagian ini akan menjelaskan kelompok-kelompok bit yang biasa digunakan pada Chip Intel 80×86.
1.2.1 Bits
“Unit” data terkecil pada komputer biner adalah bit tunggal. Karena sedikit pun mampu mewakili hanya dua nilai yang berbeda (biasanya nol atau satu), Anda mungkin mendapatkan kesan bahwa ada sejumlah kecil item yang dapat Anda wakili dengan satu bit. Tidak benar! Ada jumlah item tak terbatas yang dapat Anda wakili dengan satu bit. Dengan satu bit, Anda dapat mewakili dua item berbeda. Contohnya termasuk nol atau satu, benar atau salah, aktif atau tidak aktif, pria atau wanita, dan benar atau salah. Namun, Anda tidak terbatas untuk mewakili tipe data biner (yaitu, objek-objek yang hanya memiliki dua yang berbeda nilai). Anda bisa menggunakan sedikit untuk mewakili angka 723 dan 1.245. Atau mungkin 6,254 dan 5. Anda juga bisa menggunakan bit tunggal untuk mewakili warna merah dan biru. Anda bisa bahkan mewakili dua benda yang tidak berhubungan dengan satu bit. Misalnya, Anda dapat mewakili warna merah dan angka 3.256 dengan satu bit. Anda dapat mewakili dua yang berbeda nilai dengan satu bit. Namun, Anda hanya dapat mewakili dua nilai yang berbeda dengan satu sedikit. Untuk membingungkan lebih banyak lagi, bit yang berbeda dapat mewakili hal yang berbeda. Sebagai contoh, satu bit mungkin digunakan untuk mewakili nilai nol dan satu, sementara bit yang berdekatan dapat digunakan untuk merepresentasikan nilai benar dan salah. Bagaimana Anda bisa tahu dengan melihat bit? Jawabannya, tentu saja, adalah Anda tidak bisa. Tapi ini menggambarkan seluruh ide di belakang struktur data komputer: data adalah apa yang Anda definisikan. Jika Anda menggunakan sedikit untuk mewakili boolean (true / false) value maka bit itu (menurut definisi Anda) mewakili benar atau salah. Untuk sedikit untuk memiliki arti yang benar, Anda harus konsisten. Yaitu, jika Anda menggunakan sedikit untuk mewakili benar atau salah pada satu titik di program Anda, Anda seharusnya tidak menggunakan nilai true / false yang disimpan bit itu untuk mewakili merah atau biru nanti. Karena sebagian besar item yang akan Anda coba model membutuhkan lebih dari dua nilai yang berbeda, tunggal nilai bit bukan jenis data paling populer yang akan Anda gunakan. Namun, karena yang lainnya terdiri dari kelompok bit, bit akan memainkan peran penting dalam program Anda. Tentu saja, ada beberapa tipe data yang membutuhkan dua nilai berbeda, sehingga tampaknya bit-bit itu ada penting oleh diri mereka sendiri. Namun, Anda akan segera melihat bahwa bit individual itu sulit memanipulasi, jadi kami akan sering menggunakan tipe data lain untuk merepresentasikan nilai boolean.
1.2.2 Nibbles
Nibble adalah kumpulan empat bit. Itu tidak akan menjadi struktur data yang sangat menarik kecuali untuk dua item: BCD (binary coded decimal) angka dan angka heksadesimal. Dibutuhkan empat bit untuk mewakili satu BCD atau digit heksadesimal. Dengan nibble, kita bisa mewakili hingga 16 nilai yang berbeda. Dalam kasus angka heksadesimal, nilai 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, dan F diwakili dengan empat bit (lihat “The Hexadecimal Sistem Penomoran ”di halaman 17). BCD menggunakan sepuluh digit yang berbeda (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) dan membutuhkan empat bit. Faktanya, enam belas nilai berbeda dapat diwakili dengan nibble, tapi digit heksadesimal dan BCD adalah item utama yang dapat kita wakili dengan satu nibble.
1.2.3 Bytes
Tanpa pertanyaan, struktur data terpenting yang digunakan oleh mikroprosesor 80×86 byte. Satu byte terdiri dari delapan bit dan merupakan datum yang dapat dialamatkan terkecil (data item) pada mikroprosesor 80×86. Memori utama dan alamat I / O pada 80×86 semuanya alamat byte. Ini berarti bahwa barang terkecil yang dapat diakses secara individual oleh sebuah Program 80×86 adalah nilai delapan-bit. Untuk mengakses sesuatu yang lebih kecil mengharuskan Anda membaca byte yang berisi data dan menyembunyikan bit yang tidak diinginkan. Bit-bit dalam satu byte biasanya berjumlah dari nol hingga tujuh menggunakan konvensi pada Gambar 1.1.
Bit 0 adalah bit orde rendah atau paling tidak signifikan, bit 7 adalah bit orde tinggi atau paling signifikan sedikit byte. Kami akan merujuk ke semua bit lainnya berdasarkan nomor mereka. Bits 0..3 terdiri dari nibble order rendah, bit 4..7 membentuk nibble tingkat tinggi. Sejak satu byte mengandung tepat dua camilan, nilai byte membutuhkan dua digit heksadesimal. Karena satu byte mengandung delapan bit, itu bisa mewakili 28, atau 256, nilai yang berbeda. Umumnya,
kami akan menggunakan byte untuk merepresentasikan nilai numerik dalam rentang 0..255, angka yang ditandatangani di kisaran -128 .. + 127 (lihat “Nomor yang Ditandatangani dan Tidak Ditandatangani” pada halaman 23), karakter ASCII / IBM kode, dan jenis data khusus lainnya yang membutuhkan tidak lebih dari 256 nilai yang berbeda. Banyak tipe data memiliki kurang dari 256 item sehingga delapan bit biasanya cukup.
Karena 80×86 adalah mesin beralamat byte (lihat “Memori Layout dan Akses” di halaman 145), ternyata lebih efisien untuk memanipulasi seluruh byte daripada individu bit atau menggigit. Untuk alasan ini, sebagian besar programmer menggunakan seluruh byte untuk mewakili tipe data yang tidak memerlukan lebih dari 256 item, bahkan jika kurang dari delapan bit akan mencukupi. Sebagai contoh, kami akan sering mewakili nilai boolean true dan false oleh 000000012 dan 000000002 (masing-masing).
Mungkin penggunaan yang paling penting untuk byte adalah memegang kode karakter. Karakter diketik di keyboard, ditampilkan di layar, dan dicetak pada printer semua miliki nilai numerik. Agar dapat berkomunikasi dengan seluruh dunia, PC IBM menggunakan varian dari set karakter ASCII (lihat “Set Karakter ASCII” pada halaman 28). Ada 128 kode yang ditetapkan dalam set karakter ASCII. IBM menggunakan 128 kemungkinan nilai yang tersisa untuk kode karakter yang diperluas termasuk karakter Eropa, simbol grafis, huruf Yunani, dan simbol matematika. Lihat Lampiran A untuk penugasan karakter / kode.
1.2.4 Kata
Sebuah kata adalah sekelompok 16 bit. Kami akan memberi nomor bit dalam satu kata mulai dari nol hingga limabelas. Penomoran bit muncul pada Gambar 1.3. Seperti halnya byte, bit 0 adalah bit orde rendah dan bit 15 adalah bit orde tinggi. Ketika referensi bit lain dalam satu kata menggunakan nomor posisi bit mereka.
Gambar 1.2: The Two
Kata ganda adalah persis seperti namanya, sepasang kata. Karena itu, ganda kuantitas kata adalah 32 bit panjang seperti yang ditunjukkan pada Gambar 1.6. Secara alami, kata ganda ini dapat dibagi menjadi kata orde tinggi dan orde rendah kata, atau empat byte berbeda, atau delapan camilan yang berbeda (lihat Gambar 1.7).
Kata-kata ganda dapat mewakili semua jenis hal yang berbeda. Pertama dan terpenting dalam daftar adalah alamat tersegmentasi. Item umum lainnya yang diwakili dengan kata ganda adalah 32-bit nilai integer (yang memungkinkan angka tidak bertanda di kisaran 0,4,294,967,295 atau ditandatangani angka dalam rentang -2,147,483,648..2,147,483,647). Nilai floating point 32-bit juga cocok menjadi kata ganda. Seringkali, kami akan menggunakan kata-kata ganda untuk mempertahankan segmentasi alamat.
1.3 Sistem Penomoran Heksadesimal
Masalah besar dengan sistem biner adalah verbositas. Untuk mewakili nilai 20210 membutuhkan delapan digit biner. Versi desimal hanya membutuhkan tiga digit desimal dan, dengan demikian, mewakili angka jauh lebih kompak daripada sistem penomoran biner. Fakta ini tidak hilang pada para insinyur yang mendesain sistem komputer biner. Kapan berurusan dengan nilai-nilai besar, angka biner dengan cepat menjadi terlalu berat. Sayangnya, komputer berpikir dalam biner, sehingga sebagian besar waktu itu nyaman untuk menggunakan penomoran biner sistem. Meskipun kita dapat mengkonversi antara desimal dan biner, konversi adalah bukan tugas yang sepele. Sistem penomoran heksadesimal (basis 16) memecahkan masalah ini.
Bilangan heksadesimal menawarkan dua fitur yang kami cari: mereka sangat kompak, dan itu mudah untuk mengonversinya menjadi biner dan sebaliknya. Karena ini, kebanyakan komputer biner sistem saat ini menggunakan sistem penomoran heksadesimal2. Karena radix (basis) dari heksadesimal
angka 16, setiap digit heksadesimal di sebelah kiri titik heksadesimal mewakili beberapa nilai dikalikan dengan kekuatan 16 berturut-turut. Misalnya, angka 123416 sama
untuk:
1 * 163 + 2 * 162 + 3 * 161 + 4 * 160
atau
4096 + 512 + 48 + 4 = 466010.
Setiap digit heksadesimal dapat mewakili satu dari enam belas nilai antara 0 dan 1510. Karena hanya ada sepuluh digit desimal, kita perlu menemukan enam digit tambahan untuk mewakili nilai dalam rentang 1010 hingga 1510. Alih-alih membuat simbol baru untuk digit ini, kami akan menggunakan huruf A hingga F. Berikut ini adalah semua contoh heksadesimal yang valid
angka:
123416 DEAD16 BEEF16 0AFB16 FEED16 DEAF16
Karena kita sering harus memasukkan angka heksadesimal ke dalam sistem komputer, kami akan membutuhkan mekanisme yang berbeda untuk mewakili angka heksadesimal. Lagi pula, paling banyak sistem komputer Anda tidak dapat memasukkan subscript untuk menunjukkan radix dari nilai yang terkait.
Kami akan mengadopsi konvensi berikut:
Semua nilai numerik (terlepas dari radix) dimulai dengan digit desimal.
Semua nilai heksadesimal diakhiri dengan huruf “h”, misalnya, 123A4h3.
Semua nilai biner diakhiri dengan huruf “b”.
Angka desimal mungkin memiliki akhiran “t” atau “d”.
Contoh angka heksadesimal yang valid:
1234h 0DEADh 0BeeFh 0AFBh 0FEEDh 0DEAFh
Seperti yang Anda lihat, bilangan heksadesimal kompak dan mudah dibaca. Selain itu, kamu dapat dengan mudah mengkonversi antara heksadesimal dan biner. Pertimbangkan tabel berikut: Tabel ini menyediakan semua informasi yang Anda perlukan untuk mengkonversi nomor heksadesimal menjadi bilangan biner atau sebaliknya.
Untuk mengonversi bilangan heksadesimal menjadi bilangan biner, cukup gantilah yang sesuai empat bit untuk setiap digit heksadesimal dalam angkanya. Misalnya, untuk berkonversi 0ABCDh menjadi nilai biner, cukup konversi setiap digit heksadesimal menurut tabel
atas:
0 A B C D Heksadesimal
0000 1010 1011 1100 1101 Biner
Untuk mengkonversi bilangan biner ke dalam format heksadesimal hampir sama mudahnya. Langkah pertama adalah untuk memadatkan angka biner dengan nol untuk memastikan bahwa ada kelipatan empat bit dalam nomor. Misalnya, diberi nomor biner 1011001010, langkah pertama adalah tambahkan dua bit di sebelah kiri nomor sehingga berisi 12 bit. Biner yang dikonversinilainya adalah 001011001010. Langkah selanjutnya adalah memisahkan nilai biner ke dalam empat kelompok bit, misalnya, 0010 1100 1010. Terakhir, cari nilai biner ini di tabel di atas dan gantikan digit heksadesimal yang sesuai, misalnya, 2CA. Bandingkan ini dengan kesulitan konversi antara desimal dan biner atau desimal dan heksadesimal!
Karena konversi antara heksadesimal dan biner adalah operasi yang Anda perlukan melakukan berulang-ulang, Anda harus meluangkan beberapa menit dan menghafal mejaatas. Bahkan jika Anda memiliki kalkulator yang akan melakukan konversi untuk Anda, Anda akan menemukan panduan konversi menjadi jauh lebih cepat dan lebih nyaman ketika mengkonversi antara biner dan hex.
1.4 Operasi Aritmatika pada Bilangan Biner dan Heksadesimal
Ada beberapa operasi yang dapat kita lakukan pada angka biner dan heksadesimal. Sebagai contoh, kita dapat menambahkan, mengurangi, mengalikan, membagi, dan melakukan operasi aritmatika lainnya.
Meskipun Anda tidak perlu menjadi ahli dalam hal itu, Anda seharusnya dapat, dalam keadaan darurat, melakukan operasi ini secara manual menggunakan selembar kertas dan pensil. Baru saja mengatakan itu Anda harus dapat melakukan operasi ini secara manual, cara yang benar untuk melakukan hal tersebut operasi aritmatika adalah memiliki kalkulator yang membuatnya cocok untuk Anda. Ada beberapa kalkulator semacam itu di pasar; tabel berikut mencantumkan beberapa produsen yang menghasilkan perangkat semacam itu: Produsen Kalkulator Heksadesimal:
Casio
Hewlett Packard
Tajam
Instrumen Texas
Daftar ini tidak berarti lengkap. Produsen kalkulator lain mungkin menghasilkan perangkat ini juga. Perangkat Hewlett-Packard bisa dibilang yang terbaik dari banyak. Namun, mereka lebih mahal daripada yang lain. Tajam dan Casio menghasilkan unit yang dijual dengan baik di bawah $ 50. Jika Anda berencana untuk melakukan pemrograman bahasa assembly sama sekali, memiliki salah satu kalkulator ini sangat penting.
Alternatif lain untuk membeli kalkulator heksadesimal adalah untuk mendapatkan TSR (Hentikan dan Stay Resident) program seperti SideKicktm yang berisi kalkulator built-in. Namun, kecuali Anda sudah memiliki salah satu dari program ini, atau Anda memerlukan yang lain fitur yang mereka tawarkan, program semacam itu bukan nilai yang sangat baik karena harganya lebih mahal dari kalkulator yang sebenarnya dan tidak nyaman digunakan. Untuk memahami mengapa Anda harus menghabiskan uang di kalkulator, pertimbangkan hal berikut
masalah aritmatika:
9h
+ 1 jam
—-
Anda mungkin tergoda untuk menulis jawaban “10 jam” sebagai solusi untuk masalah ini. Tapi itu tidak benar! Jawaban yang benar adalah sepuluh, yaitu “0Ah”, bukan enam belas yang “10h”. SEBUAH masalah serupa ada dengan masalah aritmatika:
10 jam
– 1h
—-
Anda mungkin tergoda untuk menjawab “9h” meskipun jawaban yang benar adalah “0Fh”. Ingat, masalah ini bertanya “apa perbedaan antara enam belas dan satu?” Jawabannya, tentu saja, adalah lima belas yang “0Fh”.
Bahkan jika dua masalah di atas tidak mengganggu Anda, dalam situasi yang menekan otak Anda akan beralih kembali ke mode desimal saat Anda memikirkan hal lain dan Anda akan menghasilkan hasil yang salah. Moral dari cerita – jika Anda harus melakukan perhitungan aritmatika menggunakan angka heksadesimal dengan tangan, luangkan waktu Anda dan berhati-hatilah. Antara itu, atau mengubah angka ke desimal, melakukan operasi dalam desimal, dan mengkonversi mereka kembali ke heksadesimal.
Anda seharusnya tidak pernah melakukan perhitungan aritmatika biner. Sejak bilangan biner biasanya berisi string panjang bit, ada terlalu banyak kesempatan bagi Anda untuk membuat kesalahan. Selalu mengonversi bilangan biner menjadi heksa, lakukan operasi dalam heksa (lebih disukai dengan hex kalkulator) dan mengkonversi hasilnya kembali ke biner, jika perlu.
1.5 Operasi Logikal pada Bits
Ada empat operasi logis utama yang harus kita lakukan pada heksadesimal dan bilangan biner: AND, OR, XOR (eksklusif-atau), dan TIDAK. Berbeda dengan operasi aritmatika, kalkulator heksadesimal tidak diperlukan untuk melakukan operasi ini. Seringkali lebih mudah untuk melakukannya dengan tangan daripada menggunakan perangkat elektronik untuk menghitungnya. AND yang logis operasi adalah operasi dyadic4 (artinya menerima dua operand). Operan ini adalah bit biner tunggal (basis 2). Operasi AND adalah:
0 dan 0 = 0
0 dan 1 = 0
1 dan 0 = 0
1 dan 1 = 1
Cara ringkas untuk merepresentasikan operasi AND yang logis adalah dengan tabel kebenaran. Kebenaran tabel mengambil bentuk berikut: Ini seperti tabel perkalian yang Anda temui di sekolah dasar. Itu kolom di sebelah kiri dan baris di bagian atas mewakili nilai input ke operasi AND.
Nilai yang terletak di persimpangan baris dan kolom (untuk pasangan masukan tertentu nilai-nilai) adalah hasil dari logika ANDing kedua nilai tersebut bersama-sama. Dalam bahasa Inggris, logis Operasi AND adalah, “Jika operan pertama adalah satu dan operan kedua adalah satu, hasilnya adalah satu; jika tidak, hasilnya nol. ” Satu fakta penting untuk dicatat tentang operasi AND yang logis adalah Anda dapat menggunakannya memaksakan hasil nol. Jika salah satu operan adalah nol, hasilnya selalu nol terlepas dari operan lainnya. Pada tabel kebenaran di atas, misalnya, baris berlabel dengan input nol hanya berisi nol dan kolom berlabel dengan nol hanya berisi hasil nol. Sebaliknya, jika satu operand berisi satu, hasilnya adalah persis nilai operan kedua.
Fitur-fitur operasi AND ini sangat penting, terutama ketika bekerja dengan string bit dan kami ingin memaksa bit individual dalam string ke nol. Kami akan menyelidikinya penggunaan ini dari operasi AND yang logis di bagian berikutnya.
Operasi OR yang logis juga merupakan operasi diadik. Definisinya adalah:
0 atau 0 = 0
0 atau 1 = 1
1 atau 0 = 1
1 atau 1 = 1
Bahasa sehari-hari, operasi OR yang logis adalah, “Jika operan pertama atau operan kedua (atau keduanya) adalah satu, hasilnya adalah satu; jika tidak, hasilnya nol. ”Ini juga dikenal sebagai operasi inklusif-OR. Jika salah satu operan ke operasi logika-OR adalah satu, hasilnya selalu satu terlepas dari nilai operan kedua. Jika satu operand adalah nol, hasilnya selalu berupa nilai operan kedua. Seperti operasi AND yang logis, ini adalah penting efek samping dari operasi logika-OR yang akan terbukti sangat berguna ketika bekerja dengan bit string (lihat bagian selanjutnya). Perhatikan bahwa ada perbedaan antara bentuk operasi OR logis inklusif ini dan arti bahasa Inggris standar. Pertimbangkan ungkapan “Saya akan pergi ke toko atau saya pergi ke taman. ”Pernyataan seperti itu menyiratkan bahwa pembicara akan pergi ke toko atau ke parkir tetapi tidak di kedua tempat. Oleh karena itu, versi bahasa Inggris dari logika OR sedikit berbeda dari operasi inklusif-OR; memang, itu lebih dekat dengan operasi ATAU eksklusif.
Operasi XOR (eksklusif-atau) yang logis juga merupakan operasi diadik. Ini didefinisikan sebagai berikut:
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Dalam bahasa Inggris, operasi XOR logis adalah, “Jika operan pertama atau operan kedua, tetapi tidak keduanya, adalah satu, hasilnya adalah satu; jika tidak, hasilnya nol. ”Perhatikan bahwa eksklusif atau operasi lebih dekat dengan arti bahasa Inggris dari kata “atau” daripada OR yang logis operasi.
Jika salah satu operan ke operasi logika-OR yang logis adalah satu, hasilnya adalah selalu kebalikan dari operan lainnya; yaitu, jika satu operand adalah satu, hasilnya adalah nol jika operan yang lain adalah satu dan hasilnya adalah satu jika operan yang lain adalah nol. Jika operan pertama berisi nol, maka hasilnya persis nilai operan kedua. Fitur ini memungkinkan Anda secara selektif membalikkan bit dalam string bit.
Operasi NOT yang logis adalah operasi monadik5 (artinya hanya menerima satu operan). Ini:
TIDAK 0 = 1
BUKAN 1 = 0
Tabel kebenaran untuk operasi NOT mengambil bentuk berikut:
1.6 Operasi Logika pada Bilangan Biner dan Senar Bit
Seperti yang dijelaskan di bagian sebelumnya, fungsi-fungsi logis hanya berfungsi dengan bit tunggal operan. Karena 80×86 menggunakan kelompok delapan, enam belas, atau tiga puluh dua bit, kita perlu memperluas definisi fungsi-fungsi ini untuk menangani lebih dari dua bit. Fungsi logis pada 80×86 beroperasi secara bit-demi-bit (atau bitwise). Diberikan dua nilai, fungsi-fungsi ini beroperasi pada bit nol menghasilkan bit nol dari hasilnya. Mereka beroperasi pada sedikit salah satu input nilai menghasilkan bit satu dari hasil, dll. Misalnya, jika Anda ingin menghitung yang logis
DAN dari dua nomor delapan-bit berikut, Anda akan melakukan operasi AND yang logis
pada setiap kolom secara terpisah dari yang lain:
1011 0101
1110 1110
———
1010 0100
Bentuk eksekusi bit-demi-bit ini dapat dengan mudah diterapkan pada operasi logis lainnya sebagai baik. Karena kami telah mendefinisikan operasi logis dalam hal nilai biner, Anda akan banyak menemukannya lebih mudah untuk melakukan operasi logis pada nilai-nilai biner daripada nilai-nilai dalam basis lain. Karena itu, jika Anda ingin melakukan operasi logis pada dua angka heksadesimal, Anda harus mengkonversinya menjadi biner terlebih dahulu. Ini berlaku untuk sebagian besar operasi logis dasar pada biner angka (mis., AND, OR, XOR, dll.).
Kemampuan untuk memaksa bit ke nol atau satu menggunakan operasi AND / OR logis dan kemampuan untuk membalikkan bit menggunakan operasi XOR logis sangat penting ketika bekerja dengan string bit (misalnya, bilangan biner). Operasi ini memungkinkan Anda memanipulasi secara selektif bit tertentu dalam beberapa nilai sementara meninggalkan bit lain tidak terpengaruh. Misalnya, jika Anda memiliki nilai biner delapan-bit ‘X’ dan Anda ingin menjamin bahwa bit empat hingga tujuh mengandung nol, Anda dapat secara logis DAN nilai ‘X’ dengan nilai biner 0000 1111. Ini bitwise logical AND operation akan memaksa H.O. empat bit ke nol dan lulus L.O. empat bit ‘X’ melalui tidak berubah. Demikian juga, Anda bisa memaksa L.O. sedikit ‘X’ untuk satu dan membalikkan bit nomor dua dari ‘X’ dengan secara logis ORing ‘X’ dengan 0000 0001 dan secara logis kecuali ORG ‘X’ dengan 0000 0100, masing-masing. Menggunakan operasi logika AND, OR, dan XOR untuk memanipulasi string bit dalam mode ini dikenal sebagai string sedikit masking. Kami menggunakan masking istilah karena kita dapat menggunakan nilai-nilai tertentu (satu untuk AND, nol untuk OR / XOR) ke ‘mask keluar ‘bit tertentu dari operasi ketika memaksa bit ke nol, satu, atau kebalikannya.
1.7 Angka yang Ditandatangani dan Tidak Ditandatangani
Sejauh ini, kami telah memperlakukan bilangan biner sebagai nilai yang tidak ditandatangani. Angka biner … 00000 mewakili nol, … 00001 mewakili satu, … 00010 mewakili dua, dan seterusnya menuju tak terbatas. Bagaimana dengan angka negatif? Nilai yang ditandai telah dilemparkan di bagian sebelumnya dan kami telah menyebutkan sistem penomoran komplemen kedua, tetapi kami belum membahasnya bagaimana cara merepresentasikan angka negatif menggunakan sistem penomoran biner. Itu adalah apa bagian ini semua tentang!
Untuk merepresentasikan angka yang ditandatangani menggunakan sistem penomoran biner kita harus menempatkan pembatasan nomor kami: mereka harus memiliki sejumlah bit yang terbatas dan tetap. Sejauh ini 80×86 berjalan, ini tidak terlalu banyak pembatasan, setelah semua, 80×86 hanya dapat mengatasi terbatas jumlah bit. Untuk tujuan kami, kami akan sangat membatasi jumlah bit menjadi delapan, 16, 32, atau beberapa bit kecil lainnya.
Dengan jumlah bit yang tetap, kami hanya dapat mewakili sejumlah objek tertentu. Untuk Misalnya, dengan delapan bit kita hanya dapat mewakili 256 objek yang berbeda. Nilai negatifnya objek di kanan mereka sendiri, seperti angka positif. Oleh karena itu, kami harus menggunakan sebagian 256 nilai berbeda untuk merepresentasikan angka negatif. Dengan kata lain, kita harus menggunakannya up beberapa angka positif untuk mewakili angka negatif. Agar semuanya adil, kami akan menetapkan setengah dari kombinasi yang mungkin ke nilai negatif dan setengah ke nilai positif.
Jadi kita dapat merepresentasikan nilai negatif -128 ..- 1 dan nilai positif 0,127 dengan a single eight bit byte6. Dengan kata 16-bit, kami dapat mewakili nilai dalam rentang
-32,768 .. + 32,767. Dengan kata ganda 32-bit, kita dapat mewakili nilai dalam rentang -2,147,483,648 .. + 2,147,483,647. Secara umum, dengan n bit kita dapat merepresentasikan nilai yang ditandatangani di kisaran -2n-1 hingga +2n-1-1.
Oke, jadi kami dapat merepresentasikan nilai negatif. Persisnya bagaimana kita melakukannya? Yah, ada banyak cara, tetapi mikroprosesor 80×86 menggunakan notasi pelengkap keduanya. Dalam sistem pelengkap dua, H.O. sedikit angka adalah sedikit tanda. Jika H.O. bit adalah nol, the angka positif; jika H.O. bit adalah satu, jumlahnya negatif. Contoh: Untuk nomor 16-bit: 8000 jam negatif karena H.O. bit adalah satu. 100 jam positif karena H.O. bit adalah nol.
7FFFh positif.
0FFFFh negatif.
0FFFh positif.
Jika H.O. bit nol, maka angkanya positif dan disimpan sebagai biner standar nilai. Jika H.O. bit adalah satu, maka jumlahnya negatif dan disimpan dalam dua komplemen bentuk. Untuk mengonversi bilangan positif ke bentuk dua pelengkap negatifnya, Anda gunakan algoritma berikut:
Balikkan semua bit dalam nomor, yaitu, menerapkan fungsi NOT yang logis
2) Tambahkan satu ke hasil terbalik.
Misalnya, untuk menghitung delapan bit yang setara dengan -5:
0000 0101 Lima (dalam biner).
1111 1010 Balikkan semua bit.
1111 1011 Tambahkan satu untuk mendapatkan hasil.
Jika kami mengambil minus lima dan melakukan operasi komplemen keduanya di atasnya, kami mendapatkan nilai asli, 00000101, kembali lagi, seperti yang kita harapkan:
1111 1011 Dua komplemen untuk -5.
0000 0100 Balikkan semua bit.
0000 0101 Tambahkan satu untuk mendapatkan hasil (+5).
Contoh berikut ini memberikan nilai-nilai 16 bit yang positif dan negatif:
7FFFh: +32767, angka positif 16-bit terbesar.
8000h: -32768, angka negatif 16-bit terkecil.
4000h: +16,384.
Untuk mengonversi angka di atas menjadi mitra negatifnya (yaitu, untuk meniadakannya), lakukan berikut:
7FFFh: 0111 1111 1111 1111 + 32,767t
1000 0000 0000 0000 Balikkan semua bit (8000h)
1000 0000 0000 0001 Tambahkan satu (8001 jam atau -32,767 t)
8000h: 1000 0000 0000 0000 -32,768t
0111 1111 1111 1111 Balikkan semua bit (7FFFh)
1000 0000 0000 0000 Tambahkan satu (8000h atau -32768t)
4000h: 0100 0000 0000 0000 16,384t
1011 1111 1111 1111 Balikkan semua bit (BFFFh)
1100 0000 0000 0000 Tambahkan satu (0C000h atau -16,384t)
8000h terbalik menjadi 7FFFh. Setelah menambahkan satu, kami mendapatkan 8000 jam! Tunggu, apa yang terjadi disini? – (- 32,768) adalah -32,768? Tentu saja tidak. Tetapi nilai +32,768 tidak dapat diwakili dengan nomor yang ditandatangani 16-bit, jadi kami tidak dapat meniadakan nilai negatif terkecil. Jika kamu mencoba operasi ini, mikroprosesor 80×86 akan mengeluh tentang aritmatika yang ditandatangani meluap.
Kenapa repot-repot dengan sistem penomoran yang menyedihkan seperti itu? Mengapa tidak menggunakan H.O. bit sebagai tanda bendera, menyimpan setara positif dari angka dalam bit yang tersisa? Jawabannya terletak pada perangkat keras. Ternyata, meniadakan nilai adalah satu-satunya pekerjaan yang membosankan. Dengan keduanya sistem pelengkap, sebagian besar operasi lainnya semudah sistem biner. Sebagai contoh, misalkan Anda melakukan penambahan 5 + (- 5). Hasilnya nol. Pertimbangkan apa yang terjadi ketika kami menambahkan dua nilai ini dalam sistem pelengkap dua:
00000101
11111011
——–
1 00000000
Kita berakhir dengan membawa ke dalam bit kesembilan dan semua bit lainnya adalah nol. Ternyata, jika kita mengabaikan pelaksanaan H.O. bit, menambahkan dua nilai yang ditandatangani selalu menghasilkan yang benar hasil saat menggunakan sistem penomoran komplemen kedua. Ini berarti kita bisa menggunakan perangkat keras yang sama untuk penambahan dan pengurangan yang ditandatangani dan tidak ditandatangani. Ini tidak akan menjadi case dengan beberapa sistem penomoran lainnya.
Kecuali untuk pertanyaan di akhir bab ini, Anda tidak perlu melakukan dua operasi komplementer dengan tangan. Mikroprosesor 80×86 menyediakan instruksi, NEG (negate), yang melakukan operasi ini untuk Anda. Selanjutnya semua heksadesimal kalkulator akan melakukan operasi ini dengan menekan tombol tanda perubahan (+/- atau CHS). Namun demikian, melakukan pelengkap dua dengan tangan itu mudah, dan Anda harus tahu caranya untuk melakukannya.
Sekali lagi, Anda harus mencatat bahwa data yang diwakili oleh satu set bit biner tergantung sepenuhnya pada konteksnya. Nilai biner delapan bit 11000000b bisa mewakili suatu IBM / ASCII karakter, itu bisa mewakili nilai desimal yang tidak bertanda 192, atau bisa mewakili nilai desimal bertanda -64, dll. Sebagai programmer, Anda bertanggung jawab untuk menggunakannya data ini secara konsisten
1.8 Masuk dan Perpanjangan Nol
Karena dua format bilangan bulat komplementer memiliki panjang tetap, masalah kecil berkembang. Apa yang terjadi jika Anda perlu mengonversi nilai pelengkap delapan bit dua menjadi 16 bit? Masalah ini, dan sebaliknya (mengubah nilai 16 bit menjadi delapan bit) dapat diselesaikan melalui ekstensi tanda dan operasi kontraksi. Demikian juga, 80×86 bekerja dengan tetap nilai panjang, bahkan saat memproses bilangan biner yang tidak ditandatangani. Ekstensi nol memungkinkan Anda mengkonversi nilai-nilai unsigned kecil ke nilai unsigned yang lebih besar.
Pertimbangkan nilai “-64”. Nilai komplemen delapan bit dua untuk nomor ini adalah 0C0h. Angka 16-bit dari angka ini adalah 0FFC0h. Sekarang perhatikan nilai “+64”. Itu versi delapan dan 16 bit dari nilai ini adalah 40h dan 0040h. Perbedaan antara delapan dan angka 16 bit dapat dijelaskan oleh aturan: “Jika nomor tersebut negatif, H.O. byte dari nomor 16 bit mengandung 0FFh; jika jumlahnya positif, H.O. byte dari 16 bit kuantitas adalah nol. ”
Untuk menandatangani memperpanjang nilai dari beberapa jumlah bit ke sejumlah besar bit mudah, cukup salin bit tanda ke semua bit tambahan dalam format baru. Misalnya, untuk menandatangani memperpanjang nomor delapan bit ke nomor 16 bit, cukup salin bit tujuh dari nomor delapan bit menjadi bit 8..15 dari 16 bit number. Untuk menandatangani memperpanjang nomor 16 bit ke kata ganda, cukup salin bit 15 ke bit 16..31 dari kata ganda.
Perlu ekstensi tanda ketika memanipulasi nilai yang ditandatangani dengan panjang yang bervariasi. Sering Anda harus menambahkan kuantitas byte ke kuantitas kata. Anda harus mendaftar memperpanjang kuantitas byte
sepatah kata sebelum operasi berlangsung. Operasi lainnya (perkalian dan pembagian, khususnya) mungkin memerlukan ekstensi tanda ke 32-bit. Anda tidak harus mendaftar memperpanjang nilai unsigned.
Contoh ekstensi tanda:
Delapan Bits Sixteen Bits Tiga Puluh Dua Bits
80h FF80h FFFFFF80h
28h 0028h 00000028h
9Ah FF9Ah FFFFFF9Ah
7Fh 007Fh 0000007Fh
––– 1020h 00001020h
––– 8088h FFFF8088h
Untuk memperpanjang byte unsigned, Anda harus tidak menambah nilai. Ekstensi nol sangat mudah – cukup simpan nol ke H.O. byte (s) dari operan yang lebih kecil. Misalnya, ke nol memperpanjang nilai 82h ke 16-bit Anda cukup menambahkan nol ke H.O. byte menghasilkan 0082h.
Delapan Bits Sixteen Bits Tiga Puluh Dua Bits
80h 0080h 00000080h
28h 0028h 00000028h
9Ah 009Ah 0000009Ah
7Fh 007Fh 0000007Fh
––– 1020h 00001020h
––– 8088h 00008088h
Tandatangani kontraksi, konversi nilai dengan sejumlah bit ke nilai yang sama dengan jumlah bit lebih sedikit, sedikit lebih merepotkan. Ekstensi tanda tidak pernah gagal. Diberikan nilai m-bit yang ditandatangani Anda selalu dapat mengubahnya menjadi nomor n-bit (di mana n> m) digunakan menandatangani ekstensi. Sayangnya, diberi nomor n-bit, Anda tidak dapat selalu mengonversinya menjadi nomor m-bit jika m <n. Misalnya, perhatikan nilai -448. Sebagai angka heksadesimal 16-bit, perwakilannya adalah 0FE40h. Sayangnya, besarnya angka ini terlalu besar agar sesuai dengan nilai delapan bit, sehingga Anda tidak dapat menandatangani kontrak ke delapan bit. Ini adalah contoh kondisi overflow yang terjadi setelah konversi. Untuk menandatangani kontrak satu nilai dengan yang lain, Anda harus melihat H.O. byte (s) itu Anda ingin membuang. H.O. byte yang ingin Anda hapus semua harus mengandung nol atau 0FFh. Jika Anda menemukan nilai lain, Anda tidak dapat mengontraknya tanpa overflow. Akhirnya, H.O. sedikit nilai yang dihasilkan harus cocok dengan setiap bit yang Anda hapus dari nomor tersebut.
Contoh (16 bit hingga delapan bit):
FF80h dapat dikontrak dikontrak hingga 80 jam
0040h dapat ditanda tangani kontrak menjadi 40 jam
FE40h tidak dapat dikontrak menjadi 8 bit.
0100h tidak dapat dikontrak menjadi 8 bit.
1.9 Shift dan Rotasi
Seperangkat operasi logis lain yang berlaku untuk string bit adalah shift dan rotate operasi. Kedua kategori ini dapat dipecah lebih jauh ke dalam shift kiri, rotasi kiri, shift kanan, dan kanan berputar. Operasi-operasi ini ternyata sangat berguna untuk dirakit programmer bahasa. Operasi shift kiri menggerakkan setiap bit dalam posisi bit string ke kiri (lihat Gambar 1,8) Bit nol bergerak ke posisi bit satu, nilai sebelumnya dalam posisi bit satu bergerak masuk posisi bit dua, dll. Tentu saja ada dua pertanyaan yang secara alami muncul: “Apa yang terjadi menjadi bit nol? “dan” Di mana bit tujuh berakhir? “Yah, itu tergantung pada konteksnya.
Kami akan menggeser nilai nol ke dalam L.O. bit, dan nilai sebelumnya bit seven akan menjadi melaksanakan operasi ini. Perhatikan bahwa menggeser nilai ke kiri adalah hal yang sama dengan mengalikannya dengan radionya. Untuk Misalnya, menggeser posisi angka desimal ke kiri (menambahkan nol di sebelah kanan nomor) secara efektif mengalikannya dengan sepuluh (radix):
1234 SHL 1 = 12340 (SHL 1 = bergeser ke kiri satu posisi) Karena radix dari bilangan biner adalah dua, menggesernya ke kiri mengalikannya menjadi dua. Jika Anda menggeser a nilai biner ke kiri dua kali, Anda mengalikannya dengan dua kali (yaitu, Anda mengalikannya dengan empat). Jika Anda menggeser nilai biner ke kiri tiga kali, Anda mengalikannya dengan delapan (2 * 2 * 2). Secara umum, jika Anda menggeser nilai ke kiri n kali, Anda mengalikan nilai itu dengan 2n.
Operasi pengalihan kanan berfungsi dengan cara yang sama, kecuali kami memindahkan data ke dalam arah berlawanan. Bit tujuh bergerak ke bit enam, bit enam bergerak ke bit lima, bit lima langkah ke dalam bit empat, dll. Selama shift kanan, kita akan memindahkan nol ke bit tujuh, dan bit nol akan menjadi nol pelaksanaan operasi (lihat Gambar 1.9).
Karena pergeseran kiri sama dengan perkalian dengan dua, seharusnya tidak mengherankan bahwa pergeseran kanan kira-kira sebanding dengan pembagian oleh dua (atau, secara umum, pembagian oleh radix dari nomor). Jika Anda melakukan n shift kanan, Anda akan membagi angka itu dengan 2n. Ada satu masalah dengan hak bergeser sehubungan dengan pembagian: seperti yang dijelaskan di atas a bergeser ke kanan hanya setara dengan pembagian unsigned oleh dua. Misalnya, jika Anda menggeser representasi unsigned dari 254 (0FEh) satu tempat ke kanan, Anda mendapatkan 127 (07Fh), tepat apa yang Anda harapkan. Namun, jika Anda menggeser representasi biner -2 (0FEh) ke tepat satu posisi, Anda mendapatkan 127 (07Fh), yang tidak benar. Masalah ini terjadi karena kami menggeser nol menjadi tujuh bit. Jika bit tujuh sebelumnya berisi satu, kami berubah dari negatif ke angka positif. Bukan hal yang baik ketika membagi dua.
Untuk menggunakan shift kanan sebagai operator divisi, kita harus mendefinisikan operasi shift ketiga: aritmatika bergeser ke kanan7. Pergeseran aritmatika yang tepat berfungsi seperti operasi normal shift kanan (Pergeseran logis kanan) dengan satu pengecualian: alih-alih menggeser nol ke bit tujuh, sebuah
aritmatika menggeser operasi yang tepat menyisakan sedikit tujuh saja, yaitu selama operasi shift itu tidak mengubah nilai bit tujuh seperti yang ditunjukkan pada Gambar 1.10. Ini umumnya menghasilkan hasil yang Anda harapkan. Misalnya, jika Anda melakukan aritmatika bergeser operasi yang tepat pada -2 (0FEh) Anda mendapatkan -1 (0FFh). Ingat satu hal tentang aritmatika bergeser ke kanan, namun. Operasi ini selalu membulatkan angka ke integer terdekat yang kurang dari atau sama dengan hasil aktual. Berdasarkan pengalaman dengan level tinggi bahasa pemrograman dan aturan standar pemotongan bilangan bulat, kebanyakan orang asumsikan ini berarti bahwa pembagian selalu memotong menuju nol. Tapi ini tidak benar kasus. Misalnya, jika Anda menerapkan operasi tepat aritmetik bergeser pada -1 (0FFh), hasilnya adalah -1, bukan nol. -1 kurang dari nol sehingga operasi aritmetika bergeser ke arah kanan kurang satu. Ini bukan “bug” dalam operasi kanan aritmatika bergeser. Ini adalah cara integer divisi biasanya akan ditentukan. Instruksi pembagian integer 80×86 juga menghasilkan hasil ini.
Sepasang operasi berguna lainnya adalah memutar ke kiri dan memutar ke kanan. Operasi-operasi ini berperilaku seperti pergeseran kiri dan menggeser operasi kanan dengan satu perbedaan utama: bit bergeser keluar dari salah satu ujungnya bergeser kembali di ujung yang lain.
1.10 Bit Fields dan Packed Data
Meskipun 80×86 beroperasi paling efisien pada data byte, word, dan double word jenis, terkadang Anda perlu bekerja dengan tipe data yang menggunakan sejumlah bit selain delapan, 16, atau 32. Sebagai contoh, perhatikan tanggal dari formulir “4/2/88”. Dibutuhkan tiga nilai numerik untuk mewakili tanggal ini: satu bulan, hari, dan nilai tahun. Bulan, dari Tentu saja, ambil nilai-nilai 1..12. Ini akan membutuhkan setidaknya empat bit (maksimum enam belas berbeda nilai) untuk mewakili bulan. Kisaran hari antara 1..31. Jadi itu akan membutuhkan lima bit (maksimal 32 nilai berbeda) untuk mewakili entri hari. Nilai tahun, dengan asumsi bahwa kami bekerja dengan nilai dalam rentang 0,99, membutuhkan tujuh bit (yang dapat digunakanuntuk mewakili hingga 128 nilai yang berbeda). Empat ditambah lima ditambah tujuh adalah 16 bit, atau dua byte. Dengan kata lain, kita dapat mengemas data tanggal menjadi dua byte daripada tiga yang akan diperlukan jika kami menggunakan byte terpisah untuk setiap nilai bulan, hari, dan tahun. Ini menghemat satu byte memori untuk setiap tanggal yang disimpan, yang dapat menghemat banyak jika Anda perlu menyimpan banyak tanggal. Bit bisa diatur seperti yang ditunjukkan pada. MMMM mewakili empat bit yang membentuk nilai bulan, DDDDD mewakili lima bit menyusun hari, dan YYYYYYY adalah tujuh bit yang terdiri dari tahun. Setiap koleksi bit yang mewakili item data adalah bidang bit. 2 April 1988 akan diwakili sebagai 4158h:
0100 00010 1011000 = 0100 0001 0101 1000b atau 4158h 4 2 88
Meskipun nilai-nilai dikemas adalah ruang yang efisien (yaitu sangat efisien dalam hal memori penggunaan), mereka secara komputasi tidak efisien (lambat!). Alasannya? Diperlukan instruksi tambahan untuk membongkar data yang dikemas ke dalam berbagai bidang bit. Instruksi tambahan ini membutuhkan tambahan waktu untuk mengeksekusi (dan byte tambahan untuk menahan instruksi); karenanya, Anda harus hati-hati mempertimbangkan apakah bidang data yang dikemas akan menghemat apa pun. Contoh-contoh tipe data yang praktis dikemas berlimpah. Anda bisa mengemas delapan nilai boolean menjadi satu byte, Anda bisa mengemas dua digit BCD ke dalam byte, dll.
1.11 Set Karakter ASCII
Kumpulan karakter ASCII (tidak termasuk karakter perluasan yang ditentukan oleh IBM) adalah dibagi menjadi empat kelompok dengan 32 karakter. 32 karakter pertama, kode ASCII 0 hingga 1Fh (31), membentuk sekumpulan karakter non-pencetakan khusus yang disebut karakter kontrol. Kami memanggil mereka mengontrol karakter karena mereka menjalankan berbagai operasi kontrol printer / display daripada menampilkan simbol. Contohnya termasuk carriage return, yang memposisikan kursor ke sisi kiri baris karakter8 saat ini, feed baris (yang menggerakkan kursor turun satu baris pada perangkat output), dan ruang belakang (yang menggerakkan kursor kembali satu posisi ke kiri). Sayangnya, karakter kontrol yang berbeda melakukan operasi yang berbeda pada perangkat output yang berbeda. Ada sedikit standardisasi di antara output
perangkat. Untuk mencari tahu persis bagaimana karakter kontrol memengaruhi perangkat tertentu, Anda akan perlu berkonsultasi manualnya. Kelompok kedua dari 32 kode karakter ASCII terdiri dari berbagai simbol tanda baca, karakter khusus, dan digit angka. Karakter paling menonjol dalam grup ini termasuk karakter spasi (kode ASCII 20jam) dan digit angka (kode ASCII 30h..39 jam). Perhatikan bahwa angka numerik berbeda dari nilai numeriknya hanya di H.O. menggigit. Dengan mengurangi 30 jam dari kode ASCII untuk digit tertentu, Anda dapat memperoleh angka numerik dari digit itu.
Kelompok ketiga dari 32 karakter ASCII dicadangkan untuk huruf karakter alfabetis bagian atas. Kode ASCII untuk karakter “A” .. “Z” terletak di kisaran 41h..5Ah (65..90). Sejak hanya ada 26 karakter alfabet yang berbeda, enam kode yang tersisa memegang berbagai khusus simbol.
Kelompok keempat, dan terakhir, dari 32 kode karakter ASCII dicadangkan untuk yang lebih rendah huruf simbol alfabetik, lima simbol khusus tambahan, dan karakter kontrol lainnya (menghapus). Perhatikan bahwa simbol karakter huruf kecil menggunakan kode ASCII 61h..7Ah. Jika kamu mengkonversi kode untuk karakter huruf besar dan kecil ke biner, Anda akan melihat itu simbol huruf besar berbeda dari padanan huruf kecilnya dalam posisi satu bit.
Sebagai contoh, perhatikan kode karakter untuk “E” dan “e” pada Gambar 1.14. Satu-satunya tempat kedua kode ini berbeda dalam bit lima. Karakter huruf besar selalu berisi nol dalam bit lima; huruf alfabetis huruf kecil selalu berisi satu dalam bit lima. Kamu dapat menggunakan fakta ini untuk dengan cepat mengkonversi antara huruf besar dan kecil. Jika Anda memiliki bagian atas
karakter huruf Anda dapat memaksanya ke huruf kecil dengan menyetel bit lima banding satu. Jika Anda memiliki lebih rendah karakter huruf dan Anda ingin memaksanya ke huruf besar, Anda dapat melakukannya dengan mengatur bit ke lima nol. Anda dapat mengubah karakter abjad antara huruf besar dan kecil dengan mudah pembalik bit lima. Memang, bit lima dan enam menentukan mana dari empat kelompok dalam set karakter ASCII
Anda berada di:
Jadi Anda dapat, misalnya, mengonversi setiap huruf besar atau kecil (atau khusus yang sesuai) karakter ke karakter kontrol yang setara dengan mengatur bit lima dan enam ke nol.
Pertimbangkan, untuk sesaat, kode ASCII dari digit digit karakter: Representasi desimal kode ASCII ini tidak terlalu mencerahkan. Namun, representasi heksadesimal dari kode ASCII ini mengungkapkan sesuatu yang sangat penting – L.O. nibble kode ASCII adalah setara biner dari nomor yang diwakili. Oleh menanggalkan (yaitu, pengaturan ke nol) H.O. menggigit karakter numerik, Anda dapat mengkonversi kode karakter itu ke representasi biner yang sesuai. Sebaliknya, Anda bisa mengkonversi nilai biner dalam rentang 0..9 ke representasi karakter ASCII hanya dengan pengaturan H.O. nibble to three. Perhatikan bahwa Anda dapat menggunakan operasi logika-AND untuk memaksa H.O. bit ke nol; demikian juga, Anda dapat menggunakan operasi logika-OR untuk memaksa H.O. bit untuk 0011 (tiga).
Perhatikan bahwa Anda tidak dapat mengonversi string karakter numerik ke biner ekuivalennya representasi dengan hanya melucuti H.O. nibble dari setiap digit dalam string. Mengkonversi 123 (31h 32j 33j) dalam mode ini menghasilkan tiga byte: 010203h, bukan nilai yang benar yaitu 7Bh. Mengubah string digit ke integer membutuhkan kecanggihan lebih dari ini; konversi di atas hanya berfungsi untuk satu digit. Bit tujuh dalam ASCII standar selalu nol. Ini berarti bahwa set karakter ASCII hanya mengkonsumsi setengah dari kode karakter yang mungkin dalam delapan bit byte. IBM menggunakan tersisa 128 kode karakter untuk berbagai karakter khusus termasuk karakter internasional (yang memiliki aksen, dll.), simbol matematika, dan karakter gambar garis. Perhatikan itu karakter tambahan ini adalah ekstensi non-standar ke set karakter ASCII. Tentu saja, nama IBM memiliki pengaruh besar, sehingga hampir semua komputer pribadi modern berdasarkan 80×86 dengan tampilan video mendukung set karakter IBM / ASCII diperpanjang. Sebagian besar printer mendukung set karakter IBM juga.
Jika Anda perlu bertukar data dengan mesin lain yang tidak kompatibel dengan PC, Anda hanya memiliki dua alternatif: tetap berpegang pada ASCII standar atau memastikan bahwa mesin target mendukung set karakter IBM-PC diperpanjang. Beberapa mesin, seperti Apple Macintosh, tidak menyediakan dukungan asli untuk set karakter IBM-PC yang diperluas; Namun Anda mungkin dapatkan font PC yang memungkinkan Anda menampilkan set karakter tambahan. Mesin lain (misalnya, Amiga dan Atari ST) memiliki kemampuan yang serupa. Namun, 128 karakter dalam standar Kumpulan karakter ASCII adalah satu-satunya yang harus Anda andalkan untuk mentransfer dari sistem ke sistem.
Terlepas dari kenyataan bahwa itu adalah “standar”, cukup encoding data Anda menggunakan standar Karakter ASCII tidak menjamin kompatibilitas antar sistem. Meskipun memang benar itu “A” pada satu mesin kemungkinan besar adalah “A” pada komputer lain, hanya ada sedikit standardisasi di seluruh mesin sehubungan dengan penggunaan karakter kontrol. Memang, dari 32 kode kontrol ditambah hapus, hanya ada empat kode kontrol yang umumnya didukung – backspace (BS), tab, carriage return (CR), dan line feed (LF). Lebih buruk lagi, berbeda mesin sering menggunakan kode kontrol ini dengan cara yang berbeda. Akhir baris sangat merepotkan contoh. MS-DOS, CP / M, dan sistem lainnya menandai akhir baris oleh dua karakter urutan CR / LF. Apple Macintosh, Apple II, dan banyak sistem lainnya menandai akhirnya dari garis dengan karakter CR tunggal. Sistem UNIX menandai akhir baris dengan LF tunggal karakter.
Tak perlu dikatakan, mencoba untuk bertukar file teks sederhana antara sistem tersebut bisa menjadi pengalaman dalam frustrasi. Bahkan jika Anda menggunakan karakter ASCII standar di semua Anda file pada sistem ini, Anda masih perlu mengonversi data saat bertukar file diantara mereka. Untungnya, konversi semacam itu agak sederhana. Meskipun ada beberapa kekurangan utama, data ASCII adalah standar untuk pertukaran data di seluruh sistem dan program komputer. Sebagian besar program dapat menerima data ASCII; juga sebagian besar program dapat menghasilkan data ASCII. Karena Anda akan berurusan dengan karakter ASCII dalam bahasa assembly, akan lebih bijaksana untuk mempelajari tata letak set karakter dan menghafal beberapa kode ASCII kunci (misalnya, “0”, “A”, “a”, dll.)
1.12 Ringkasan
Kebanyakan sistem komputer modern menggunakan sistem penomoran biner untuk mewakili nilai-nilai. Karena nilai biner agak berat, kami akan sering menggunakan representasi heksadesimal untuk nilai-nilai itu. Ini karena sangat mudah untuk mengkonversi antara heksadesimal dan biner, tidak seperti konversi antara sistem desimal dan biner yang lebih familiar. Satu digit heksadesimal mengkonsumsi empat digit biner (bit), dan kita sebut kelompok empat bit menggigit. Lihat:
“Sistem Penomoran Binary” di halaman 12
“Format Biner” pada halaman 13
“Sistem Penomoran Heksadesimal” pada halaman 17 80×86 bekerja paling baik dengan kelompok bit yang panjangnya delapan, 16, atau 32 bit. Kami memanggil objek dari ukuran byte, kata-kata, dan kata-kata ganda, masing-masing. Dengan satu byte, kita bisa mewakili salah satu dari 256 nilai unik. Dengan kata kami dapat mewakili salah satu dari 65.536 berbeda nilai-nilai. Dengan kata ganda, kita dapat mewakili lebih dari empat miliar nilai yang berbeda. Sering kami hanya mewakili nilai integer (ditandatangani atau tidak ditandatangani) dengan byte, kata, dan ganda kata-kata; namun kami juga sering mewakili kuantitas lainnya. Lihat:
“Organisasi Data” di halaman 13
“Bytes” pada halaman 14
“Kata-kata” di halaman 15
“Kata Ganda” di halaman 16 Untuk berbicara tentang bit tertentu dalam sebuah gigitan, byte, kata, kata ganda, atau lainnya struktur, kami akan menomori bit mulai dari nol (untuk bit paling tidak signifikan) pada hingga n-1 (di mana n adalah jumlah bit dalam objek). Kami juga akan menghitung nibble, bytes, dan kata-kata dalam struktur besar dengan cara yang sama. Lihat:
“Format Biner” pada halaman 13 Ada banyak operasi yang dapat kita lakukan pada nilai-nilai biner termasuk aritmatika normal (+, -, *, dan /) dan operasi logis (AND, OR, XOR, NOT, Shift Left, Shift Kanan, Putar Kiri, dan Putar Kanan). Logis DAN, ATAU, XOR, dan BUK biasanya didefinisikan untuk operasi bit tunggal. Kita dapat memperpanjang ini menjadi n bit dengan melakukan bitwise operasi. Pergeseran dan rotasi selalu didefinisikan untuk string bit dengan panjang tetap. Lihat:
“Operasi Aritmatika pada Bilangan Biner dan Heksadesimal” halaman 19
“Operasi Logika pada Bits” di halaman 20
“Operasi Logika pada Nomor Biner dan String Bit” pada halaman 22
“Shift dan Rotasi” di halaman 26
Ada dua jenis nilai integer yang dapat kita wakili dengan string biner 80×86: integer yang tidak ditandatangani dan bilangan bulat yang ditandatangani. 80×86 menunjukkan bilangan bulat yang tidak ditandatangani menggunakan format biner standar. Ini mewakili bilangan bulat yang ditandatangani menggunakan komplemen keduanya format. Sementara bilangan bulat yang tidak ditandatangani mungkin memiliki panjang yang sewenang-wenang, itu hanya masuk akal berbicara tentang nilai-nilai biner panjang tetap ditandatangani. Lihat:
“Nomor yang Ditandatangani dan Tidak Ditandatangani” pada halaman 23
“Sign and Zero Extension” di halaman 25 Seringkali mungkin tidak terlalu praktis untuk menyimpan data dalam kelompok delapan, 16, atau 32 bit. Untuk menghemat ruang Anda mungkin ingin mengemas berbagai potongan data ke dalam byte, kata, yang sama. atau kata ganda. Ini mengurangi kebutuhan penyimpanan dengan mengorbankan harus melakukan operasi ekstra untuk berkemas dan membongkar data. Lihat:
“Bit Fields and Packed Data” di halaman 28 Data karakter mungkin merupakan tipe data paling umum yang ditemukan selain integer nilai-nilai. PC IBM dan compatibles menggunakan varian dari set karakter ASCII – the diperpanjang set karakter IBM / ASCII. 128 pertama dari karakter ini adalah standar Karakter ASCII, 128 adalah karakter khusus yang dibuat oleh IBM untuk bahasa internasional, matematika, dan gambar garis. Karena penggunaan set karakter ASCII sangat umum di program modern, keakraban dengan set karakter ini sangat penting. Lihat:
“Set Karakter ASCII” pada halaman 28
1.13 Latihan Laboratorium
Mendampingi teks ini adalah sejumlah besar perangkat lunak. Perangkat lunak ini dibagi menjadi empat kategori dasar: kode sumber untuk contoh yang muncul di seluruh teks ini, UCR Standard Library untuk pemrogram bahasa program 80×86, kode contoh yang Anda modifikasi untuk berbagai latihan laboratorium, dan perangkat lunak aplikasi untuk mendukung berbagai laboratorium latihan. Perangkat lunak ini telah ditulis menggunakan bahasa assembly, C ++, Flex / Bison, dan Delphi (objek Pascal). Sebagian besar program aplikasi termasuk kode sumber juga sebagai kode yang dapat dieksekusi. Sebagian besar perangkat lunak yang menyertai teks ini berjalan di bawah Windows 3.1, Windows 95, atau Windows NT. Beberapa perangkat lunak, bagaimanapun, langsung memanipulasi perangkat keras dan kehendak hanya berjalan di bawah DOS atau kotak DOS di Windows 3.1. Teks ini berasumsi bahwa Anda familiar dengan sistem operasi DOS dan Windows; jika Anda tidak terbiasa dengan DOS atau Windows operasi, Anda harus merujuk ke teks yang sesuai pada sistem tersebut untuk tambahan rincian.
1.13.1 Menginstal Perangkat Lunak
Perangkat lunak yang menyertai teks ini umumnya diberikan pada CD-ROM9. Kamu dapat memakai sebagian besar seperti langsung dari CD-ROM. Namun, untuk kecepatan dan kenyamanan Anda akan melakukannya mungkin ingin menginstal perangkat lunak pada hard disk10. Untuk melakukan ini, Anda harus membuatnya dua subdirektori di direktori root pada hard drive Anda: ARTOFASM dan STDLIB. Itu Direktori ARTOFASM akan berisi file khusus untuk buku teks ini, direktori STDLIB akan berisi file yang terkait dengan Pustaka Standar UCR untuk bahasa assembly 80×86 programer. Setelah Anda membuat dua subdirektori ini, salin semua file dan subdirektori dari direktori yang sesuai pada CD ke hard disk Anda. Dari DOS (atau jendela DOS), Anda dapat menggunakan perintah XCOPY berikut untuk menyelesaikan ini:
xcopy r: \ artofasm \ *. * c: \ artofasm / s
xcopy r: \ stdlib \ *. * c: \ stdlib / s
Perintah-perintah ini menganggap bahwa CD-ROM Anda adalah drive R: dan Anda menginstal perangkat lunak pada C: hard disk. Mereka juga berasumsi bahwa Anda telah membuat ARTOFASM dan Subdirektori STDLIB sebelum mengeksekusi perintah XCOPY. Untuk menggunakan Pustaka Standar dalam proyek pemrograman, Anda perlu menambahkan atau memodifikasi dua baris dalam file AUTOEXEC.BAT Anda. Jika garis serupa belum ada, tambahkan yang berikut ini
dua baris ke file AUTOEXEC.BAT Anda:
set lib = c: \ stdlib \ lib
set include = c: \ stdlib \ include
Perintah-perintah ini memberitahu MASM (Microsoft Makro Assembler) di mana ia dapat menemukan perpustakaan dan menyertakan file untuk Perpustakaan Standar UCR. Tanpa garis-garis ini, MASM akan laporkan kesalahan kapan saja Anda menggunakan rutinitas pustaka standar dalam program Anda. Jika sudah ada baris “set include = …” dan “set lib = …” di AUTOEXEC.BAT Anda file, Anda tidak harus menggantinya dengan garis di atas. Sebagai gantinya, Anda harus menambahkan string “; c: \ stdlib \ lib” ke akhir pernyataan “set lib = …” yang ada dan “; C: \ stdlib \ include” di akhir pernyataan “set include = …” yang ada. Beberapa bahasa (seperti C ++) juga menggunakan pernyataan “set” ini; jika Anda menggantinya secara sembarangan dengan pernyataan di atas, program bahasa assembly Anda akan berfungsi dengan baik, tetapi setiap upaya untuk melakukannya kompilasi program C ++ (atau bahasa lain) mungkin gagal.
Jika Anda lupa untuk menempatkan garis-garis ini di file AUTOEXEC.BAT Anda, Anda dapat sementara (sampai waktu berikutnya Anda mem-boot sistem), jalankan perintah-perintah ini hanya dengan mengetiknya perintah baris perintah DOS. Dengan mengetik “set” dengan sendirinya pada prompt baris perintah, Anda dapat melihat apakah perintah yang ditetapkan ini saat ini aktif.
Jika Anda tidak memiliki pemutar CD-ROM, Anda dapat memperoleh perangkat lunak yang terkait dengan ini buku teks melalui ftp anonim dari cs.ucr.edu. Periksa di subdirektori “/ pub / pc / ibmpc”. File-file di server ftp akan dikompresi. File “README” akan menjelaskan cara melakukannya dekompresi data. Direktori STDLIB yang Anda buat menampung file sumber dan pustaka untuk UCR Perpustakaan Standar untuk Pemrogram Bahasa Perakitan 80×86. Ini adalah kumpulan inti subrutin bahasa yang dapat Anda sebut itu meniru banyak rutinitas dalam standar C Perpustakaan. Rutinitas ini sangat menyederhanakan program penulisan dalam bahasa assembly. Selanjutnya, mereka adalah domain publik sehingga Anda dapat menggunakannya di semua program yang Anda tulis tanpa takut pembatasan perizinan.
Direktori ARTOFASM berisi file khusus untuk teks ini. Dalam ARTOFASM direktori Anda akan melihat urutan subdirektori bernama ch1, ch2, ch3, dll. Subdirektori ini berisi file yang terkait dengan Bab Satu, Bab Dua, dan seterusnya. Dalam beberapa subdirektori ini, Anda akan menemukan dua subdirektori bernama “DOS” dan “WINDOWS”. Jika subdirektori ini hadir, mereka memisahkan file-file yang harus berjalan di bawah MS-Windows dari yang berjalan di bawah DOS. Banyak program DOS membutuhkan sebuah “Real-mode” lingkungan dan tidak akan berjalan di jendela kotak DOS di Windows 95 atau Windows NT. Anda harus menjalankan direktori perangkat lunak ini dari MS-DOS. Aplikasi Windows membutuhkan monitor berwarna Sering ada kehadiran subdirektori ketiga di setiap direktori bab: SOURCES.
Ini subdirektori berisi daftar sumber (jika sesuai atau layak) untuk perangkat lunak untuk bab itu. Sebagian besar perangkat lunak untuk teks ini ditulis dalam bahasa assembly menggunakan MASM 6.x, generik C ++, Turbo Pascal, atau Borland Delphi (objek visual Pascal). Jika Anda tertarik untuk melihat bagaimana perangkat lunak beroperasi, Anda dapat melihat di subdirektori ini. Teks ini menganggap Anda sudah tahu cara menjalankan program dari MS-DOS dan Windows
dan Anda terbiasa dengan terminologi umum DOS dan Windows. Itu juga mengasumsikan Anda tahu beberapa perintah MS-DOS sederhana seperti DIR, COPY, DEL, RENAME, dan sebagainya. Jika Anda baru mengenal Windows dan DOS, Anda harus mengambil referensi manual yang sesuai pada sistem operasi ini. File untuk latihan laboratorium Bab Satu muncul di subdirektori ARTOFASM \ CH1. Ini semua adalah program Windows, jadi Anda harus menjalankan Windows 3.1, Windows 95, Windows NT, atau beberapa versi Windows yang lebih baru (dan kompatibel) untuk dijalankan program-program ini.
1.13.2 Latihan Konversi Data
Dalam latihan ini Anda akan menggunakan program “convert.exe” yang ditemukan di ARTOFASM \ CH1 subdirektori. Program ini menampilkan dan mengkonversi bilangan bulat 16-bit menggunakan ditandatangani desimal, desimal unsigned, hexadecimal, dan notasi biner. Ketika Anda menjalankan program ini, jendela akan terbuka dengan empat kotak edit. (satu untuk setiap data mengetik). Mengubah nilai di salah satu kotak edit segera memperbarui nilai di kotak lain sehingga semuanya menampilkan representasi yang sesuai untuk nilai baru. Jika Anda membuat kesalahan pada entri data, program berbunyi dan mengubah kotak edit merah sampai Anda perbaiki kesalahannya. Perhatikan bahwa Anda dapat menggunakan mouse, tombol kontrol kursor, dan pengeditan kunci (misalnya, DEL dan Backspace) untuk mengubah nilai individual di kotak edit. Untuk latihan ini dan laporan laboratorium Anda, Anda harus mengeksplorasi hubungannya antara berbagai biner, heksadesimal, desimal tak bertanda tangan, dan nilai-nilai desimal bertanda tangan. Untuk
Misalnya, Anda harus memasukkan nilai desimal unsigned 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, dan 32768 dan komentari nilai-nilai yang muncul di dalam kotak teks lainnya. Tujuan utama dari latihan ini adalah membiasakan diri Anda dengan persamaan desimal dari beberapa nilai biner dan heksadesimal umum. Di laporan lab Anda, misalnya, Anda harus menjelaskan apa yang khusus tentang persamaan biner (dan heksadesimal) dari angka desimal di atas.
Serangkaian percobaan lain untuk dicoba adalah memilih berbagai bilangan biner yang ada tepat dua bit yang ditetapkan, misalnya, 11, 110, 1100, 1 1000, 11 0000, dll. Pastikan untuk memberi komentar pada desimal dan heksadesimal menghasilkan input ini. Coba masukkan beberapa bilangan biner di mana L.O. delapan bit semuanya nol. Komentar pada hasil di laporan lab Anda. Coba eksperimen yang sama dengan angka heksadesimal menggunakan nol untuk L.O. digit atau dua L.O. digit.
Anda juga harus bereksperimen dengan angka negatif dalam entri teks desimal yang ditandatangani kotak; coba gunakan nilai seperti -1, -2, -3, -256, -1024, dll. Jelaskan hasil yang Anda peroleh pengetahuan Anda tentang sistem penomoran komplemen kedua. Coba masukkan angka genap dan ganjil dalam desimal unsigned. Temukan dan jelaskan perbedaan antara angka genap dan ganjil dalam representasi biner mereka. Coba masuk kelipatan nilai lainnya (misalnya, untuk tiga: 3, 6, 9, 12, 15, 18, 21, …) dan lihat apakah Anda dapat mendeteksi pola dalam hasil biner.
Verifikasi konversi biner <>> heksadesimal yang dijelaskan bab ini. Khususnya, masukkan digit heksadesimal yang sama di masing-masing dari empat posisi dari nilai 16-bit dan komentar pada posisi bit yang sesuai dalam representasi biner. Coba beberapa memasukkan nilai-nilai biner seperti 1111, 11110, 111100, 1111000, dan 11110000. Jelaskan hasilnya Anda mendapatkan dan menjelaskan mengapa Anda harus selalu memperpanjang nilai biner sehingga panjangnya adalah bahkan kelipatan empat sebelum mengubahnya. Dalam laporan lab Anda, buatlah daftar percobaan di atas plus beberapa yang Anda rencanakan sendiri.
Jelaskan hasil yang Anda harapkan dan sertakan hasil aktual dari program convert.exe menghasilkan. Jelaskan semua wawasan yang Anda miliki saat menggunakan program convert.exe.
1.13.3 Latihan Operasi Logika
Program logical.exe adalah kalkulator sederhana yang menghitung berbagai fungsi logis. Ini memungkinkan Anda memasukkan nilai biner atau heksadesimal dan kemudian menghitung hasilnya dari beberapa operasi logis pada input. Kalkulator mendukung logika dyadic AND, ATAU, dan XOR. Ini juga mendukung monadic NOT, NEG (dua komplemen), SHL (shift kiri), SHR (bergeser ke kanan), ROL (putar ke kiri), dan ROR (putar ke kanan). Ketika Anda menjalankan program logical.exe ini akan menampilkan serangkaian tombol di sisi kiri jendela. Tombol-tombol ini memungkinkan Anda memilih penghitungan. Misalnya, menekan tombol Tombol AND menginstruksikan kalkulator untuk menghitung operasi AND yang logis di antara dua nilai input. Jika Anda memilih operasi monadic (unary) seperti NOT, SHL, dll., Maka Anda hanya dapat memasukkan satu nilai; untuk operasi diadik, kedua set kotak entri teks akan Jadilah aktif. Program logical.exe memungkinkan Anda memasukkan nilai dalam biner atau heksadesimal. Perhatikan bahwa ini
Program secara otomatis mengkonversi setiap perubahan dalam jendela entri teks biner ke heksadesimal dan perbarui nilai di kotak edit entri hex. Begitupun, perubahan apapun dalam heksadesimal kotak entri teks segera tercermin dalam kotak teks biner. Jika Anda memasukkan nilai ilegal dalam kotak entri teks, program logical.exe akan mengubah kotak merah sampai Anda memperbaiki masalah.
Untuk latihan laboratorium ini, Anda harus mengeksplorasi setiap operasi logis bitwise. Buat beberapa percobaan dengan hati-hati memilih beberapa nilai, secara manual menghitung hasil yang Anda harapkan, dan kemudian jalankan eksperimen menggunakan program logical.exe untuk memverifikasi hasil Anda. Anda terutama harus bereksperimen dengan kemampuan masking yang logis DAN, ATAU, dan operasi XOR. Coba secara logis ANDING, ORING, dan XOR nilai yang berbeda dengan nilai-nilai seperti 000F, 00FF, 00F0, 0FFF, FF00, dll. Laporkan hasil dan komentari mereka dalam laporan laboratorium Anda Beberapa eksperimen yang mungkin ingin Anda coba, selain yang Anda rancang sendiri, sertakan yang berikut:
Rancang sebuah topeng untuk mengonversi nilai ASCII ‘0’ .. ’9’ ke bilangan bulat bilangan bulatnya menggunakan operasi AND yang logis. Coba masukkan kode ASCII dari masing-masing digit ini ketika menggunakan topeng ini. Jelaskan hasil Anda. Apa terjadi jika Anda memasukkan kode ASCII non-digit?
Rancang topeng untuk mengkonversi nilai integer dalam rentang 0..9 ke yang sesuai Kode ASCII menggunakan operasi OR yang logis. Masukkan masing-masing nilai biner dalam rentang 0..9 dan uraikan hasil Anda. Apa yang terjadi jika Anda memasukkan nilai di luar rentang 0..9? Khususnya, apa yang terjadi jika Anda memasukkan nilai di luar rentang 0h..0fh?
Rancang sebuah topeng untuk menentukan apakah nilai bilangan bulat 16-bit bernilai positif ataunegatif menggunakan operasi AND yang logis. Hasilnya harus nol jikaangka positif (atau nol) dan seharusnya tidak nol jika jumlahnyanegatif. Masukkan beberapa nilai positif dan negatif untuk menguji masker Anda.Jelaskan bagaimana Anda dapat menggunakan operasi AND untuk menguji sedikit puntentukan apakah nol atau satu.
Rancang sebuah topeng untuk digunakan dengan operasi XOR logis yang akan menghasilkan hasil yang sama pada operan kedua sebagai menerapkan operator NOT logis ke operan kedua itu.
Pastikan bahwa operator SHL dan SHR sesuai dengan perkalian bilangan bulat oleh dua dan pembagian integer oleh dua, masing-masing. Apa yang terjadi jika Anda mengalihkan data dari H.O. atau L.O. bit? Apa hubungannya ini dalam hal perkalian dan pembagian bilangan bulat?
Terapkan operasi ROL ke satu set angka positif dan negatif. Berdasarkan pengamatan Anda di Bagian 1.13.3, apa yang bisa Anda katakan tentang hasil ketika Anda memutar kiri angka negatif atau angka positif?
Terapkan operator NEG dan NOT ke nilai. Diskusikan kesamaan dan perbedaan hasil mereka. Jelaskan perbedaan ini berdasarkan pada Anda pengetahuan tentang sistem penomoran komplemen kedua.
1.13.4 Latihan Ketat dan Tanpa Batas
Program signext.exe menerima nilai biner atau heksadesimal delapan-bit kemudian masuk dan nol memanjang hingga 16 bit. Seperti program logical.exe, program ini memungkinkan Anda memasukkan nilai baik dalam nol biner atau heksadesimal dan langsung dan tanda memperpanjang nilai itu.
Untuk laporan laboratorium Anda, berikan beberapa nilai masukan delapan-bit dan jelaskan hasil yang Anda harapkan. Jalankan nilai-nilai ini melalui program signext.exe dan verifikasi hasil. Untuk setiap percobaan yang Anda jalankan, pastikan untuk mencantumkan semua hasil dalam laporan lab Anda. Menjadi Pastikan untuk mencoba nilai seperti 0, 7fh, 80h, dan 0ffh. Saat menjalankan eksperimen ini, temukan digit heksadesimal apa yang muncul di H.O. nibble menghasilkan angka negatif 16-bit dan yang menghasilkan nilai 16-bit positif. Dokumentasikan ini di laporan lab Anda. Masukkan set nilai seperti (1,10), (2,20), (3,30), …, (7,70), (8,80), (9,90), (A, A0) , …, (F, F0).
Jelaskan hasil yang Anda dapatkan dalam laporan lab Anda. Mengapa tanda “F” memanjang dengan nol sementara
Tanda “F0” memanjang dengan yang satu? Jelaskan dalam laporan lab Anda bagaimana seseorang akan menandatangani atau nol memperpanjang nilai 16 bit menjadi 32 bit nilai-nilai. Jelaskan mengapa ekstensi nol atau ekstensi tanda berguna.
1.13.5 Latihan Data Dikemas
Program packdata.exe menggunakan tipe data Date yang muncul di bab ini (lihat “Bit Fields and Packed Data ”di halaman 28). Ini memungkinkan Anda memasukkan nilai tanggal dalam biner atau desimal dan mengemas tanggal itu ke dalam nilai 16-bit tunggal. Ketika Anda menjalankan program ini, itu akan memberi Anda jendela dengan enam kotak entri data: tiga untuk memasukkan tanggal dalam bentuk desimal (bulan, hari, tahun) dan tiga kotak entri teks itu biarkan Anda memasukkan tanggal dalam bentuk biner. Nilai bulan harus dalam kisaran 1..12, the Nilai hari harus berada di kisaran 1..31, dan nilai tahun harus berada dalam rentang 0..99. Jika Anda memasukkan nilai di luar rentang ini (atau beberapa nilai ilegal lainnya), lalu packdata.exe program akan mengubah kotak entri data menjadi merah sampai Anda memperbaiki masalah.
Pilih beberapa tanggal untuk eksperimen Anda dan ubah tanggal ini menjadi 16-bit dikemas bentuk biner dengan tangan (jika Anda mengalami masalah dengan desimal ke konversi biner, gunakan program konversi dari set latihan pertama di laboratorium ini). Lalu lari tanggal-tanggal ini melalui program packdata.exe untuk memverifikasi jawaban Anda. Pastikan untuk memasukkan semuanya hasil program dalam laporan lab Anda.
Minimal, Anda harus menyertakan tanggal berikut dalam eksperimen Anda: 2/4/68, 1/1/80, 8/16/64, 7/20/60, 11/2/72, 12/25/99, Tanggal Hari Ini, ulang tahun (tidak tentu Anda), tanggal jatuh tempo pada laporan lab Anda
1.14 Pertanyaan
1) Ubah nilai desimal berikut menjadi biner:
a) 128 b) 4096 c) 256 d) 65536 e) 254
f) 9 g) 1024 h) 15 i) 344 j) 998
k) 255 l) 512 m) 1023 n) 2048 o) 4095
p) 8192 q) 16,384 r) 32,768 s) 6,334 t) 12,334
u) 23,465 v) 5,643 w) 464 x) 67 y) 888
2) Konversi nilai-nilai biner berikut ke desimal:
a) 1001 1001 b) 1001 1101 c) 1100 0011 d) 0000 1001 e) 1111 1111
f) 0000 1111 g) 0111 1111 h) 1010 0101 i) 0100 0101 j) 0101 1010
k) 1111 0000 l) 1011 1101 m) 1100 0010 n) 0111 1110 o) 1110 1111
p) 0001 1000 q) 1001 111 1 r) 0100 0010 s) 1101 1100 t) 1111 0001
u) 0110 1001 v) 0101 1011 w) 1011 1001 x) 1110 0110 y) 1001 0111
3) Konversi nilai-nilai biner dalam masalah 2 ke heksadesimal.
4) Ubah nilai heksadesimal berikut menjadi biner:
a) 0ABCD b) 1024 c) 0DEAD d) 0ADD e) 0BEEF
f) 8 g) 05AAF h) 0FFFF i) 0ACDB j) 0CDBA
k) 0FEBA l) 35 m) 0BA n) 0ABA o) 0BAD
p) 0DAB q) 4321 r) 334 s) 45 t) 0E65
u) 0BEAD v) 0ABE w) 0DEAF x) 0DAD y) 9876
Lakukan perhitungan heksa berikut (biarkan hasilnya dalam hex):
5) 1234 +9876
6) 0FFF – 0F34
7) 100 – 1
8) 0FFE – 1
9) Apa pentingnya nibble?
10) Berapa banyak digit heksadesimal dalam:
a) byte b) kata c) kata ganda
11) Berapa banyak bit dalam:
a) nibble b) byte c) kata d) kata ganda
12) Yang bit (nomor) adalah H.O. bit dalam:
a) nibble b) byte c) kata d) kata ganda
13) Karakter apa yang kita gunakan sebagai sufiks untuk angka heksadesimal? Bilangan biner? Desimal
angka?
14) Dengan asumsi format komplemen 16-bit dua, tentukan mana dari nilai-nilai dalam pertanyaan 4
positif dan mana yang negatif.
15) Tanda memperpanjang semua nilai dalam pertanyaan dua hingga enam belas bit. Berikan jawaban Anda dalam hex.
16) Lakukan operasi bitwise AND pada pasangan nilai heksadesimal berikut. Menyajikan
jawaban Anda dalam hex. (Petunjuk: mengkonversi nilai hex ke biner, lakukan operasi, lalu ubah
kembali ke hex).
a) 0FF00, 0FF0 b) 0F00F, 1234 c) 4321, 1234 d) 2341, 3241 e) 0FFFF, 0EDCB
f) 1111, 5789 g) 0FABA, 4322 h) 5523, 0F572 i) 2355, 7466 j) 4765, 6543
k) 0ABCD, 0EFDCl) 0DDDD, 1234m) 0CCCC, 0ABCDn) 0BBBB, 1234o) 0AAAA, 1234
p) 0EEEE, 1248 q) 8888, 1248 r) 8086, 124F s) 8086, 0CFA7 t) 8765, 3456
u) 7089, 0FEDC v) 2435, 0BCDE w) 6355, 0EFDC x) 0CBA, 6884 y) 0AC7, 365
17) Lakukan operasi OR logis pada pasangan angka di atas.
18) Lakukan operasi XOR logis pada pasangan angka di atas.
19) Lakukan operasi NOT logis pada semua nilai dalam pertanyaan empat. Asumsikan semua nilai
adalah 16 bit.
20) Lakukan operasi komplemen kedua pada semua nilai yang dipertanyakan empat. Asumsikan 16 bit
nilai-nilai.
21) Daftar memperpanjang nilai heksadesimal berikut dari delapan hingga enam belas bit. Hadir Anda
jawab dengan hex.
a) FF b) 82 c) 12 d) 56 e) 98
f) BF g) 0F h) 78 i) 7F j) F7
k) 0E l) AE m) 45 n) 93 o) C0
p) 8F q) DA r) 1D s) 0D t) DE
u) 54 v) 45 w) F0 x) AD y) DD
22) Menandatangani kontrak nilai-nilai berikut dari enam belas bit hingga delapan bit. Jika Anda tidak dapat melakukan
operasi, jelaskan mengapa.
a) FF00 b) FF12 c) FFF0 d) 12 e) 80
f) FFFF g) FF88 h) FF7F i) 7F j) 2
k) 8080 l) 80FF m) FF80 n) FF o) 8
p) F q) 1 r) 834 s) 34 t) 23
u) 67 v) 89 w) 98 x) FF98 y) F98
23) Sign memperpanjang nilai 16-bit dalam pertanyaan 22 hingga 32 bit.
24) Dengan asumsi nilai dalam pertanyaan 22 adalah nilai 16-bit, lakukan operasi pergeseran kiri
mereka.
25) Dengan asumsi nilai-nilai dalam pertanyaan 22 adalah nilai 16-bit, melakukan operasi pergeseran kanan
mereka.
26) Dengan mengasumsikan nilai-nilai dalam pertanyaan 22 adalah nilai 16-bit, lakukan operasi putar di sebelah kiri mereka.
27) Dengan asumsi nilai dalam pertanyaan 22 adalah nilai 16-bit, lakukan operasi yang benar berputar pada mereka.
28) Konversi tanggal berikut ke format yang dikemas yang dijelaskan dalam bab ini (lihat “Bidang Bit
dan Data yang Dikemas ”di halaman 28). Sajikan nilai Anda sebagai angka hex 16-bit.
a) 1/1/92 b) 2/4/56 c) 6/19/60 d) 6/16/86 e) 1/1/99
29) Jelaskan cara menggunakan pergeseran dan operasi logis untuk mengekstrak bidang hari dari mencatat tanggal dikemas dalam pertanyaan 28. Yaitu, berakhir dengan nilai integer 16-bit dalam rentang 0..31.
30) Misalkan Anda memiliki nilai dalam rentang 0..9. Jelaskan bagaimana Anda dapat mengubahnya menjadi ASCII karakter menggunakan operasi logis dasar.
31) Fungsi C ++ berikut menempatkan bit set pertama dalam parameter BitMap dimulai dari bit posisi mulai dan bekerja hingga H.O. sedikit. Jika tidak ada, ada yang mengembalikan -1. Jelaskan, dalam detail, bagaimana fungsi ini berfungsi.
int FindFirstSet (unsource BitMap, unsigned start)
{
unsigned Mask = (1 << start);
sementara (Mask)
{
jika (BitMap & Mask) mulai kembali;
++ mulai;
Mask << = 1;
}
return -1;
}
32) Bahasa pemrograman C ++ tidak menentukan berapa banyak bit yang ada dalam unsigned bilangan bulat. Jelaskan mengapa kode di atas akan berfungsi terlepas dari jumlah bit dalam suatu unsigned integer.
33) Fungsi C ++ berikut adalah pelengkap fungsi dalam pertanyaan di atas. Saya t menempatkan bit nol pertama dalam parameter BitMap. Jelaskan, secara detail, bagaimana pencapaiannya ini.
int FindFirstClr (unsource BitMap, unsigned start)
{
return FindFirstSet (~ BitMap, start);
}
34) Dua fungsi berikut mengatur atau menghapus (masing-masing) bit tertentu dan mengembalikan yang baru hasil. Jelaskan, secara detail, bagaimana fungsi-fungsi ini beroperasi.
unsBelted SetBit (unsource BitMap, unsigned position)
{
kembali BitMap | (1 << posisi);
}
unsigned ClrBit (unsource BitMap, unsigned position)
{
return BitMap & ~ (1 << posisi);
}
35) Dalam kode yang muncul dalam pertanyaan di atas, jelaskan apa yang terjadi jika awal dan posisi parameter berisi nilai yang lebih besar dari atau sama dengan jumlah bit dalam integ tidak bertanda tangan 1.15 Proyek Pemrograman Proyek pemrograman berikut mengasumsikan Anda menggunakan C, C ++, Turbo Pascal, Borland Pascal, Delphi, atau beberapa bahasa pemrograman lain yang mendukung bitwise logical operasi. Perhatikan bahwa C dan C ++ menggunakan operator “&”, “|”, dan “^” untuk logika AND, OR, dan XOR, masing-masing. Produk Borland Pascal memungkinkan Anda menggunakan “dan”, “atau”, dan “xor” operator di integer untuk melakukan operasi logis bitwise. Proyek-proyek berikut semua berharap Anda menggunakan operator logis ini. Ada solusi lain untuk masalah ini itu tidak melibatkan penggunaan operasi yang logis, jangan menggunakan solusi semacam itu. Tujuan dari latihan ini adalah untuk memperkenalkan Anda pada operasi logis yang tersedia dalam bahasa tingkat tinggi. Pastikan untuk menanyakan kepada instruktur Anda untuk menentukan bahasa yang Anda gunakan menggunakan. Uraian berikut biasanya menggambarkan fungsi yang akan Anda tulis. Namun, Anda perlu menulis program utama untuk memanggil dan menguji setiap fungsi yang Anda tuliskan bagian dari tugas.
1) Tulis ke fungsi, toupper dan tolower, yang mengambil satu karakter sebagai parameter dan konversikan karakter ini ke huruf besar (jika huruf kecil) atau huruf kecil (jika huruf besar) masing-masing. Gunakan operasi logis untuk melakukan konversi. Pengguna Pascal mungkin perlu untuk menggunakan fungsi chr () dan ord () agar berhasil menyelesaikan tugas ini.
2) Tuliskan fungsi “CharToInt” yang Anda berikan string karakter dan mengembalikan yang sesuai nilai integer. Jangan gunakan rutin perpustakaan built-in seperti atoi (C) atau strtoint (Pascal) ke lakukan konversi ini. Anda memproses setiap karakter yang dilewatkan pada string input, mengubahnya dari karakter ke integer menggunakan operasi logis, dan mengumpulkan hasilnya hingga Anda mencapai ujung string. Algoritma yang mudah untuk tugas ini adalah mengalikan akumulasi hasil oleh 10 dan kemudian tambahkan digit berikutnya. Ulangi ini sampai Anda mencapai ujung tali. Pengguna Pascal mungkin perlu menggunakan fungsi ord () dalam tugas ini.
3) Tulis fungsi ToDate yang menerima tiga parameter, satu bulan, hari, dan nilai tahun. Ini fungsi harus mengembalikan nilai tanggal 16-bit yang dikemas menggunakan format yang diberikan dalam bab ini (lihat “Bidang Bit dan Data yang Dikemas” di halaman 28). Tulis tiga fungsi yang terkaitExtractMonth, ExtractDay, dan ExtractYear yang mengharapkan nilai tanggal 16-bit dan mengembalikannilai bulan, hari, atau tahun yang sesuai. Fungsi ToDate harus dikonversi secara otomatistanggal dalam rentang 1900-1999 hingga kisaran 0,99.
4) Tulis fungsi “CntBits” yang menghitung jumlah satu bit dalam nilai integer 16-bit. Melakukan tidak menggunakan fungsi bawaan apa pun di pustaka bahasa Anda untuk menghitung bit ini untuk Anda.
5) Tulis fungsi “TestBit”. Fungsi ini membutuhkan dua parameter bilangan bulat 16-bit. Pertama parameter adalah nilai 16-bit untuk diuji; parameter kedua adalah nilai dalam rentang 0..15 mendeskripsikan bit mana yang akan diuji. Fungsi harus mengembalikan true jika bit yang sesuai mengandungsatu, fungsi harus mengembalikan false jika posisi bit itu mengandung nol. Fungsi ituharus selalu mengembalikan false jika parameter kedua menyimpan nilai di luar rentang 0..15.ji
6) Pascal dan C / C ++ menyediakan shift kiri dan operator shift kanan (SHL / SHR di Pascal, “<<“ dan “>>” dalam C / C ++). Namun, mereka tidak menyediakan rotate right dan rotate left operators. Tulis sepasang fungsi, ROL dan ROR, yang melakukan tugas rotasi. Petunjuk: gunakan fungsi dari latihan lima untuk menguji H.O. sedikit. Kemudian gunakan operasi shift yang sesuai dan operasi OR yang logis untuk melakukan rota

label: ms

label: it

label: zh


content:
Berita . BERITA ONLINE . Filsafat . Hak Asasi Manusia . Hak Asasi Manusia . Hukum . Hukum dan Kekuasaan . HUKUM PENANAMAN MODAL . Kebijakan Publik . Nasional . Pengabdian Masyarakat . Politik . Serba Serbi . Sosial Kemasyarakatan . Teori . Terminologi . Uncategorized . Wawasan Kebangsaan
FENOMENA HUKUM TATA NEGARA
SEBAGAI HUKUM POSITIF
Van Vollenhoven di dalam tulisannya yang berjudul “Thoerbecke en het Administratief recht” mengatakan bahwa HTN adalah hukum tentang negara dalam keadaan berhenti (diam, statis), sedangkan HAN hukum tentang negara dalam keadaan bergerak (bekerja, dinamis).
Menurut Logemann bahwa Hukum Tata Negara adalah hukum yang mengatur organisasi negara.
Secara umum dapat dikatakan, Hukum Tata Negara pada dasarnya adalah hukum yang mengatur organisasi kekuasaan suatu Negara beserta segala aspek yang berkaitan dengan organisasi Negara tersebut.
Di Belanda umumnya memakai istilah “staatsrech” yang dibagi menjadi staatsrech in ruimere zin (dalam arti luas) dan staatsrech in engere zin (dalam arti luas). Staatsrech in ruimere zin adalah Hukum Negara. Sedangkan staatsrech in engere zin adalah hukum yang membedakan Hukum Tata Negara dari Hukum Administrasi Negara, Hukum Tata Usaha Negara atau Hukum Tata Pemerintah.
Oppenheim menyatakan bahwa Hukum Tata Negara itu sama dengan negara dalam keadaan tidak bergerak (staat in beweging), sedangkan Hukum Administrasi Negara atau Hukum Tata Usaha Negara atau Hukum Tata Pemerintahan seumpama negara dalam keadaan bergerak (staat in rust).
Sumber Hukum Tata Negara dapat dibagi menjadi 2 (dua) yaitu Sumber Hukum Formil dan Sumber Hukum Materil.
Sumber hukum materil dari Hukum Tata Negara (HTN) adalah Pancasila sebagai pandangan hidup bangsa Indonesia kemudian menjadi falsafah negara, yang tidak saja menjiwai bahkan harus dilaksanakan oleh setiap peraturan hukum.
Sumber hukum formil dari Hukum Tata Negara, meliputi:
UUD 1945;
TAP MPR/MPRS;
Undang – Undang/Peraturan Pemerintah Pengganti Undang – Undang;
Peraturan Pemerintah;
Keputusan Presiden;
Peraturan Pelaksana lainnya, misalnya Peraturan Menteri, Peraturan Daerah dan sebagainya.
Kebiasaan ketatanegaraan (Convention);
Traktat (Perjanjian Internasional);
Ruang lingkup Hukum Tata Negara adalah struktur umum dari negara sebagai organisasi, yaitu:
Bentuk Negara (Kesatuan atau Federasi)
Bentuk Pemerintahan (Kerajaan atau Republik)
Sistem Pemerintahan (Presidentil, Parlementer, Monarki absolute)
Corak Pemerintahan (Diktator Praktis, Nasionalis, Liberal, Demokrasi)
Sistem Pendelegasian Kekuasaan Negara (Desentralisasi, meliputi jumlah, dasar, cara dan hubungan antara pusat dan daerah).

warc-identified-content-language: ind,eng

warc-type: conversion

content-type: text/plain

label: id

annotation: short_sentences header footer


content:
Skorbola365 Memberikan informasi Live Skor Bola, Livescore, Jadwal Bola, Hasil Pertandingan. Semua pertandingan bola tersedia di skorbola365. skor bola yang pasti akurat. Skorbola365 akan selalu memperbarui skor dan jadwal pertandingan bola nyata untuk lebih dari 1000 club sepak bola. skorbola365 juga menyediakan skor langsung, hasil terbaru, Klasemen, Jadwal Pertandingan, Statistik Jadwal, Perbandingan oods. Skorbola365 juga merupakan situs web informasi yang bertanggung jawab secara sosial, Kami memberikan informasi huburan olahraga yang bertanggung jawab. untuk menggunakan informasi kami anda harus minimal 18 tahun untuk menggunakan informasikami dan juga anda harus mematuhi hukum yang berlaku di negara anda. semua brand dapat mengiklankan produk atau layanan anda di situs kami, namum kami tidak bisa menjamin kakuratannya dan keamanan produk atau layanan tersebut. pihak skorbola365 tidak bertanggung jawab atas kehilangan atau kerusakan apapun yang di sebabkan oleh oleh apa pun.
We recommend: Chrome | Firefox | Explorer | Opera | Safari to visit our site and best viewed in widescreen resolution.

warc-identified-content-language: eng,ind

label: en


content: Sehubungan dengan akan di kembangkannya SIMTAG dan dalam upaya peningkatan Kapasitas TAGANA serta penerbitan niat, khususnya untuk lingkup tagana di Provinsi Jambi masih banyaknya anggota yang belum memiliki NIAT terkhusus tagana aktif. maka dilakukannya verifikasi dan Validasi Data Tangana di mulai di Kota Jambi dan seterusnya.


content:
Cara Bermain Forex – Adakah bisnis jual beli mata uang yang aman dan menguntungkan? Sepertinya pertanyaan ini dilontarkan oleh anda yang masih awam dan belum mendalami bisnis seperti ini. Biasanya ornag yang sudah pengalaman akan mengetahui seluk beluk dari...
Tips Memilih Perusahaan Forex
Tips Memilih Perusahaan Forex – Berbisnis dengan keuntungan besar adalah sesuatu yang diinginkan oleh banyak orang termasuk anda. Kalau mau cepat kaya harus punya taktik dan strategi yang jitu agar dapat mencapai target sesuai renca dari awal. Lebih cepat...
Cara Membuat Akun Forex Untuk Pemula Yang Ingin Sukses
Cara Membuat Akun Forex Untuk Pemula Yang Ingin Sukses – Bisnis online makin digemari masyarakat karena mudah dijalankan, tapi resiko juga semakin besar. Berbeda dengan usaha yang dijalankan di dunia nyata, internet memberi ruang bagi orang baik dan orang...
Tips Memulai Bisnis Forex
Tips Memulai Bisnis Forex – Foreign Exchange adalah kepanjangan dari usaha yang kini marak dibicarakan dan diikuti oleh masyarakat secara luas di Indonesia dan juga seluruh dunia tersebut. Dalam arti kata, orang akan menggunakan mata uang asing sebagai komoditi...
Cara Kerja Bisnis Forex
Cara Kerja Bisnis Forex – Masyarakat di Indonesia dan seluruh dunia saat ini sedang menikmati kemajuan teknologi. Beragam bisnis bermunculan dari fenomena tersebut, salah satunya adalah pertukaran mata uang asing yang bisa mendatangkan untung berlipat dari modal awal. Kalangan...


content: S128 SABUNG AYAM TAJI TORAJA YANG MEMATIKAN – Halo Semua, Pada Kali Ini Admin S128 Akan Membahas Artikel Tentang S128 Sabung Ayam Taji Toraja Yang Mematikan. Fipperbet adalah salah satu agen daftar Aduan Ayam yang adalah situs penyedia permainan Aduan Ayam yang pastinya kamu sudah tidak asing lagi dengan jenis permainan yang satu ini adalah…

warc-identified-content-language: ind


content:
Oops! It appears that you have disabled your Javascript. In order for you to see this page as it is meant to appear, we ask that you please re-enable your Javascript!
0813 30682412 eskrienergy@gmail.com
Home
About Us
Contact
Gallery
Portfolio
Sitemap
Menu
Lampu Hias
Lampu Lampion
Lampu LED
Lampu Neon
Lampu Sorot
Home
Aksesoris Lampu
Jual Inverter Murah
Jual Inverter Murah
By: Admin
February 14, 2017
Categories: Aksesoris Lampu
Pabriklampu.net – Mencari toko yang jual inverter murah tidak mudah mengingat banyak orang yang menginginkan inverter murah dengan kualitas berkualitas. Bagi Anda yang belum mengetahui fungsi dari alat ini. Inverter memiliki fungsi sebagai portable listrik. Karena berfungsi sebagai penghasil listrik yang portable, alat ini bisa digunakan kapanpun Anda menginginkannya. Banyak yang menggunakan inverter untuk mengisi ulang baterai pada alat-alat elektronik seperti smartphone, notebook, dan TV. Inverter ini sangat bermanfaat terutama di wilayah yang sulit mendapatkan listrik.
Price list inverter dibandrol mulai Rp 350.000 untuk daya 400W. Harga inverter ini cukup murah. Jika ingin yang dayanya lebih besar maka harga yang ditawarkan pun sedikit lebih mahal. Sebagai contoh ada toko yang menjual Rp 750.000 untuk inverter daya 2000w. Membeli Inverter yang berkualitas sebaiknya di toko terpecaya yang memberikan garansi. Garansi yang diberikan toko biasanya hingga 30 hari dari waktu pembelian inverter. Jika Anda nekat membeli inverter yang tidak ada garansinya, maka jika terjadi sesuatu pada inverter tersebut, Anda akan kewalahan saat komplain ke pihak toko.
Banyak toko yang jual inverter di daerah Jakarta dan Surabaya. Untuk lebih praktisnya Anda bisa memesan secara online. Tips cerdas saat memilih toko online yaitu lihatlah alamat website tersebut apakah terpecaya atau tidak. Tidak sedikit yang tertipu saat membeli barang secara online karena kurang cermat saat memilih olshop.


content: Daftar Poker Online Terbaru – Untuk saat ini permainan judi poker online adalah salah satu permainan yang paling banyak peminatnya. Terbukti setiap harinya jumlah pemain aktif dalam judi poker online selalu meningkat dan tidak pernah mengalami penurunan. Permainan poker online terbaru ini paling banyak diminati oleh banyak orang dikarenakan cara