Đây có phải là một ngôn ngữ lắp ráp?


70

Thời thơ ấu, tôi thường lập trình trên máy tính Xô Viết MK-61 . Nó có bốn thanh ghi hoạt động (X, Y, Z, T) và 15 thanh ghi lưu trữ. Một chương trình có thể có 105 bước.

Khi tôi nhớ lại, nó có các lệnh như:

  • Hoán đổi thanh ghi X và Y
  • Các thanh ghi thay đổi (Z đến T, Y đến Z, X đến Y)
  • Sao chép từ thanh ghi lưu trữ (1..15) sang X
  • Sao chép từ X vào thanh ghi lưu trữ (1..15)
  • Nếu X <0 thì chuyển sang bước chương trình ##
  • Thực hiện thao tác (+, -, *, /) bằng các giá trị X và Y và đặt kết quả cho X

Là lệnh này đặt một ngôn ngữ lắp ráp? Tôi đã có ý tưởng cơ bản về ngôn ngữ lắp ráp bằng cách sử dụng thiết bị này chưa?

Thiết bị

Hóa ra đó là một thứ gọi là "lập trình tổ hợp phím" .

Sự thật buồn cười: một máy tính tương tự (như máy tính này, nhưng có bộ nhớ độc lập về năng lượng) đã được sử dụng làm phần cứng dự phòng cho các tính toán quỹ đạo nhiệm vụ không gian vào năm 1988. :-)


Đẹp! - bức tranh đó mang lại những kỷ niệm. Tôi vẫn còn MK-52 của mình ở tầng hầm ở đâu đó :)
DXM

Nó trông giống như một bản sao Liên Xô của HP 65. Nó có thể được lập trình trong Ký hiệu đảo ngược Ba Lan với các hoạt động đẩy và kéo lên một chồng. Các toán tử RPN được ghi lại đơn giản trong bộ nhớ và được giải thích bởi một thứ có lẽ tương đương với CPU 4004. Mã trong ROM 4004 có thể được biên dịch từ trình biên dịch 4004, nhưng tổ hợp phím thực sự giống như macro bảng tính hơn.
Meredith Nghèo

Câu trả lời:


13

Đây không phải là ngôn ngữ lắp ráp, đây là ngôn ngữ máy.

Ngôn ngữ máy là bất cứ thứ gì có ý nghĩa vật lý đối với máy. Trong trường hợp máy tính bỏ túi, đó là phím bấm, được mã hóa thành số trong máy. Bạn không cung cấp thêm thông tin về máy Electronika MK61 này , vì vậy tôi sẽ đưa ra ví dụ về TI-57 : ngôn ngữ máy sử dụng số lượng phím được cung cấp dưới dạng cột trong hàng chục và dòng trong các đơn vị. Vì vậy, ví dụ, một chương trình tăng bộ nhớ 8 sẽ là:

33 8  57 1 58 23

Đây là ngôn ngữ máy: đó là những gì được máy diễn giải trực tiếp.

Ngôn ngữ hội sẽ là văn bản dễ đọc của con người :

RCL 8 
+
1
=
STO 8

Để chuyển đổi văn bản này vào chuỗi các mã máy, bạn sẽ cần một lắp ráp , có thể là một chương trình, hoặc một con người sẽ dịch rằng văn bản vào chuỗi các con số.

Sự nhầm lẫn thường được thực hiện, bởi vì thường có một bản dịch khá trực tiếp từ ngôn ngữ lắp ráp sang ngôn ngữ máy, nhưng đây không phải lúc nào cũng là một bản dịch hoàn toàn trực tiếp: các trình biên dịch macro có các macro mạnh mẽ có thể thực hiện nhiều công việc trong trình biên dịch và tạo ra một rất nhiều hướng dẫn ngôn ngữ máy từ một hướng dẫn lắp ráp duy nhất. Việc dịch các địa chỉ tượng trưng có thể liên quan đến việc thay đổi mã op của các hướng dẫn chi nhánh (ví dụ: khi chuyển từ địa chỉ tương đối ngắn sang địa chỉ tương đối dài hoặc địa chỉ tuyệt đối), vì vậy nó không phải lúc nào cũng trực tiếp như bạn nghĩ.


36

Tôi muốn nói rằng câu trả lời cho cả hai phần câu hỏi của bạn là không: các lệnh của máy tính này không giống như ngôn ngữ lắp ráp và lập trình máy tính này khác với lập trình bằng ngôn ngữ lắp ráp.

