Apakah assembler pertama ditulis dalam kode mesin?

41

Saya membaca buku The Elements of Computing Systems: Membangun Komputer Modern dari Prinsip Pertama , yang memuat proyek-proyek yang mencakup pembuatan komputer dari gerbang boolean hingga aplikasi tingkat tinggi (dalam urutan itu). Proyek saat ini yang sedang saya kerjakan adalah menulis assembler menggunakan bahasa tingkat tinggi pilihan saya, untuk menerjemahkan dari kode perakitan Hack ke kode mesin Hack (Hack adalah nama platform perangkat keras yang dibangun pada bab-bab sebelumnya). Walaupun semua perangkat keras telah dibangun dalam sebuah simulator, saya telah mencoba untuk berpura-pura bahwa saya benar-benar membangun setiap level hanya menggunakan alat yang tersedia untuk saya pada saat itu dalam proses nyata.

Yang mengatakan, itu membuat saya berpikir. Menggunakan bahasa tingkat tinggi untuk menulis assembler saya memang mudah, tetapi untuk assembler pertama yang pernah ditulis (yaitu dalam sejarah), tidakkah perlu ditulis dalam kode mesin, karena hanya itu yang ada pada saat itu?

Dan pertanyaan yang berhubungan ... bagaimana dengan hari ini? Jika arsitektur CPU baru keluar, dengan set instruksi baru, dan sintaks perakitan baru, bagaimana assembler akan dibangun? Saya berasumsi Anda masih bisa menggunakan bahasa tingkat tinggi yang ada untuk menghasilkan binari untuk program assembler, karena jika Anda tahu sintaks dari bahasa assembly dan mesin untuk platform baru Anda, maka tugas menulis assembler sebenarnya hanyalah sebuah tugas analisis teks dan secara inheren tidak terkait dengan platform itu (yaitu perlu ditulis dalam bahasa mesin platform itu) ... yang merupakan alasan saya dapat "menipu" saat menulis peretas Hack saya pada tahun 2012, dan menggunakan beberapa yang sudah ada sebelumnya bahasa tingkat tinggi untuk membantu saya.

The111
sumber
17
Anda selalu dapat menulis kompiler silang dan menggunakannya untuk menghasilkan kode untuk perangkat keras baru saat ini.
Kerrek SB
@PersonalNexus Terima kasih untuk itu, sunting snafu pada bagian saya.
yannis
1
@YannisRizos Tidak masalah, terjadi pada yang terbaik dari kita :)
PersonalNexus
8
Ada kemungkinan bahwa assembler pertama mungkin telah ditulis secara majelis di selembar kertas. Konversi ke kode mesin kemudian mungkin masih dilakukan di atas kertas dan dibakar ke semacam ROM dengan sakelar, satu kata setiap kali.
mouviciel
Komputer pertama saya adalah ZX81, dengan RAM 1KB, jadi program kode mesin saya (sebenarnya pendek) sebenarnya diterjemahkan secara manual.
user281377

Jawaban:

36

untuk assembler pertama yang pernah ditulis (yaitu dalam sejarah), bukankah itu harus ditulis dalam kode mesin

Belum tentu. Tentu saja versi pertama dari assembler harus ditulis dalam kode mesin, tetapi tidak cukup kuat untuk disebut assembler. Itu tidak akan mendukung bahkan setengah fitur assembler "nyata", tetapi itu akan cukup untuk menulis versi berikutnya dari dirinya sendiri. Kemudian Anda bisa menulis ulang v0.00 di subset dari bahasa assembly, sebut saja v0.01, gunakan untuk membangun set fitur berikutnya assembler v0.02 Anda, kemudian gunakan v0.02 untuk membangun v0.03, dan seterusnya, sampai Anda mencapai v1.00. Akibatnya, hanya versi pertama yang akan berada dalam kode mesin; versi pertama yang dirilis akan dalam bahasa assembly.

Saya telah mem-boot pengembangan kompiler bahasa template menggunakan trik ini. Versi awal saya menggunakan printfpernyataan, tetapi versi pertama yang saya gunakan di perusahaan saya menggunakan prosesor template yang sedang diproses. Fase bootstrap berlangsung kurang dari empat jam: begitu prosesor saya dapat menghasilkan output yang hampir tidak berguna, saya menulis ulang dalam bahasanya sendiri, mengkompilasi, dan membuang versi non-templated.

