12.5 Intel x86 Dan Jenis ARM Operasi

Jenis Operasi x86

x86 menyediakan array kompleks jenis operasi, termasuk sejumlah khusus
instruksi. Tujuannya adalah untuk menyediakan alat-alat untuk penulis compiler untuk menghasilkan
dioptimalkan mesin terjemahan bahasa program bahasa tingkat tinggi. tabel 12.8
daftar jenis dan memberikan contoh masing-masing. Sebagian besar adalah konvensional
petunjuk yang ditemukan di sebagian besar mesin set instruksi, tetapi beberapa jenis instruksi

disesuaikan dengan arsitektur x86 dan kepentingan tertentu. Lampiran A dari

[CART06] berisi petunjuk x86, bersama-sama dengan operan untuk masing-masing dan
efek dari instruksi pada kode kondisi. Lampiran B dari perakitan NASM
pengguna bahasa memberikan penjelasan lebih rinci dari setiap instruksi x86. Kedua
dokumen tersebut tersedia di situs Web buku ini.
CALL / RETURN INSTRUKSI x86 menyediakan empat instruksi untuk mendukung
Prosedur call / pulang: CALL, ENTER, TINGGALKAN, RETURN. Ini akan menjadi pelajaran untuk melihat dukungan yang diberikan oleh petunjuk ini. Ingat dari Gambar 12.10 bahwa
sarana umum menerapkan mekanisme prosedur panggilan / return adalah melalui penggunaan
dari tumpukan frame. Ketika prosedur baru disebut, berikut ini harus dilakukan
pada saat masuk ke prosedur baru:

 • Dorong titik pengembalian stack.
 • Dorong frame pointer saat ini di stack.
 • Salin stack pointer sebagai nilai baru dari pointer bingkai.
 • Sesuaikan stack pointer untuk mengalokasikan frame.

Instruksi PANGGILAN mendorong arus nilai instruksi pointer ke stack
dan menyebabkan melompat ke titik masuknya prosedur dengan menempatkan alamat
entry point dalam instruksi pointer. Di 8088 dan 8086 mesin, khas
Prosedur dimulai dengan urutan

PUSH EBP
MOV EBP, ESP
SUB ESP, space_for_locals

mana EBP adalah frame pointer dan ESP adalah pointer stack. Di 80286 dan kemudian
mesin, ENTER instruksi melakukan semua operasi tersebut dalam
instruksi tunggal. Instruksi ENTER ditambahkan ke set instruksi untuk memberikan dukungan langsung untuk compiler. instruksi juga termasuk fitur untuk mendukung apa yang
disebut prosedur bersarang dalam bahasa seperti Pascal, COBOL, dan Ada (tidak ditemukan
di C atau FORTRAN). Ternyata ada cara yang lebih baik dari penanganan bersarang
Prosedur panggilan untuk bahasa tersebut. Selanjutnya, meskipun ENTER instruksi
menghemat beberapa byte memori dibandingkan dengan PUSH, MOV, urutan SUB
(4 bytes dibandingkan 6 byte), itu benar-benar membutuhkan waktu lebih lama untuk mengeksekusi (10 siklus clock vs 6 siklus jam). Dengan demikian, meskipun mungkin tampak ide yang baik untuk instruksi mengatur desainer untuk menambahkan fitur ini, itu mempersulit pelaksanaan prosesor
sambil memberikan sedikit atau tidak ada manfaat. Kita akan melihat bahwa, sebaliknya, pendekatan RISC untuk prosesor desain akan menghindari instruksi kompleks seperti ENTER dan kekuatan
menghasilkan implementasi yang lebih efisien dengan urutan instruksi sederhana.
MANAJEMEN MEMORY Satu set instruksi khusus berkaitan dengan memori
segmentasi. Ini adalah petunjuk istimewa yang hanya bisa dijalankan dari
sistem operasi. Mereka memungkinkan tabel segmen lokal dan global (tabel disebut descriptor)
yang akan diambil dan membaca, dan untuk tingkat hak istimewa dari segmen untuk diperiksa dan diubah.
Instruksi khusus untuk menangani cache on-chip yang dibahas di Bab 4.

BENDERA STATUS DAN KODE KONDISI bendera Status yang bit dalam register khusus
yang dapat ditetapkan oleh operasi tertentu dan digunakan dalam instruksi cabang bersyarat. Itu
kode kondisi merujuk pada pengaturan dari satu atau lebih bendera status. Dalam x86 dan
banyak arsitektur lainnya, flag status yang ditetapkan oleh aritmatika dan membandingkan operasi.
Operasi membandingkan dalam kebanyakan bahasa mengurangi dua operan, seperti halnya kurangi sebuah operasi. Perbedaannya adalah bahwa operasi membandingkan hanya menetapkan bendera status, sedangkan operasi kurangi juga menyimpan hasil dari pengurangan dalam operan tujuan.
Beberapa arsitektur juga menetapkan bendera status instruksi transfer data.
Tabel 12.9 mencantumkan status flag digunakan pada x86. Setiap bendera, atau kombinasi dari
bendera ini, dapat diuji untuk melompat bersyarat. Tabel 12.10 menunjukkan kondisi
Kode (kombinasi dari nilai status flag) yang opcodes melompat bersyarat memiliki
didefinisikan.
Beberapa pengamatan menarik dapat dibuat tentang daftar ini. Pertama, kita mungkin
ingin menguji dua operan untuk menentukan apakah satu nomor lebih besar dari yang lain. Tapi
ini akan tergantung pada apakah nomor tersebut ditandatangani atau unsigned. Sebagai contoh,
8-bit nomor 11111111 lebih besar dari 00.000.000 jika dua angka ditafsirkan
bulat sebagai unsigned (255 7 0) tapi kurang jika mereka dianggap sebagai 8-bit berpasangan melengkapi nomor (-1 6 0). Oleh karena itu banyak bahasa assembly memperkenalkan dua set
istilah untuk membedakan dua kasus: Jika kita membandingkan dua angka sebagai ditandatangani
bilangan bulat, kita menggunakan istilah kurang dari dan lebih besar dari; jika kita membandingkan mereka sebagai unsigned integer, kita menggunakan istilah di bawah dan di atas.
Pengamatan kedua menyangkut kompleksitas membandingkan bilangan bulat ditandatangani.
Hasil ditandatangani lebih besar dari atau sama dengan nol jika (1) bit tanda adalah nol dan ada
tidak ada overflow (S = 0 DAN O = 0), atau (2) bit tanda adalah salah satu dan ada overflow.


