Apakah ini bahasa rakitan?

70

Di masa kecil saya, saya dulu memprogram kalkulator MK-61 Soviet . Itu memiliki empat register operasi (X, Y, Z, T) dan 15 register penyimpanan. Suatu program dapat memiliki 105 langkah.

Seingat saya, itu memiliki perintah seperti:

  • Swap register X dan Y
  • Menggeser register (Z ke T, Y ke Z, X ke Y)
  • Salin dari register penyimpanan (1..15) ke X
  • Salin dari X ke register penyimpanan (1..15)
  • Jika X <0 maka lanjutkan ke langkah program ##
  • Lakukan operasi (+, -, *, /) menggunakan nilai X dan Y dan berikan hasilnya ke X

Apakah perintah ini menetapkan bahasa rakitan? Apakah saya memiliki ide dasar bahasa rakitan dengan menggunakan perangkat ini?

Alat

Ternyata itu adalah sesuatu yang disebut "pemrograman keystroke" .

Fakta lucu: kalkulator serupa (seperti ini, tetapi dengan memori independen energi) digunakan sebagai perangkat keras cadangan untuk perhitungan lintasan misi luar angkasa pada tahun 1988. :-)

defhlt
sumber
Bagus! - gambar itu membawa kembali kenangan. Saya masih punya MK-52 saya di ruang bawah tanah di suatu tempat :)
DXM
Ini terlihat seperti tiruan Soviet dari HP 65. Ini mungkin diprogram dalam Notasi Polandia Mundur dengan operasi yang mendorong dan menarik tumpukan. Operator RPN hanya direkam dalam memori, dan ditafsirkan oleh apa yang mungkin setara dengan CPU 4004. Kode dalam ROM 4004 mungkin dikompilasi dari 4004 assembler, tetapi penekanan tombol benar-benar lebih mirip makro spreadsheet.
Meredith Poor

Jawaban:

13

Ini bukan bahasa rakitan, ini adalah bahasa mesin.

Bahasa mesin adalah segala sesuatu yang secara fisik berarti sesuatu bagi mesin. Dalam kasus komputer saku, itu adalah penekanan tombol, dikodekan ke dalam angka-angka di mesin. Anda tidak memberikan informasi lebih lanjut tentang mesin Electronika MK61 ini , jadi saya akan memberikan contoh TI-57 : bahasa mesin menggunakan jumlah kunci yang diberikan sebagai kolom dalam puluhan dan garis dalam unit. Jadi misalnya, program yang akan menambah memori 8 adalah:

33 8  57 1 58 23

Ini adalah bahasa mesin: itulah yang ditafsirkan secara langsung oleh mesin.

Bahasa majelis akan menjadi teks yang bisa dibaca manusia :

RCL 8 
+
1
=
STO 8

Untuk mengubah teks ini menjadi urutan kode mesin, Anda memerlukan assembler , yang bisa berupa program, atau manusia yang akan menerjemahkan teks itu ke dalam urutan angka.

Kerancuan sering dilakukan, karena sering ada terjemahan yang cukup langsung dari bahasa assembly ke bahasa mesin, tetapi ini tidak selalu merupakan terjemahan langsung sepenuhnya: assembler makro memiliki makro yang kuat yang dapat melakukan banyak pekerjaan di assembler dan menghasilkan banyak instruksi bahasa mesin dari satu instruksi perakitan. Terjemahan belaka dari alamat simbolis mungkin melibatkan pengubahan op-code dari instruksi cabang (misalnya, ketika beralih dari pengalamatan relatif pendek ke pengalamatan relatif lama atau absolut), jadi itu tidak selalu langsung seperti yang Anda pikirkan.

Pascal Bourguignon
sumber
36

Saya akan mengatakan bahwa jawaban untuk kedua bagian pertanyaan Anda adalah tidak: perintah kalkulator ini tidak seperti bahasa assembly, dan pemrograman kalkulator ini berbeda dari pemrograman dalam bahasa assembly.