dasblinkenlight
sumber
4
Apakah Anda masih memiliki semua fase? Saya akan senang melihat mereka, dan membandingkannya dengan satu sama lain. Hanya untuk merasakan proses yang Anda lalui.
Marjan Venema
3
@ Marsjanen Tidak, saya tidak memilikinya lagi - saya membangunnya pada tahun 1998, dan terus menggunakannya sampai tahun 2005, ketika saya menemukan StringTemplate . Saya menimpa fase sebelumnya dengan yang berikutnya saat saya sedang mengerjakan versi yang dapat digunakan awal. Siklus pengembangan saya terdiri dari pengkodean hal-hal baru, menjalankan pembuat kode untuk membangun dirinya sendiri di direktori yang terpisah, berjalan diffmelawan pembuat kode saat ini untuk melihat bahwa bagian kode yang dihasilkan tidak berubah dengan cara yang tidak terduga, mengganti kode di tempat, dan menjalankannya sekali lagi untuk menyelesaikan siklus.
dasblinkenlight
Kasihan tapi bisa dimengerti :) Terima kasih untuk menggambarkan apa yang Anda lakukan (dan untuk tautannya).
Marjan Venema
3
Saya pikir Anda perlu menyimpan semacam rantai bootstrap. Kode Mesin => ASM Terbatas => ASM Lengkap => Beberapa Bahasa. Kalau tidak, jika Anda kehilangan biner Anda langkah apa pun di sepanjang jalan Anda akan kacau. (Secara bergantian Anda dapat memiliki versi kompilasi silang C, karena secara realistis tidak semua binari kompiler C akan hilang sekaligus.)
edA-qa mort-ora-y
3
Satu-satunya "fitur" yang diperlukan assembler untuk menjadi assembler "nyata" adalah assemble.
Miles Rout
23

Menurut Wikipedia, bahasa assembler / assembly pertama kali diimplementasikan untuk IBM 701 oleh Nathaniel Rochester . (Tanggal-tanggalnya agak tidak pasti dari artikel Wikipedia. Ini menyatakan bahwa Rochester bergabung dengan IBM pada tahun 1948, tetapi halaman Wikipedia lain menyatakan bahwa 701 diumumkan secara publik pada tahun 1952. Dan halaman IBM ini menyatakan bahwa "[a] desain virtual dimulai pada bulan Februari). 1, 1951 dan selesai setahun kemudian " .)

Namun "Assemblers and Loaders" oleh David Salomon menyatakan (di halaman 7) bahwa EDSAC juga memiliki assembler:

"Salah satu komputer program yang tersimpan pertama adalah EDSAC (Electronic Delay Storage Automatic Calculator) yang dikembangkan di Universitas Cambridge pada tahun 1949 oleh Maurice Wilkes dan W. Renwick. Dari hari-hari pertama EDSAC memiliki assembler, yang disebut Initial Orders. Ini diterapkan dalam memori read-only dibentuk dari satu set pemilih rotari telepon, dan itu menerima instruksi simbolik.Setiap instruksi terdiri dari satu huruf mnemonik, alamat desimal, dan bidang ketiga yang merupakan huruf. Field ketiga menyebabkan salah satu dari 12 konstanta yang telah ditetapkan oleh programmer untuk ditambahkan ke alamat pada waktu perakitan. " (Referensi dihilangkan ... lihat yang asli.)

Dengan asumsi kita menerima bahwa "Pesanan Initial" diutamakan, kita memiliki bukti yang jelas bahwa assembler pertama itu dilaksanakan dalam kode mesin.

Pola ini (menulis perakit awal dalam kode mesin) akan menjadi norma hingga 1950-an. Namun, menurut Wikipedia , "[a] ssembler adalah alat bahasa pertama yang melakukan bootstrap sendiri". Lihat juga bagian ini yang menjelaskan bagaimana kode mesin tertulis assembler primordial digunakan untuk mem-bootstrap assembler yang lebih maju yang dikodekan dalam bahasa assembly.

Saat ini assembler dan kompiler ditulis dalam bahasa tingkat yang lebih tinggi, dan assembler atau kompiler untuk arsitektur mesin baru biasanya dikembangkan pada arsitektur yang berbeda dan dikompilasi silang.

(FWIW - menulis dan men-debug program-program non-sepele dalam kode mesin adalah proses yang sangat melelahkan. Seseorang yang mengembangkan assembler dalam kode mesin kemungkinan besar akan bootstrap ke assembler yang ditulis dalam assembler secepat mungkin.)