Sebuah studi dari Gambar 10.4 harus meyakinkan Anda bahwa kondisi diuji untuk berbagai
operasi ditandatangani sesuai.
X86 SIMD INSTRUKSI Pada tahun 1996, Intel memperkenalkan teknologi MMX ke nya
lini produk Pentium. MMX adalah set instruksi yang sangat optimal untuk tugas-tugas multimedia.
Ada 57 instruksi baru yang memperlakukan data di SIMD satu (single-instruksi, multipledata)
fashion, yang memungkinkan untuk melakukan operasi yang sama, seperti penambahan
atau perkalian, pada beberapa elemen data sekaligus. Setiap instruksi biasanya membutuhkan
siklus clock untuk mengeksekusi. Untuk aplikasi yang tepat, ini operasi paralel cepat
dapat menghasilkan speedup dua sampai delapan kali lebih algoritma sebanding yang tidak menggunakan petunjuk MMX [ATKI96]. Dengan diperkenalkannya arsitektur x86 64-bit,
Intel telah memperluas ekstensi ini untuk menyertakan quadword ganda (128 bit) operan dan
operasi floating-point. Dalam ayat ini, kita menggambarkan fitur MMX.
Fokus MMX adalah pemrograman multimedia. Video dan audio data yang biasanya
terdiri dari array besar jenis data kecil, seperti 8 atau 16 bit, sedangkan konvensional
instruksi yang disesuaikan untuk beroperasi pada data 32 atau 64-bit. Berikut adalah beberapa
contoh: Dalam grafis dan video, adegan tunggal terdiri dari array piksel 2 dan ada 8 bit untuk setiap pixel atau 8 bit untuk setiap komponen warna pixel (merah, hijau,
biru). audio sampel khas dikuantisasi menggunakan 16 bit. Untuk beberapa grafis 3D
algoritma, 32 bit yang umum untuk tipe data dasar. Untuk menyediakan operasi paralel
pada ini panjang data, tiga jenis data baru didefinisikan dalam MMX. setiap data
Jenis adalah 64 bit panjang dan terdiri dari beberapa bidang data yang lebih kecil, masing-masing
memegang fixed-point integer. Jenis adalah sebagai berikut:

 • byte Dikemas: Delapan byte dikemas ke dalam satu kuantitas 64-bit
 • Kata Dikemas: Empat kata 16-bit dikemas menjadi 64 bit
 • Dikemas doubleword: Dua 32-bit doublewords dikemas menjadi 64 bit

Tabel 12.11 daftar MMX set instruksi. Sebagian besar instruksi melibatkan
operasi paralel pada byte, kata, atau doublewords. Misalnya, PSLLW yang instruksi melakukan pergeseran logis kiri secara terpisah pada masing-masing dari empat kata dalam dikemas kata operan; instruksi PADDB membutuhkan waktu dikemas operan byte sebagai masukan dan melakukan penambahan paralel pada setiap posisi byte secara independen untuk menghasilkan dikemas keluaran byte. Salah satu fitur yang tidak biasa dari set instruksi baru adalah pengenalan saturasi
aritmatika untuk byte dan kata 16-bit operan. Dengan aritmatika unsigned biasa,
ketika operasi meluap (yaitu, membawa keluar dari bit yang paling signifikan), yang
sedikit tambahan terpotong. Hal ini disebut sebagai sampul, karena efek dari pemotongan dapat, misalnya, untuk menghasilkan hasil samping yang lebih kecil dari dua operan masukan. Pertimbangkan penambahan dua kata, dalam heksadesimal,
F000h dan 3000H. Jumlah tersebut akan dinyatakan sebagai

F000h = 1111 0000 0000 0000
+ 3000H = 0011 0000 0000 0000
10010 0000 0000 0000 = 2000H

Jika dua angka diwakili intensitas gambar, maka hasil penambahan adalah
untuk membuat kombinasi dua warna gelap berubah menjadi lebih ringan. Ini biasanya
tidak apa yang dimaksudkan. Dengan saturasi aritmatika, jika hasil penambahan overflow
atau hasil pengurangan di underflow, hasilnya diatur ke terkecil terbesar atau
nilai representable. Untuk contoh sebelumnya, dengan saturasi aritmatika, kami
memiliki