"Ngôn ngữ" máy tính này được lập trình ở mức khá thấp, nhưng nó vẫn thể hiện sự trừu tượng trên các cấu trúc cấp thấp hơn mà bạn không thể thấy được với tư cách là lập trình viên. Tôi đoán một chút, nhưng từ mô tả của bạn và từ việc nhìn vào bàn phím (và so sánh nó với các máy tính có giao diện tương tự từ Hewlett Packard hoặc Texas Cụ từ cuối những năm 1970 và đầu những năm 1980) Tôi nói rằng mỗi chương trình "bước "Không chỉ có thể là một hoạt động đơn giản như" thêm "hoặc" hoán đổi X & Y "mà còn là các hoạt động phức tạp hơn như lượng giác, lũy thừa, logarit, v.v ... Mỗi bước này có thể được thực hiện như một thói quen mã hóa nội bộ. Mã vi mô đó có thể được lập trình bằng ngôn ngữ lắp ráp, nhưng tôi không nghĩ vậy '

Như những người khác đã mô tả, ngôn ngữ lắp ráp thường rất tương ứng (nếu không phải là 1: 1) với các phương tiện của máy bên dưới. Tôi muốn nói rằng lập trình ngôn ngữ lắp ráp bao gồm các đặc điểm sau có lẽ không có trong lập trình máy tính này.

  • Các hoạt động bao gồm các hoạt động cấp thấp hơn như bitwise AND, OR, XOR, dịch chuyển; số nguyên và (có thể) số học dấu phẩy động, trên nhiều kích thước dữ liệu (ví dụ: độ chính xác đơn hoặc kép); tải / lưu trữ của một loạt các kích cỡ (byte, Halfword, word, v.v.).

  • Các hoạt động cấp cao hơn (trig, logarit) thường là các cuộc gọi chương trình con, không phải là hướng dẫn. Có một số trường hợp ngoại lệ, chẳng hạn như VAX DEC có hướng dẫn đánh giá đa thức. [Chỉnh sửa: OP chỉ ra rằng x87 cũng có chức năng trig.]

  • Sơ đồ địa chỉ của máy được tiếp xúc. Nếu không gian địa chỉ được phân đoạn, bạn phải tải một địa chỉ cơ sở vào một thanh ghi và sau đó mã địa chỉ hoặc dữ liệu liên quan đến thanh ghi đó. Ngay cả với một không gian địa chỉ phẳng, bạn vẫn biết địa chỉ và số học địa chỉ. Thông thường các nhà lắp ráp sẽ cho phép các lập trình viên sử dụng nhãn để biểu thị địa chỉ. Nhưng nếu một địa chỉ ở một phân khúc khác, bạn có thể phải tải một thanh ghi phân khúc trước khi bạn có thể đến địa chỉ đó.

  • Căn chỉnh bộ nhớ được tiếp xúc. Ví dụ, trên nhiều máy, một từ 4 byte chỉ có thể được tải từ hoặc được lưu trữ đến các địa chỉ là bội số của 4 byte.

  • Đại diện dữ liệu được tiếp xúc. Thông thường các nhà lắp ráp cung cấp một số cách để xác định dữ liệu số trong dữ liệu hex, bát phân, thập phân, dấu phẩy động và đôi khi là ký tự.

  • Chuyên môn hóa đăng ký được tiếp xúc. Một số kiến ​​trúc cho phép các hoạt động số nguyên và địa chỉ trong một số thanh ghi, nhưng chỉ có dấu phẩy động trong các thanh ghi khác hoặc chỉ cho phép đánh địa chỉ liên quan đến các thanh ghi nhất định. Đôi khi, có những thanh ghi chuyên dụng như những thanh có bit điều kiện hoặc trạng thái không thể được sử dụng để đánh địa chỉ hoặc số học.

  • Các quy ước gọi chương trình con được đưa ra. Các đối số và giá trị trả về có thể được truyền vào các thanh ghi, hoặc được đẩy tới và bật ra từ ngăn xếp. (Ngăn xếp này thường là một vùng bộ nhớ được ghi địa chỉ bởi một thanh ghi con trỏ ngăn xếp đặc biệt, không phải là một tập hợp cố định như XYZ và T.)

  • Bạn có thể cần ý thức về cách tương tác với HĐH hoặc nếu không có, làm thế nào để đối phó với các cơ sở phần cứng cấp thấp. Với một hệ điều hành, bạn phải tải các đối số vào các thanh ghi (hoặc ngăn xếp) và bẫy vào kernel. Nếu không có HĐH, có lẽ bạn phải đối phó với các ngắt và bộ hẹn giờ.

Hồi ức của tôi về lập trình lắp ráp là nó rất, rất đau. Tôi nghĩ rằng lập trình máy tính này là dễ dàng và thú vị bằng cách so sánh. (Lấy làm tiếc.)