Halaman Wikipedia ini tentang kompilasi dan perakit bootstrap patut dibaca ... jika ini semua membingungkan Anda.

Stephen C
sumber
Terpilih untuk benar-benar menjawab daripada hanya menebak. Ini bacaan yang sangat menarik!
JacquesB
14

Saya berasumsi bahwa assembler pertama ditulis dalam kode mesin, karena seperti yang Anda katakan, tidak ada lagi yang tersedia saat itu.

Namun hari ini, ketika arsitektur CPU baru keluar, kami menggunakan apa yang dikenal sebagai Cross-Compiler , yang merupakan kompiler yang menghasilkan kode mesin bukan untuk arsitektur yang digunakannya, tetapi untuk arsitektur yang berbeda.

(Sebenarnya, karena saya yakin Anda akan mengetahui nanti dalam buku yang sedang Anda baca, sama sekali tidak ada yang membuat kompiler lebih cocok untuk menghasilkan kode mesin untuk arsitektur yang menjalankannya daripada pada sembarang arsitektur lain. Hanya masalah arsitektur mana yang akan Anda targetkan, sebagai pencipta kompiler.)

Jadi, hari ini bahkan dimungkinkan (setidaknya secara teori) untuk membuat arsitektur baru dan memiliki kompiler bahasa tingkat tinggi yang berjalan secara native (dikompilasi pada arsitektur lain menggunakan kompiler silang) sebelum Anda bahkan memiliki assembler untuk arsitektur tersebut.

Mike Nakis
sumber
12

Pada awalnya, "assembly" ditulis di atas kertas dan kemudian secara manual "dikompilasi" ke kartu punch.

Kakek saya bekerja dengan ZRA1 (maaf, halaman hanya ada dalam bahasa Jerman, tetapi terjemahan Google tidak apa-apa sampai Anda benar-benar dapat mengambil fakta yang paling penting: D).
Modus operandi adalah menuliskan kode Anda di atas kertas dalam semacam bahasa rakitan dan sekretaris akan benar-benar melakukan transkripsi ke kartu punch, kemudian meneruskannya ke operator dan hasilnya akan diserahkan kembali keesokan paginya.

Semua ini pada dasarnya sebelum pemrogram memiliki kemewahan memasukkan data melalui keyboard dan melihatnya di layar.

back2dos
sumber
3
Ketika saya belajar di universitas, mereka masih memiliki balok kertas yang digunakan untuk menulis kode mesin. Anda menulis program di sebelah kanan, ada kolom di sebelah kiri untuk menerjemahkan instruksi ke heksadesimal. Dan kolom untuk alamat saat ini. Perakit pertama sebenarnya manusia.
Florian F
9

Sulit untuk memastikan tentang sangat assembler pertama (sulit bahkan mendefinisikan apa itu). Bertahun-tahun yang lalu, ketika saya menulis beberapa assembler untuk mesin yang tidak memiliki assembler, saya masih menulis kode dalam bahasa assembly. Kemudian, setelah saya memiliki bagian kode yang cukup lengkap saya menerjemahkannya ke dalam kode mesin dengan tangan. Itu masih dua fase yang sepenuhnya terpisah - ketika saya menulis kode, saya tidak bekerja atau berpikir pada tingkat kode mesin sama sekali.

Saya harus menambahkan bahwa dalam beberapa kasus, saya melangkah lebih jauh: Saya menulis sebagian besar kode dalam bahasa assembly yang saya temukan lebih mudah digunakan, kemudian menulis sebuah kernel kecil (kurang lebih apa yang sekarang kita sebut mesin virtual) untuk menafsirkan bahwa pada prosesor target. Itu sangat lambat (terutama pada prosesor 1 MHz, 8-bit), tapi itu tidak masalah, karena biasanya hanya berjalan sekali (atau paling banyak, beberapa kali).

Jerry Coffin
sumber
8

Anda tidak perlu assembler untuk merakit tangan kode bahasa assembly ke dalam kode mesin. Sama seperti Anda tidak memerlukan editor untuk menulis kode bahasa majelis.

Perspektif sejarah

Assembler pertama mungkin ditulis dalam bahasa assembly dan kemudian dirakit dengan tangan ke dalam kode mesin. Bahkan jika prosesor tidak memiliki 'bahasa assembly' resmi maka programmer mungkin melakukan sebagian besar pekerjaan pemrograman menggunakan beberapa jenis kode semu sebelum menerjemahkan kode itu ke dalam instruksi mesin.