F000h = 1111 0000 0000 0000
+ 3000H = 0011 0000 0000 0000
10010 0000 0000 0000
1111 1111 1111 1111 = FFFFh

Untuk memberikan nuansa untuk penggunaan instruksi MMX, kita melihat contoh,
diambil dari [PELE97]. Sebuah aplikasi video umum adalah fade-out, fade-in efek,
di mana satu adegan secara bertahap melarutkan ke lain. Dua gambar digabungkan dengan
rata-rata tertimbang:

Result_pixel = A_pixel * fade + B_pixel * (1 - memudar)


Perhitungan ini dilakukan pada setiap posisi pixel di A dan B. Jika seri frame video yang dihasilkan sementara secara bertahap mengubah nilai memudar dari 1 ke 0 (Skala tepat untuk 8-bit integer), hasilnya adalah memudar dari gambar A ke image B.

Gambar 12.11 menunjukkan urutan langkah-langkah yang diperlukan untuk satu set piksel. Itu
komponen pixel 8-bit dikonversi ke elemen 16-bit untuk mengakomodasi MMX 16-bit kemampuan berkembang biak. Jika gambar ini menggunakan 640 * 480 resolusi, dan teknik melarutkan menggunakan semua 255 nilai yang mungkin dari nilai memudar, maka total jumlah instruksi dieksekusi menggunakan MMX adalah 535.000.000. Perhitungan yang sama, dilakukan tanpa instruksi MMX, membutuhkan 1,4 miliar eksekusi instruksi [INTE98].


Jenis Operasi ARM

Arsitektur ARM menyediakan koleksi besar jenis operasi. Pengikut
adalah kategori utama:

 • Load dan menyimpan instruksi: Dalam arsitektur ARM, hanya beban dan toko
instruksi mengakses lokasi memori; aritmatika dan logis instruksi yang
dilakukan hanya pada register dan nilai-nilai langsung dikodekan dalam instruksi.
Keterbatasan ini adalah karakteristik dari desain RISC dan dieksplorasi lebih lanjut dalam
Bab 15. arsitektur ARM mendukung dua jenis luas instruksi
bahwa beban atau menyimpan nilai satu register, atau sepasang register, dari atau ke
memori: (1) beban atau menyimpan kata 32-bit atau 8-bit unsigned byte, dan (2) beban
atau menyimpan 16-bit unsigned sindiran, dan memuat dan menandatangani memperpanjang sindiran 16-bit atau 8-bit byte.

 • Instruksi Cabang: ARM mendukung instruksi cabang yang memungkinkan bersyarat
depan cabang atau mundur hingga 32 MB. Sebagai program counter
adalah salah satu register tujuan umum (R15), cabang atau melompat juga dapat
dihasilkan dengan menulis nilai ke R15. Sebuah panggilan subroutine dapat dilakukan oleh
varian dari instruksi cabang standar. Serta memungkinkan cabang
maju atau mundur hingga 32 MB, Cabang dengan Link (BL) instruksi
mempertahankan alamat instruksi setelah cabang (alamat pengirim)
di LR (R14). Cabang ditentukan oleh kondisi lapangan 4-bit di
petunjuk.

 • Instruksi pemrosesan data: Kategori ini berisi petunjuk logis
(AND, OR, XOR), menambah dan mengurangi petunjuk, dan uji dan bandingkan
instruksi.

 • Instruksi Multiply: integer kalikan petunjuk beroperasi pada kata atau
operan sindiran dan dapat menghasilkan hasil yang normal atau panjang. Sebagai contoh,
ada instruksi untuk perkalian yang mengambil dua operan 32-bit dan menghasilkan
Hasil 64-bit.

 • Paralel penambahan dan pengurangan instruksi: Selain data normal
pengolahan dan kalikan instruksi, ada satu set Selain paralel dan
instruksi pengurangan, di mana bagian-bagian dari dua operan dioperasikan pada
sejajar. Misalnya, ADD16 menambahkan halfwords atas dua register untuk
membentuk sindiran atas hasil dan menambahkan halfwords bawah
yang sama dua register untuk membentuk sindiran bawah hasilnya. instruksi ini
berguna dalam aplikasi pengolahan gambar, mirip dengan x86 MMX
instruksi.

 • Memperpanjang petunjuk: Ada beberapa petunjuk untuk membongkar data dengan tanda
atau nol memperluas byte untuk halfwords atau kata-kata, dan halfwords kata-kata.

 • Instruksi akses Status daftar: ARM menyediakan kemampuan untuk membaca dan juga
untuk menulis bagian-bagian dari register status.

KODE KONDISI Arsitektur ARM mendefinisikan empat bendera kondisi yang
disimpan dalam status program daftar: N, Z, C, dan V (negatif, nol, Carry

dan overflow), dengan makna dasarnya sama dengan S, Z, C, dan bendera V dalam arsitektur x86. Keempat bendera merupakan kode kondisi ARM.
Tabel 12.12 menunjukkan kombinasi dari kondisi yang eksekusi bersyarat didefinisikan.
Ada dua aspek yang tidak biasa untuk penggunaan kode kondisi di ARM:

 1. Semua instruksi, bukan hanya instruksi cabang, termasuk bidang kode kondisi,
yang berarti bahwa hampir semua instruksi dapat kondisional dijalankan. Apa saja
kombinasi pengaturan bendera kecuali 1110 atau 1111 dalam kondisi instruksi ini
bidang kode menandakan bahwa instruksi akan dieksekusi hanya jika kondisi
bertemu.

 2. Semua instruksi pengolahan data (aritmatika, logis) mencakup bit S yang menandakan