"Bahasa" yang diprogram oleh kalkulator ini adalah level yang cukup rendah, tetapi masih merupakan abstraksi di atas konstruksi level yang lebih rendah yang tidak terlihat oleh Anda sebagai programmer. Saya menebak sedikit, tetapi dari deskripsi Anda, dan dari melihat keyboard (dan membandingkannya dengan kalkulator yang mirip dari Hewlett Packard atau Texas Instruments dari akhir 1970-an dan awal 1980-an) Saya akan mengatakan bahwa setiap program "langkah "tidak hanya bisa berupa operasi sederhana seperti" tambah "atau" tukar X & Y "tetapi juga operasi yang lebih kompleks seperti trigonometri, eksponensial, logaritma, dll. Masing-masing langkah ini mungkin dilaksanakan sebagai rutin internal mikrokodekan internal. Mikrokode itu mungkin diprogram dalam bahasa assembly, tapi saya rasa tidak '

Seperti yang telah dijelaskan orang lain, bahasa rakitan biasanya sangat dekat (jika tidak 1: 1) korespondensi dengan fasilitas mesin yang mendasarinya. Saya akan mengatakan bahwa pemrograman bahasa rakitan mencakup karakteristik berikut yang mungkin tidak ada dalam memprogram kalkulator ini.

  • Operasi termasuk operasi level yang lebih rendah seperti bitwise AND, OR, XOR, shifting; bilangan bulat dan (mungkin) floating point, pada berbagai ukuran data (misalnya presisi tunggal atau ganda); memuat / menyimpan berbagai ukuran (byte, halfword, word, dll.).

  • Operasi tingkat yang lebih tinggi (trigonometri, logaritma) biasanya merupakan panggilan subrutin, bukan instruksi. Ada beberapa pengecualian, seperti DEC VAX yang memiliki instruksi evaluasi polinomial. [Sunting: OP menunjukkan bahwa x87 juga memiliki fungsi trigonometri.]

  • Skema pengalamatan mesin terbuka. Jika ruang alamat tersegmentasi, Anda harus memuat alamat basis ke dalam register dan kemudian kode alamat atau data relatif terhadap register itu. Bahkan dengan ruang alamat datar, Anda mengetahui alamat dan aritmatika alamat. Biasanya assembler memungkinkan pemrogram untuk menggunakan label untuk menunjukkan alamat. Tetapi jika suatu alamat berada di segmen yang berbeda, Anda mungkin harus memuat register segmen sebelum dapat mencapainya.

  • Penjajaran memori terbuka. Sebagai contoh, pada banyak mesin kata 4-byte hanya dapat diambil dari atau disimpan ke alamat yang merupakan kelipatan dari 4 byte.

  • Representasi data terbuka. Biasanya assembler menyediakan beberapa cara untuk menentukan data numerik dalam hex, oktal, desimal, floating point, dan terkadang data karakter.

  • Spesialisasi register terbuka. Beberapa arsitektur memungkinkan operasi integer dan address di beberapa register, tetapi floating point hanya pada yang lain, atau memungkinkan addressing relatif terhadap register tertentu. Kadang-kadang ada register khusus seperti yang dengan bit kondisi atau status yang tidak dapat digunakan untuk pengalamatan atau aritmatika.

  • Konvensi panggilan subrutin terbuka. Argumen dan nilai kembali dapat diteruskan dalam register, atau didorong ke dan muncul dari tumpukan. (Tumpukan ini biasanya merupakan wilayah memori yang dialamatkan oleh register penunjuk tumpukan khusus, bukan set tetap seperti XYZ dan T.)

  • Anda mungkin perlu sadar bagaimana berinteraksi dengan OS, atau jika tidak ada, bagaimana menangani fasilitas perangkat keras tingkat rendah. Dengan OS Anda harus memuat argumen ke register (atau tumpukan) dan menjebak ke dalam kernel. Tanpa OS Anda mungkin harus berurusan dengan interupsi dan timer.

Ingatan saya tentang pemrograman perakitan adalah sangat, sangat menyakitkan. Saya pikir pemrograman kalkulator ini mudah dan menyenangkan dengan perbandingan. (Maaf.)