Bahkan di hari-hari awal komputasi , programmer menulis program dalam semacam notasi simbolik dan diterjemahkan ke dalam kode mesin sebelum makan ke dalam komputer mereka. Dalam hal Augusta Ada King, ia akan diperlukan untuk menerjemahkannya ke dalam kartu menekan untuk Babbage 's Analytical Engine , tapi sayangnya itu tidak pernah dibangun.

Pengalaman pribadi

Komputer pertama yang saya miliki adalah Sinclair ZX81 (Timex 1000 di AS). Bagian belakang manual memiliki semua informasi yang Anda butuhkan untuk menerjemahkan bahasa assembly Z80 ke dalam kode mesin (bahkan memasukkan semua mode indeks aneh opcode yang dimiliki Z80).

Saya akan menulis sebuah program (di atas kertas) dalam bahasa assembly dan jalankan-kering melalui kode. Ketika saya senang bahwa program saya bebas bug, saya akan mencari setiap instruksi di bagian belakang manual, menerjemahkannya ke dalam kode mesin dan menuliskan kode mesin di atas kertas juga. Akhirnya saya mengetik semua instruksi kode mesin ke ZX81 saya sebelum menyimpannya ke tape dan mencoba menjalankannya.

Jika tidak berhasil, saya akan memeriksa rakitan tangan saya dan jika ada terjemahan yang salah saya akan menambal byte yang dimuat dari tape sebelum menyimpannya kembali dan mencoba lagi untuk menjalankan program.

Dari pengalaman, saya dapat memberitahu Anda bahwa jauh lebih mudah untuk men-debug kode Anda jika ditulis dalam bahasa assembly daripada dalam kode mesin - karenanya popularitas disassembler. Bahkan jika Anda tidak memiliki assembler, perakitan tangan lebih sedikit kesalahan daripada mencoba untuk menulis kode mesin secara langsung, meskipun saya kira Programmer nyata seperti Mel mungkin tidak setuju. * 8 ')

Mark Booth
sumber
5

Tidak ada perbedaan dulu atau sekarang. Anda ingin menciptakan bahasa pemrograman baru, Anda memilih salah satu bahasa yang tersedia untuk Anda hari ini untuk membuat kompiler pertama. selama beberapa periode waktu, jika itu adalah tujuan dari proyek, Anda membuat kompiler dalam bahasa itu dan kemudian dapat menjadi tuan rumah sendiri.

Jika yang Anda miliki hanyalah pensil dan kertas dan beberapa sakelar atau kartu punch sebagai antarmuka pengguna Anda ke set instruksi baru pertama atau berikutnya, Anda menggunakan satu atau semua item yang tersedia untuk Anda. Anda bisa saja menulis bahasa assembly, di atas kertas, dan kemudian menggunakan assembler, Anda, untuk mengubahnya menjadi kode mesin, mungkin dalam oktal, kemudian di beberapa titik yang masuk ke antarmuka ke mesin.

Ketika set instruksi baru ditemukan hari ini, tidak berbeda, tergantung pada perusahaan / individu, praktik, dll. Sangat mungkin bahwa insinyur perangkat keras mungkin pemrograman dalam Verilog atau VHD, menulis beberapa program pengujian pertama dengan tangan di kode mesin (mungkin dalam hex atau biner). tergantung pada kemajuan tim perangkat lunak mereka mungkin sangat cepat atau tidak untuk waktu yang sangat lama beralih ke bahasa assembly dan kemudian kompiler.

Mesin komputasi pertama bukanlah mesin keperluan umum yang dapat Anda gunakan untuk membuat perakit dan kompiler. Anda memprogramnya dengan memindahkan beberapa kabel antara output dari alu sebelumnya ke input berikutnya. Akhirnya Anda memiliki prosesor tujuan umum sehingga Anda bisa menulis assembler di assembly, merakitnya sendiri, memasukkannya ke dalam kode mesin, kemudian menggunakannya untuk mengurai ebcdic, ascii, dll. Dan kemudian host-sendiri. menyimpan biner ke beberapa media yang nantinya bisa Anda baca / muat tanpa harus terus membalik sakelar ke kode mesin umpan tangan.