apakah instruksi update bendera kondisi.

Penggunaan eksekusi bersyarat dan pengaturan bersyarat dari bendera kondisi
membantu dalam desain program pendek yang menggunakan memori kurang. Di samping itu,
semua instruksi termasuk 4 bit untuk kode kondisi, sehingga ada trade-off dalam
lebih sedikit bit dalam instruksi 32-bit yang tersedia untuk opcode dan operan. Karena
ARM adalah desain RISC yang sangat bergantung pada daftar menangani, ini tampaknya
menjadi wajar trade-off.


12.6 Rekomendasi Bacaan

Instruksi x86 set baik tertutup oleh [BREY09]. Set instruksi ARM ditutupi
di [SLOS04] dan [KNAG04]. [INTE04c] menjelaskan pertimbangan software yang berhubungan dengan mikroprosesor
arsitektur Endian dan membahas pedoman untuk mengembangkan kode Endian-netral
(Kertas tersedia di bagian konten premium untuk buku ini).



12.7 Permasalahan Kunci, Membahas Pertanyaan, Dan Penyelesaian

Membahas Pertanyaan

  12.1 Apa elemen khas dari instruksi mesin?
  12.2 Apa jenis lokasi dapat menahan sumber dan tujuan operan?
  12.3 Jika instruksi berisi empat alamat, apa yang mungkin menjadi tujuan setiap alamat?
  12.4 Daftar dan menjelaskan secara singkat lima set instruksi masalah desain penting.
  12.5 Apa jenis operan yang khas di set instruksi mesin?
  12.6 Apa hubungan antara kode karakter IRA dan desimal dikemas perwakilan?
  12.7 Apa perbedaan antara pergeseran aritmatika dan pergeseran logis?

  12.8 Mengapa transfer instruksi kontrol yang dibutuhkan?
  12.9 Daftar dan menjelaskan secara singkat dua cara umum menghasilkan kondisi yang akan diuji    dalam instruksi cabang bersyarat.
  12.10 Yang dimaksud dengan bersarang jangka prosedur?
  12.11 Daftar tiga tempat yang mungkin untuk menyimpan alamat kembali untuk kembali prosedur.
  12.12 Apa adalah prosedur reentrant?
  12.13 Apa notasi Polish terbalik?
  12.14 Apa perbedaan antara endian besar dan endian kecil?

Penyelesaian

  12.1 Tampilkan dalam notasi hex:
a. format desimal dikemas selama 23
b. Karakter ASCII 23

  12.2 Untuk setiap angka desimal dikemas berikut, menunjukkan nilai desimal:
a. 0111 0011 0000 1001
b. 0101 1000 0010
c. 0100 1010 0110

  12.3 Sebuah mikroprosesor diberikan memiliki kata-kata dari 1 byte. Apa yang terkecil dan terbesar bilangan bulat yang dapat diwakili dalam representasi berikut:
a. unsigned
b. Tanda-besaran
c. pelengkap yang
d. berpasangan melengkapi
e. Unsigned desimal dikemas
f. Menandatangani desimal dikemas

 12.4 Banyak prosesor menyediakan logika untuk melakukan aritmatika pada angka desimal dikemas.
Meskipun aturan untuk aritmatika desimal adalah sama dengan yang untuk operasi biner,
hasil desimal mungkin memerlukan beberapa koreksi ke angka individu jika biner
logika digunakan. Pertimbangkan penambahan desimal dari dua nomor unsigned. Jika setiap nomor terdiri N digit, maka ada bit 4N di setiap nomor. Dua angka yang akan ditambahkan
menggunakan penambah biner. Menyarankan aturan sederhana untuk memperbaiki hasilnya. melakukan penambahan dalam mode ini pada nomor 1698 dan 1786.

 12.5 puluhan pelengkap dari nomor desimal X didefinisikan sebagai 10N - X, di mana N
adalah jumlah digit desimal di nomor tersebut. Menggambarkan penggunaan pelengkap sepuluh ini
representasi untuk melakukan pengurangan desimal. Menggambarkan prosedur dengan mengurangkan
(0326) 10 dari (0736) 10.

 12.6 Bandingkan mesin nol, satu, dua, dan tiga alamat dengan menulis program untuk menghitung

X = (A + B * C)> (D - E * F)


 untuk masing-masing empat mesin. Petunjuk tersedia untuk digunakan adalah sebagai berikut:

  12.7 Pertimbangkan komputer hipotetis dengan set instruksi dari hanya dua instruksi n-bit.
Bit pertama menentukan opcode, dan bit sisanya menentukan salah satu 2n-1 n-bit kata-kata dari memori utama. Dua instruksi adalah sebagai berikut:

SUBS X Kurangi isi lokasi X dari akumulator, dan menyimpan mengakibatkan lokasi X dan akumulator.
JUMP alamat X Tempat X dalam program counter.

Sebuah kata dalam memori utama mungkin berisi baik instruksi atau bilangan biner di
notasi komplemen berpasangan. Menunjukkan bahwa instruksi repertoar ini cukup
menyelesaikan dengan menentukan bagaimana operasi berikut dapat diprogram:

a. Transfer data: Lokasi X untuk akumulator, akumulator ke lokasi X
b. Selain itu: Tambahkan isi lokasi X untuk akumulator
c. cabang bersyarat
d. logis OR
e. I / O Operasi

 12.8 Banyak set instruksi berisi instruksi NOOP, yang berarti tidak ada operasi, yang memiliki
tidak berpengaruh pada keadaan prosesor selain incrementing program counter. Menyarankan
beberapa penggunaan dari instruksi ini.

 12.9 Dalam Bagian 12.4, dinyatakan bahwa kedua pergeseran aritmatika kiri dan pergeseran kiri logis sesuai dengan perkalian dengan 2 ketika tidak ada overflow, dan jika overflow terjadi,
aritmatika dan logis operasi pergeseran meninggalkan menghasilkan hasil yang berbeda, tapi aritmetik pergeseran kiri mempertahankan tanda nomor. Menunjukkan bahwa pernyataan ini benar
untuk 5-bit berpasangan melengkapi bilangan bulat.

 12.10 Dalam hal apa yang nomor bulat menggunakan shift kanan aritmatika (misalnya, putaran arah +?, putaran ke - ?, menuju nol, jauh dari 0)?

 12.11 Misalkan tumpukan akan digunakan oleh prosesor untuk mengatur panggilan prosedur dan kembali. Dapat program counter dihilangkan dengan menggunakan bagian atas tumpukan sebagai program melawan?

 12.12 Arsitektur x86 termasuk instruksi disebut Decimal Adjust setelah Penambahan (DAA). DAA melakukan urutan berikut petunjuk:

if ((AL DAN 0Fh)> 9) OR (AF = 1) maka
AL d AL + 6;
AF d 1;
lain
AF d 0;
berakhir jika;
jika (AL> 9FH) OR (CF = 1) maka
AL d AL + 60H;
CF d 1;
lain
CF d 0;

berakhir jika. "H" menunjukkan heksadesimal. AL adalah 8-bit register yang menyimpan hasil penambahan dua 8-bit unsigned integer. AF bendera diatur jika ada carry dari bit 3 ke bit 4 di
Hasil tambahan. CF adalah bendera diatur jika ada carry dari bit 7 sampai bit 8. Jelaskan
fungsi yang dilakukan oleh instruksi DAA.

  12.13 The x86 Bandingkan instruksi (CMP) mengurangi operan sumber dari tujuan
operan; itu update status flag (C, P, A, Z, S, O) tapi tidak mengubah salah satu dari
operan. CMP instruksi dapat digunakan untuk menentukan apakah operan tujuan
lebih besar dari, sama dengan, atau kurang dari sumber operan.

a. Misalkan dua operan diperlakukan sebagai unsigned integer. Tampilkan yang statusnya
bendera relevan untuk menentukan ukuran relatif dari dua bilangan bulat dan nilai-nilai apa
bendera sesuai dengan yang lebih besar dari, sama dengan, atau kurang dari.

b. Misalkan dua operan diperlakukan sebagai berpasangan melengkapi bilangan bulat ditandatangani.
Tampilkan yang flag status relevan untuk menentukan ukuran relatif dari
dua bilangan bulat dan nilai-nilai dari bendera apa yang sesuai dengan lebih besar dari, sama dengan,
atau kurang dari.

c. CMP instruksi dapat diikuti oleh Jump bersyarat (Jcc) atau Set Kondisi
(SETcc) instruksi, di mana cc mengacu salah satu dari 16 kondisi yang tercantum
pada Tabel 12.12. Menunjukkan bahwa kondisi diuji untuk nomor ditandatangani
perbandingan yang benar.

 12.14 Misalkan kita ingin menerapkan x86 CMP instruksi untuk operan 32-bit yang berisi
nomor dalam format floating-point. Untuk hasil yang benar, apa persyaratan memiliki
harus dipenuhi dalam bidang berikut?
a. Posisi relatif dari bidang significand, tanda, dan eksponen.
b. Representasi dari nilai nol.
c. Representasi dari eksponen.
d. Apakah format IEEE memenuhi persyaratan ini? Menjelaskan.

 12.15 Banyak instruksi mikroprosesor set termasuk instruksi yang menguji kondisi
dan menetapkan operan tujuan jika kondisi benar. Contoh termasuk SETcc yang
pada x86, yang Scc pada MC68000 Motorola, dan Scond di National
NS32000.
a. Ada beberapa perbedaan antara petunjuk ini:

• SETcc dan Scc beroperasi hanya pada byte, sedangkan Scond beroperasi pada byte, kata,
dan doubleword operan.
• SETcc dan Scond mengatur operan ke integer satu jika benar dan nol jika palsu. Scc
set byte untuk semua orang biner jika benar dan semua nol jika palsu.
Apa keuntungan relatif dan kerugian dari perbedaan ini?

b. Tak satu pun dari petunjuk ini mengatur salah satu bendera kode kondisi, dan dengan demikian eksplisit uji hasil instruksi yang diperlukan untuk menentukan nilainya. Membahas
apakah kode kondisi harus ditetapkan sebagai hasil dari instruksi ini.

c. Sebuah sederhana IF pernyataan seperti IF 7 b THEN dapat diimplementasikan menggunakan
Metode representasi numerik, yaitu, membuat nilai Boolean manifest,
sebagai lawan dari aliran metode kontrol, yang mewakili nilai Boolean sebuah ekspresi dengan titik dicapai dalam program ini. Sebuah compiler mungkin menerapkan IF 7 ssb YANG dengan kode x86 berikut:

SUB CX, CX; mengatur daftar CX ke 0
MOV AX, B, memindahkan isi dari lokasi B untuk mendaftar AX
CMP AX, A; bandingkan isi register AX dan lokasi A
Jle UJI; lompat jika A ... B
INC CX; tambahkan 1 ke isi register CX
UJI JCXZ OUT; melompat jika isi CX sama 0
KEMUDIAN OUT
Hasil (A 7 B) adalah nilai Boolean diadakan di register dan tersedia di kemudian hari,
luar konteks aliran kode hanya ditampilkan. Hal ini nyaman untuk digunakan mendaftar
CX untuk ini, karena banyak cabang dan loop opcodes memiliki tes built-in untuk CX.

Tampilkan implementasi alternatif menggunakan instruksi SETcc yang menyelamatkan
memori dan waktu eksekusi. (Petunjuk: Tidak ada instruksi x86 baru tambahan yang diperlukan,
selain SETcc itu.)

d. Sekarang perhatikan pernyataan bahasa tingkat tinggi:

A: = (B 7 C) OR (D = F)
Sebuah compiler mungkin menghasilkan kode berikut:
MOV EAX, B, memindahkan isi dari lokasi B untuk mendaftar EAX
CMP EAX, C; bandingkan isi register EAX dan lokasi C
MOV BL, 0; 0 mewakili palsu
Jle N1; lompat jika (B ... C)
MOV BL, 1; 1 merupakan salah
N1 MOV EAX, D
CMP EAX, F
MOV BH, 0
JNE N2
MOV BH, 1
N2 OR BL, BH

Tampilkan implementasi alternatif menggunakan instruksi SETcc yang menyelamatkan memori
dan waktu eksekusi.

 12.16 Misalkan dua register mengandung nilai-nilai heksadesimal berikut: AB0890C2,
4598EE50. Apa hasil dari menambahkan mereka menggunakan instruksi MMX:
a. untuk byte dikemas
b. untuk kata dikemas
Asumsikan saturasi aritmatika tidak digunakan.

 12.17 Lampiran O menunjukkan bahwa tidak ada petunjuk tumpukan berorientasi dalam set instruksi
jika stack akan digunakan hanya oleh prosesor untuk tujuan seperti penanganan prosedur. Bagaimana prosesor dapat menggunakan tumpukan untuk tujuan apapun tanpa petunjuk tumpukan berorientasi?

 12.18 Mengkonversi rumus berikut dari terbalik Polandia untuk infiks:
a. AB + C + D *
b. AB / CD / +
c. ABCDE + ** /
d. ABCDE + F / + G - H / * +

12.19 Mengkonversi rumus berikut dari infiks untuk membalikkan Polandia:
a. A + B + C + D + E
b. (A + B) * (C + D) + E
c. (A * B) + (C D *) + E
d. (ABCD EFGH

12.20 Mengkonversi ekspresi A + B - C untuk notasi postfix menggunakan algoritma Dijkstra.
Menunjukkan langkah-langkah yang terlibat. Apakah hasilnya setara dengan (A + B) - C atau A + (B - C)? Apakah itu penting?

 12.21 Menggunakan algoritma untuk mengkonversi infiks untuk postfix didefinisikan dalam Lampiran O, menunjukkan
langkah yang terlibat dalam mengkonversi ekspresi Gambar O.3 ke postfix. Gunakan presentasi
mirip dengan Gambar O.5.

 12,22 Tampilkan perhitungan ekspresi pada Gambar O.5, menggunakan presentasi yang mirip dengan Gambar O.4.

 12.23 Gambar ulang tata letak little-endian pada Gambar 12.13 sehingga byte muncul sebagai bernomor dalam tata letak big-endian. Artinya, acara memori 64-bit baris, dengan byte terdaftar kiri
ke kanan, atas ke bawah.

 12.24 Untuk struktur data sebagai berikut, menggambar layout besar-endian dan little-endian, menggunakan
format Gambar 12.13, dan komentar pada hasil.

a. struct {
 ganda i; // 0x1112131415161718
 } S1;
b. struct {
 int i; // 0x11121314
 int j; // 0x15161718
 } S2;
c. struct {
 i singkat; // 0x1112
 j singkat; // 0x1314
 k singkat; // 0x1516
 l singkat; // 0x1718
 } S3;

 12.25 The IBM Power arsitektur spesifikasi tidak mendikte bagaimana prosesor harus menerapkan
modus little-endian. Ini menentukan hanya pandangan memori prosesor harus memiliki
ketika beroperasi dalam mode little-endian. Ketika mengkonversi struktur data dari big endian
untuk little endian, prosesor bebas untuk menerapkan mekanisme byte-swapping benar atau untuk
menggunakan semacam mekanisme modifikasi alamat. prosesor Daya saat ini adalah semua
bawaan mesin big-endian dan menggunakan modifikasi alamat untuk memperlakukan data sebagai little-endian. Mempertimbangkan struktur s didefinisikan pada Gambar 12.13. Tata letak di kanan bawah porsi angka menunjukkan struktur s seperti yang terlihat oleh prosesor. Bahkan, jika struktur
dikompilasi dalam mode little-endian, tata letak dalam memori ditunjukkan pada Gambar 12.12. Menjelaskan pemetaan yang terlibat, menjelaskan cara mudah untuk menerapkan pemetaan, dan mendiskusikan efektivitas pendekatan ini.

 12.26 Tulis program kecil untuk menentukan endianness dari mesin dan melaporkan hasil.
Menjalankan program pada komputer yang tersedia untuk Anda dan menyerahkan output.

 12.27 The MIPS prosesor dapat diatur untuk beroperasi baik big-endian atau mode little-endian.
Mempertimbangkan beban Byte Unsigned (LBU) instruksi, yang memuat byte dari memori
ke dalam orde rendah 8 bit register dan mengisi high-order 24 bit register
dengan nol. Deskripsi LBU diberikan dalam manual MIPS referensi menggunakan
daftar transfer bahasa sebagai
mem d LoadMemory (...)
byte d VirtualAddress1..0
jika KONDISI kemudian

 GPR [rt] d 024} mem31 - 8 * byte .. 24-8 * byte