1
1) Vâng, nó có một số hoạt động bitwise AND, OR, XOR, NOT - biểu tượng màu xanh , , ИНВ(có nghĩa là INV) trên bàn phím. 2) Tôi nghĩ rằng sin, cos, v.v. là những hướng dẫn theo tài liệu tham khảo ref.x86asm.net/coder32.html này cho các bộ xử lý x86. Nhưng tất nhiên tôi đồng ý với bạn rằng trình biên dịch phức tạp hơn nhiều.
defhlt

Nếu bạn muốn điều chỉnh lại hoạt động của tập lệnh VMS đó - deathrow.vistech.net/ ,. Một số bit thú vị khác có thể được tìm thấy trong esolangs.org/wiki/ Kẻ

25

Vâng, điều đó chắc chắn nghe giống như một ngôn ngữ lắp ráp với tôi.

Thật khó để nói liệu thực sự có được lắp ráp chỉ từ mô tả hay không, bởi vì định nghĩa - một ngôn ngữ có lệnh ánh xạ 1: 1 với mã máy của nền tảng đích - rất khó xác định nếu không có kiến ​​thức về chính mã máy, nhưng điều đó có vẻ giống như cách ASM hoạt động trên các nền tảng khác.


11

Nó chắc chắn có một số điểm tương đồng gần gũi với ngôn ngữ lắp ráp, nhưng tôi sẽ tranh luận rằng đó không phải là ngôn ngữ thực sự.

Trong ngôn ngữ lắp ráp, các thao tác chủ yếu ánh xạ các lệnh 1 đến 1 của CPU. Có một số trường hợp ngoại lệ, chẳng hạn như macro và pseudo-op (như, giả sử, một lệnh XÓA thực sự XOR đăng ký với chính nó); điểm thực sự là một chương trình lắp ráp xác định chính xác các lệnh CPU sẽ được tạo. (Đó là sự khác biệt cơ bản giữa ngôn ngữ lắp ráp và ngôn ngữ cấp cao hơn như C; trong phần sau, các chương trình chỉ định hành vi ).

Máy tính chắc chắn có CPU, nhưng tôi nghi ngờ rằng các lệnh CPU riêng lẻ đề cập đến các "thanh ghi" X, Y, Z và T, hoặc thực hiện các hoạt động cấp cao như xyhoặc sin(hoặc ПРГ, bất kể điều đó có nghĩa là gì!).

Thay vào đó, tôi chắc chắn rằng nhiều hoặc hầu hết các hoạt động có thể nhìn thấy được thực hiện dưới dạng các cuộc gọi chương trình con. Và đối với mỗi thao tác được thực hiện, phải có một lượng công việc bổ sung đáng kể được thực hiện để hiển thị kết quả.

Bạn có thể nghĩ về các hoạt động có thể nhìn thấy như một ngôn ngữ lắp ráp cho một máy ảo cấp cao, nhưng máy ảo đó được triển khai thông qua một cái gì đó giống như một trình thông dịch chạy trên CPU thực.

Tuy nhiên, tôi muốn nói rằng câu trả lời cho phần thứ hai của câu hỏi của bạn:

Tôi đã có ý tưởng cơ bản về ngôn ngữ lắp ráp bằng thiết bị này chưa?

là có.


1
Các hộp của chúng tôi không có AX, BX, CX & DX, - ngôn ngữ lắp ráp được phép dịch thuật tượng trưng. Tôi đồng ý rằng các chức năng cấp cao chắc chắn không phải là lắp ráp nhưng lưu ý rằng những gì anh ta liệt kê không bao gồm chúng. Trong khi tôi nghĩ không chắc nó thực sự là ngôn ngữ hợp ngữ (mọi thứ sẽ phải có độ dài cố định để chế độ địa chỉ hoạt động) không có lệnh nào được liệt kê nằm ngoài trình biên dịch trên PC.
Loren Pechtel

2
"Nếu X <0 thì chuyển đến bước chương trình ##" là một hướng dẫn lắp ráp BMI (nhánh nếu trừ) đơn giản.
mouviciel

1
@mouviciel Và ngay cả khi nền tảng không hỗ trợ trực tiếp một cái gì đó như BMIví dụ, IF ... THEN ...thường được đọc là hai hướng dẫn: đầu tiên là so sánh ( x < 0trong trường hợp này), sau đó là hành động dựa trên kết quả so sánh đó (rất có thể là một bước nhảy khi làm việc trong ngôn ngữ lắp ráp). Trong Intel 8086, một cái gì đó giống như (giả sử xlà trong AX) CMP AX, 0 JNL After_IfThen_Block. (JNL là Jump nếu không phải ít hơn; trong ngôn ngữ cấp cao hơn, điều này sẽ đọc giống như if not (x < 0) then goto After_IfThen_Block, giống như if (x >= 0) then {code until there}.)
một CVn