Stuart Marks
sumber
1
1) Yah, itu memiliki beberapa operasi bitwise AND, OR, XOR, TIDAK - simbol biru , , dan ИНВ(yang berarti INV) pada keyboard. 2) Saya pikir bahwa sinus, cosinus dll adalah instruksi sesuai dengan referensi ini ref.x86asm.net/coder32.html untuk prosesor x86. Tapi tentu saja saya setuju dengan Anda bahwa assembler jauh lebih rumit.
defhlt
Jika Anda ingin referensi untuk operasi set instruksi VMS - deathrow.vistech.net/… . Beberapa bit menyenangkan lainnya dapat ditemukan di esolangs.org/wiki/…
25

Ya, itu jelas terdengar seperti bahasa rakitan bagi saya.

Sulit untuk mengatakan apakah atau tidak yang benar-benar adalah perakitan hanya dari deskripsi, karena definisi - bahasa yang perintah peta 1: 1 dengan kode mesin target platform ini - sulit untuk menentukan tanpa pengetahuan tentang kode mesin itu sendiri, tapi itu terdengar seperti cara ASM bekerja di platform lain.

Mason Wheeler
sumber
11

Ini tentu saja memiliki beberapa kemiripan yang dekat dengan bahasa majelis, tetapi saya akan berpendapat bahwa itu bukanlah yang sebenarnya.

Dalam bahasa assembly, sebagian besar operasi memetakan 1-ke-1 ke instruksi CPU. Ada beberapa pengecualian, seperti macro dan pseudo-ops (seperti, katakanlah, instruksi CLEAR yang benar-benar XOR register dengan dirinya sendiri); titik sebenarnya adalah bahwa program perakitan benar-benar menentukan instruksi CPU yang akan dihasilkan. (Itulah perbedaan mendasar antara bahasa assembly dan bahasa level yang lebih tinggi seperti C; dalam yang terakhir, program menentukan perilaku ).

Kalkulator pasti memiliki CPU di dalamnya, tetapi saya ragu bahwa instruksi CPU individu merujuk ke "register" X, Y, Z, dan T, atau melakukan operasi tingkat tinggi seperti xyatau sin(atau ПРГ, apa pun artinya itu!).

Sebagai gantinya, saya yakin banyak atau sebagian besar operasi yang terlihat dilakukan sebagai panggilan subrutin. Dan untuk setiap operasi yang dijalankan, harus ada sejumlah besar pekerjaan ekstra yang dilakukan untuk menampilkan hasilnya.

Anda dapat menganggap operasi yang terlihat sebagai bahasa rakitan untuk mesin virtual tingkat tinggi, tetapi mesin virtual tersebut diimplementasikan melalui sesuatu seperti interpreter yang berjalan pada CPU nyata.

Namun, saya akan mengatakan bahwa jawaban untuk bagian kedua dari pertanyaan Anda:

Apakah saya memiliki ide dasar bahasa rakitan menggunakan perangkat ini?

adalah ya.

Keith Thompson
sumber
1
Kotak kami tidak memiliki AXE, BX, CX & DX, baik - bahasa assembly diizinkan terjemahan simbolis. Saya setuju bahwa fungsi-fungsi tingkat tinggi pasti bukan perakitan tetapi perhatikan bahwa apa yang dia cantumkan tidak termasuk. Sementara saya pikir itu tidak mungkin itu benar-benar bahasa assembly (semuanya harus panjang tetap agar mode pengalamatan bekerja) tidak ada perintah yang tercantum di luar apa yang assembler pada PC miliki.
Loren Pechtel
2
"jika X <0 maka lanjutkan ke langkah program ##" adalah instruksi perakitan BMI (cabang jika minus) sederhana.
mouviciel
1
@mouviciel Dan bahkan jika platform tidak secara langsung mendukung sesuatu seperti BMIcontohnya, IF ... THEN ...umumnya dibaca sebagai dua instruksi: pertama perbandingan ( x < 0dalam hal ini), lalu tindakan berdasarkan hasil perbandingan itu (kemungkinan besar lompatan ketika bekerja dalam bahasa assembly). Di Intel 8086, sesuatu seperti (dengan asumsi xada di AX) CMP AX, 0 JNL After_IfThen_Block. (JNL menjadi Lompat jika Tidak Kurang; dalam bahasa tingkat yang lebih tinggi, ini akan berbunyi seperti if not (x < 0) then goto After_IfThen_Block, yang sama dengan if (x >= 0) then {code until there}.)
a CVn
1
ПРГ(PRG - pemrograman) hanyalah kunci meta untuk beralih ke mode pemrograman, bukan beberapa fungsi.
Oleg V. Volkov
1
@ mouviciel: Saya ragu bahwa "jika X <0 maka lanjutkan ke langkah program ##" sebenarnya diimplementasikan sebagai instruksi CPU hardware tunggal. Saya berspekulasi bahwa program yang dimasukkan pada kalkulator tidak disimpan sebagai urutan instruksi CPU; alih-alih, ini disimpan sebagai urutan instruksi tingkat yang lebih tinggi yang ditafsirkan oleh program firmware. Saya tidak pernah bekerja dengan kalkulator khusus ini, tetapi saya telah menggunakan HP-48; set instruksi yang terlihat oleh pengguna sangat berbeda dari yang ada pada Saturn CPU yang digunakannya.
Keith Thompson
9