lain

 GPR [rt] d 024} mem7 + 8 * byte .. 8 * byte

berakhir jika
di mana byte mengacu pada dua low-order bit dari alamat efektif dan mem mengacu
dengan nilai diambil dari memori. Dalam manual, bukan KONDISI kata,
salah satu dari dua kata berikut digunakan: BigEndian, LittleEndian. Yang kata digunakan?

 12.28 Sebagian besar, tapi tidak semua, prosesor menggunakan besar- atau little-endian bit memesan dalam byte yang konsisten dengan memesan besar- atau little-endian byte dalam skalar multibyte. Mari kita mempertimbangkan Motorola 68030, yang menggunakan big-endian byte pemesanan. Dokumentasi



yang 68.030 mengenai format membingungkan. panduan pengguna menjelaskan bahwa bit yang memesan bidang bit adalah kebalikan dari bit pemesanan bilangan bulat. Sebagian besar operasi bit bidang mengoperasikan dengan satu memesan endian, tetapi lapangan beberapa bit operasi membutuhkan pemesanan berlawanan. Itu berikut penjelasan dari manual pengguna menjelaskan sebagian besar operasi bit bidang:

Sebuah operan bit ditentukan oleh alamat dasar yang memilih satu byte dalam memori
(Basis byte), dan sejumlah bit yang memilih satu bit dalam byte ini. Itu
paling sedikit signifikan sedikit tujuh. Sebuah operan bit bidang ditentukan oleh: (1) basis
 alamat yang memilih satu byte dalam memori; (2) bidang bit offset yang menunjukkan
yang paling kiri (base) sedikit bidang bit dalam kaitannya dengan bit yang paling signifikan dari
dasar byte; dan (3) lebar lapangan sedikit yang menentukan berapa banyak bit ke
hak dasar byte di bidang bit. Bit yang paling signifikan dari dasar
bidang bit byte adalah offset 0, bit paling signifikan dari dasar byte adalah bit lapangan
mengimbangi 7.
Apakah petunjuk ini menggunakan big-endian atau little-endian bit pemesanan?


Lampiran 12A sedikit-, besar-, Dan BI-endian

Sebuah fenomena yang mengganggu dan ingin tahu berkaitan dengan bagaimana byte dalam kata dan
bit dalam byte keduanya dirujuk dan mewakili. Kita melihat pertama pada masalah dari byte pemesanan dan kemudian menganggap bahwa bit.

Urutan Byte

Konsep endianness pertama kali dibahas dalam literatur oleh Cohen [COHE81].
Sehubungan dengan byte, endianness harus dilakukan dengan urutan byte dari skalar multibyte
nilai-nilai. Isu ini terbaik diperkenalkan dengan sebuah contoh. Misalkan kita memiliki 32-bit
nilai heksadesimal 12345678 dan bahwa itu disimpan dalam sebuah kata 32-bit dalam byte-addressable memori di lokasi byte 184. Nilai ini terdiri dari 4 byte, dengan paling signifikan
byte yang berisi nilai 78 dan byte paling signifikan yang mengandung nilai 12.

Ada dua cara yang jelas untuk menyimpan nilai ini:

Pemetaan di sebelah kiri menyimpan byte paling signifikan dalam byte numerik terendah
alamat; ini dikenal sebagai endian besar dan setara dengan urutan dari kiri ke kanan penulisan
dalam bahasa budaya Barat. Pemetaan di toko sebelah kanan byte paling signifikan
di alamat byte numerik terendah; ini dikenal sebagai little endian dan mengingatkan
urutan yang benar-ke-kiri dari operasi aritmatika dalam aritmatika units. 3 Untuk multibyte diberikan
nilai skalar, endian besar dan kecil endian adalah pemetaan byte-terbalik satu sama lain.