1
ПРГ(PRG - lập trình) chỉ là một phím meta để chuyển sang chế độ lập trình, không phải là một số chức năng.
Oleg V. Volkov

1
@mouviciel: Tôi nghi ngờ rằng "nếu X <0 thì đi đến bước chương trình ##" thực sự được triển khai như một hướng dẫn CPU phần cứng duy nhất. Tôi suy đoán rằng một chương trình được nhập trên máy tính không được lưu dưới dạng một chuỗi các hướng dẫn CPU; thay vào đó, nó được lưu trữ dưới dạng một chuỗi các hướng dẫn cấp cao hơn được chương trình phần sụn diễn giải . Tôi chưa bao giờ làm việc với máy tính đặc biệt này, nhưng tôi đã sử dụng HP-48; bộ hướng dẫn hiển thị của người dùng rất khác so với CPU Saturn mà nó sử dụng.
Keith Thompson

9

Đúng vậy, đoạn mã được đăng trông giống như ngôn ngữ lắp ráp . Việc chuyển đổi đúng mã này sẽ xác định phiên bản.

Chỉnh sửa: nó có một số ngôn ngữ cụ thể cho thiết bị này, nhưng nó không phải là lắp ráp.

Nó cũng trông giống như một máy tính do Liên Xô sản xuất. Nó chạy trên pin / dây tròn?


3
Chính xác, nó được sản xuất tại Liên Xô Ukraine từ giữa những năm 80. Tôi có một chiếc được sản xuất vào năm 1991. Nó có cả hai khe cắm cho 3 pin AA và cho bộ chuyển đổi 220v.
defhlt

1
Đây thực sự là một hoài niệm đối với tôi. Tôi nhớ tên thương hiệu này "Elektronika" :)
EL Yusubov

3

Tôi sẽ tranh luận rằng bạn gần gũi hơn với một ngôn ngữ lắp ráp BASIC nhưng nó thực sự phụ thuộc vào kiến ​​trúc và CPU bên dưới. Không cần phải truy cập bộ nhớ trực tiếp nếu bạn không có RAM thực sự để nói. Các hoạt động của dấu phẩy động cũng không cần phải có mặt nếu không có FPU.

Tôi nghĩ rằng một bài kiểm tra đơn giản sẽ là một phép toán cộng vào số dấu phẩy động và số nguyên. Hầu hết các ngôn ngữ lập trình cấp cao hơn sẽ chấp nhận ADD 2.5, 7 và trả về 9.5. Tuy nhiên, các ngôn ngữ hội sẽ khác nhau đầu ra dựa trên hướng dẫn được gọi và tùy thuộc vào biểu diễn số cơ bản trong nhị phân. Hầu hết các ngôn ngữ lắp ráp yêu cầu một hướng dẫn khác nhau được sử dụng dựa trên việc sử dụng các phép toán dấu phẩy động và số nguyên. Một ngoại lệ cho điều này có thể là một số loại định dạng điểm cố định.


Nó chỉ đơn giản có thể coi tất cả các số là số float và xem xét một trong các đối số 7.0.
Oleg V. Volkov

@ OlegV.Volkov có thể, tuy nhiên sau đó bạn chỉ cần chọn hai số dấu phẩy động có tổng không có biểu diễn đúng. Ngoài ra, bạn có thể săn tìm các lỗi hủy trong phép trừ.
Peter Smith

3

Máy tính đảo ngược ký hiệu Ba Lan (RPN) là cổ điển. Không, mặc dù các chỉ định đăng ký có vẻ như ngôn ngữ lắp ráp nhưng không phải vậy. Các tính toán được thực hiện bằng cách dịch từ định dạng đại số lên ngăn xếp. Các số được sử dụng đã được đẩy vào ngăn xếp và các thao tác được thực hiện trên ngăn xếp cuối cùng so với giá trị xếp chồng cuối cùng.

Bạn có thể "xoay" ngăn xếp để di chuyển các giá trị vì giá trị được hiển thị là thành viên của ngăn xếp. Các kết quả có thể được hoán đổi hoặc xếp chồng khi cần thiết để thực hiện phép tính gần như phức tạp. Nếu bạn hiểu phần cứng ngăn xếp và ngôn ngữ lắp ráp thì máy tính này không quan trọng để học vì mô hình của nó tương tự nhau nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.