Benar, fragmen kode yang diposting memang terlihat seperti bahasa assembly . Konversi yang tepat dari kode ini akan menentukan versi.

Sunting: ini memiliki beberapa bahasa khusus untuk perangkat ini, tetapi ini bukan rakitan.

Ini juga terlihat seperti kalkulator buatan USSR. Apakah beroperasi dengan baterai / kabel bulat?

EL Yusubov
sumber
3
Benar, itu diproduksi di Ukraina soviet dari pertengahan 80-an. Saya punya satu dibuat pada tahun 1991. Ini memiliki slot untuk 3 baterai AA dan untuk adaptor 220v.
defhlt
1
Ini benar-benar nostalgia bagi saya. Saya ingat nama merek ini "Elektronika" :)
EL Yusubov
3

Saya berpendapat Anda lebih dekat ke hibrida bahasa assembly BASIC tapi itu benar-benar tergantung pada CPU dan arsitektur yang mendasarinya. Tidak perlu ada akses memori langsung jika Anda tidak memiliki RAM sejati untuk dibicarakan. Operasi floating point juga tidak perlu hadir tanpa FPU.

Saya pikir tes sederhana akan menjadi operasi tambahan pada angka floating point dan bilangan bulat. Sebagian besar bahasa pemrograman tingkat yang lebih tinggi akan menerima ADD 2.5, 7 dan return 9.5. Namun, bahasa assembly akan berbeda output berdasarkan instruksi yang dipanggil dan tergantung pada representasi angka yang mendasarinya dalam biner. Sebagian besar bahasa assembly memerlukan instruksi yang berbeda untuk digunakan berdasarkan penggunaan floating point vs operasi integer. Pengecualian untuk ini mungkin semacam format titik tetap.

Peter Smith
sumber
Itu hanya bisa memperlakukan semua angka sebagai mengapung dan mempertimbangkan salah satu argumen 7.0.
Oleg V. Volkov
@ OlegV.Volkov mungkin, namun kemudian Anda hanya perlu memilih dua nomor floating point yang jumlahnya tidak memiliki representasi yang benar. Anda juga bisa mencari kesalahan pembatalan dalam pengurangan.
Peter Smith
3

Kalkulator notasi Reverse Polish (RPN) klasik. Tidak, meskipun sebutan register tampaknya seperti bahasa assembly, tetapi bukan bahasa rakitan. Perhitungan dilakukan dengan menerjemahkan dari format aljabar ke tumpukan. Angka-angka yang digunakan didorong ke dalam tumpukan dan operasi dilakukan pada tumpukan terakhir terhadap nilai tumpukan berikutnya.

Anda bisa "memutar" tumpukan untuk memindahkan nilai karena nilai yang ditampilkan adalah anggota tumpukan. Hasilnya dapat ditukar atau ditumpuk sesuai keperluan untuk melakukan perhitungan yang hampir kompleks. Jika Anda memahami tumpukan perangkat keras dan bahasa rakitan, kalkulator ini mudah dipelajari karena paradigmanya paling mirip.

Chip
sumber