Konsep endianness muncul jika diperlukan untuk mengobati multiple-byte
entitas sebagai item data tunggal dengan satu alamat, meskipun terdiri dari
unit beralamat lebih kecil. Beberapa mesin, seperti Intel 80x86, x86, VAX, dan
Alpha, adalah mesin little-endian, sedangkan yang lain, seperti IBM System 370/390,
Motorola 680x0, Sun SPARC, dan sebagian besar mesin RISC, yang endian besar. Ini
menyajikan masalah ketika data ditransfer dari mesin dari satu jenis endian untuk
yang lain dan ketika programmer mencoba untuk memanipulasi byte individu atau bit
dalam skalar multibyte.
Milik endianness tidak melampaui unit data individu. Dalam setiap mesin, agregat seperti file, struktur data, dan array terdiri dari beberapa unit data, masing-masing dengan endianness. Dengan demikian, konversi blok memori dari satu gaya endianness ke yang lain membutuhkan pengetahuan tentang struktur data. Gambar 12.13 menggambarkan bagaimana endianness menentukan pengalamatan dan byte memesan. Struktur C di atas berisi sejumlah tipe data. Ingatan
tata letak dalam hasil kiri bawah dari kompilasi struktur yang untuk big-endian mesin, dan bahwa di kanan bawah untuk mesin little-endian. Dalam setiap kasus, memori digambarkan sebagai rangkaian 64-bit baris. Untuk kasus big-endian, memori biasanya adalah dilihat dari kiri ke kanan, atas ke bawah, sedangkan untuk kasus little-endian, memori biasanya dipandang sebagai kanan ke kiri, atas ke bawah. Perhatikan bahwa layout ini sewenang-wenang.
Entah skema bisa menggunakan salah kiri ke kanan atau kanan ke kiri dalam satu baris; ini
adalah masalah penggambaran, bukan tugas memori. Bahkan, dalam memandang programmer
manual untuk berbagai mesin, koleksi membingungkan penggambaran adalah menjadi
ditemukan, bahkan di dalam manual yang sama.

Kita bisa membuat beberapa pengamatan tentang struktur data ini:

  • Setiap item data memiliki alamat yang sama di kedua skema. Sebagai contoh,
  alamat doubleword dengan nilai heksadesimal 2122232425262728 adalah 08.
  • Dalam setiap diberikan nilai skalar multibyte, urutan byte di littleendian yang
Struktur adalah kebalikan dari yang untuk struktur besar-endian.
  • Endianness tidak mempengaruhi urutan item data dalam struktur. Demikian,
kata empat karakter c pameran byte reversal, tapi byte tujuh karakter
Array d tidak. Oleh karena itu, alamat setiap elemen individu d adalah
sama di kedua struktur.

Pengaruh endianness yang mungkin lebih jelas ditunjukkan ketika kita melihat
memori sebagai array vertikal byte, seperti yang ditunjukkan pada Gambar 12.14.


Tidak ada konsensus umum untuk yang gaya unggul endianness.4
Poin-poin berikut mendukung gaya big-endian:

 • Karakter-string menyortir: Sebuah prosesor big-endian lebih cepat di bandingkan integeraligned
karakter string; integer ALU dapat membandingkan beberapa byte secara paralel.
 • Decimal / IRA kesedihan: Semua nilai dapat dicetak kiri ke kanan tanpa menyebabkan
kebingungan.
 • Agar Konsisten: prosesor Big-endian menyimpan bilangan bulat dan karakter mereka
string dalam urutan yang sama (paling signifikan byte yang lebih dulu).

Poin-poin berikut mendukung gaya little-endian:
 • Sebuah prosesor big-endian harus melakukan penambahan ketika mengkonversi integer 32-bit
alamat ke alamat bilangan bulat 16-bit, untuk menggunakan byte paling signifikan.
 • Lebih mudah untuk melakukan yang lebih tinggi-presisi aritmatika dengan gaya little-endian;
Anda tidak perlu menemukan byte paling signifikan dan bergerak mundur.
Perbedaan yang kecil dan pilihan gaya endian sering lebih suatu hal menampung mesin sebelumnya dari apa pun.

PowerPC adalah prosesor bi-endian yang mendukung baik besar-endian dan
mode little-endian. Arsitektur bi-endian memungkinkan pengembang perangkat lunak untuk
memilih mode baik ketika melakukan migrasi sistem operasi dan aplikasi dari lainnya
mesin. Sistem operasi menetapkan modus endian di mana proses menjalankan. Setelah modus yang dipilih, semua beban memori berikutnya dan toko ditentukan dengan model memori-menangani mode itu. Untuk mendukung perangkat ini fitur, 2 bit diselenggarakan dalam keadaan mesin register (MSR) dikelola oleh sistem operasi sebagai bagian dari negara proses. Satu bit menentukan modus endian di mana kernel berjalan; yang lain menentukan modus operasi prosesor saat ini.
Dengan demikian, modus dapat diubah pada basis per-proses.
bit Pemesanan Dalam memesan bit dalam byte, kita langsung dihadapkan pada dua pertanyaan:

 1. Apakah Anda menghitung bit pertama sebagai bit nol atau sebagai bit satu?
 2. Apakah Anda menetapkan jumlah bit terendah untuk bit paling signifikan byte ini (sedikit
endian) atau byte bit paling signifikan (big endian)?

Pertanyaan-pertanyaan ini tidak dijawab dengan cara yang sama pada semua mesin. Memang, pada
beberapa mesin, jawaban yang berbeda dalam situasi yang berbeda. Selanjutnya, pilihan besar- atau little-endian bit memesan dalam byte tidak selalu konsisten dengan memesan besar- atau little-endian byte dalam skalar multibyte. programmer perlu peduli dengan isu-isu ini ketika memanipulasi bit individual. Bidang lain yang menjadi perhatian adalah ketika data yang ditransmisikan melalui jalur bit-serial. Ketika sebuah byte individu ditransmisikan, apakah sistem mengirimkan paling signifikan bit pertama atau bit paling signifikan pertama? perancang harus memastikan bahwa bit masuk akan ditangani dengan baik. Untuk pembahasan tentang masalah ini, lihat [JAME90].