Pikirkan kartu punch dan pita kertas. Alih-alih membalik saklar Anda pasti bisa membuat mesin yang sepenuhnya mekanis, perangkat hemat tenaga kerja, yang menciptakan media yang akan dibaca komputer. Alih-alih harus memasukkan bit kode mesin dengan sakelar seperti altair, Anda malah dapat memasukkan pita kertas atau kartu punch (menggunakan sesuatu yang mekanis, bukan prosesor yang digerakkan, yang mengumpankan memori atau prosesor, ATAU menggunakan kode mesin kecil boot loader tertulis). Ini bukan ide yang buruk karena Anda bisa membuat sesuatu, didorong oleh komputer yang juga bisa secara mekanis menghasilkan kaset kertas atau kartu punch, dan kemudian memberi makan mereka kembali. Dua sumber kartu punch, perangkat hemat tenaga kerja mekanik non-komputer berbasis , dan mesin yang digerakkan komputer. keduanya menghasilkan "binari" untuk komputer.

old_timer
sumber
1
+1 untuk komentar "assembler, you". Sangat mudah untuk dilampirkan ke satu definisi kata (yaitu assembler = software) tetapi komentar Anda benar-benar menempatkan kembali jelas ke dalam perspektif ... bahwa "proses perakitan" hanyalah sebuah sistem / rutin, yang dengan mudah dapat dilakukan oleh assembler manusia.
The111
1
juga orang-orang terus terjebak pada gagasan bahwa komputer awal memiliki set instruksi. Komputer awal adalah wanita dengan keterampilan matematika yang baik dengan pensil dan kertas, dan itulah yang mereka sebut, komputer. kemudian para wanita (atau yang khusus) memprogram eniac dengan menghubungkan kabel yang tidak menggunakan set instruksi. Pemrograman dengan set instruksi sudah berjalan baik. Ya, sangat mudah terjebak dalam penggunaan kata atau istilah seperti assembler atau komputer atau awal.
old_timer
4

Ada satu atau dua contoh di kebun binatang komputer Brook di mana ia mengatakan sesuatu seperti "mnemonik adalah penemuan kami, perancang hanya menggunakan opcode numerik atau karakter yang kodenya adalah opcode", jadi di mana mesin yang bahkan tidak ada bahasa campuran.

Memasuki program dan debugging di panel depan (bagi mereka yang belum melakukannya, itu adalah cara mengatur memori, Anda mengatur beberapa sakelar ke alamat, beberapa yang lain ke nilai dan menekan tombol, atau tombol lain untuk baca nilai) sudah umum jauh di kemudian hari. Beberapa timer tua menyombongkan diri bahwa mereka masih dapat memasukkan kode boot untuk mesin yang mereka gunakan secara luas.

Kesulitan menulis secara langsung kode mesin dan membaca program dari memory dump sangat tergantung pada bahasa mesin, beberapa dari mereka relatif mudah (bagian tersulit adalah melacak alamat), x86 adalah salah satu yang lebih buruk.

Pemrogram
sumber
Pdp-11 bahkan tidak memiliki tombol mewah. Anda dapat mengubah penyimpanan dengan memasukkan alamat biner pada 8 sakelar sakelar, dan, nilai pada sakelar sakelar 16 kemudian menekan tombol. Saya benar-benar melihat seseorang memperbaiki program perulangan dengan cara ini!
James Anderson
2

Saya membangun sebuah komputer pada tahun 1975. Komputer ini sangat canggih dibandingkan dengan Altair sezamannya, karena memiliki 'monitor rom' yang memungkinkan saya memasuki program dengan mengetikkan kode mesin dalam hex dan melihat kode ini pada monitor video, sedangkan dengan Altair setiap instruksi mesin harus dimasukkan sedikit pada waktu menggunakan deretan sakelar.

Jadi ya, pada hari-hari awal komputer dan sekali lagi pada hari-hari awal komputer pribadi orang memang menulis aplikasi dalam kode mesin.

Jim In Texas
sumber
2

Anekdot:

Ketika saya belajar bahasa assembly, di Apple] [, Ada program yang termasuk dalam ROM yang disebut micro-assembler. Itu terjemahan langsung instruksi perakitan ke byte, saat Anda memasukkannya. Ini berarti tidak ada label - jika Anda ingin melompat atau memuat, Anda harus menghitung sendiri offsetnya. Itu jauh lebih mudah daripada mencari tata letak instruksi dan memasukkan nilai hex.

Tidak diragukan lagi, assembler asli pertama kali ditulis menggunakan micro-assembler, atau beberapa lingkungan lain yang tidak cukup lengkap.

Sean McMillan
sumber