이것은 어셈블리 언어입니까?


70

어린 시절에 나는 MK-61 소비에트 계산기 를 프로그램했다 . 4 개의 작동 레지스터 (X, Y, Z, T)와 15 개의 저장 레지스터가있었습니다. 프로그램은 105 단계를 가질 수 있습니다.

내가 기억 하듯이 다음과 같은 명령이있었습니다.

  • X 및 Y 레지스터 교체
  • 시프트 레지스터 (Z ~ T, Y ~ Z, X ~ Y)
  • 저장 레지스터 (1..15)에서 X로 복사
  • X에서 스토리지 레지스터로 복사 (1..15)
  • X <0이면 프로그램 단계 ##로 이동하십시오.
  • X 및 Y 값을 사용하여 연산 (+,-, *, /)을 수행하고 결과를 X에 넣습니다.

이 명령은 어셈블리 언어로 설정되어 있습니까? 이 장치를 사용하여 어셈블리 언어에 대한 기본 아이디어가 있습니까?

장치

그것은 "키 스트로크 프로그래밍" 이라고 밝혀졌습니다 .

재미있는 사실 : 비슷한 계산기 (이와 같지만 에너지 독립적 인 메모리가있는)는 1988 년 우주 임무 궤도 계산을위한 백업 하드웨어로 사용되었습니다. :-)


좋은! -그 사진은 기억을 되찾아줍니다. 나는 아직도 지하 어딘가에 MK-52를 가지고있다 :)
DXM

이것은 HP 65의 소비에트 복제품처럼 보입니다. 스택을 밀고 당기는 조작으로 Reverse Polish Notation으로 프로그래밍 할 수 있습니다. RPN 연산자는 단순히 메모리에 기록되며 4004 CPU에 해당하는 것으로 해석됩니다. 4004 ROM의 코드는 아마도 4004 어셈블러에서 컴파일되었지만 키 입력은 실제로 스프레드 시트 매크로와 비슷합니다.
Meredith Poor

답변:


13

이것은 어셈블리 언어가 아니며 기계 언어입니다.

기계 언어는 기계에 물리적으로 의미가있는 것입니다. 포켓 컴퓨터의 경우 키를 누르면 기계의 숫자로 인코딩됩니다. 이 Electronika MK61 기계 에 대한 자세한 정보는 제공하지 않으므로 TI-57 의 예를 들겠 습니다. 기계 언어는 열 단위 및 열 단위로 제공된 키 수를 사용했습니다. 예를 들어, 메모리 8을 증가시키는 프로그램은 다음과 같습니다.

33 8  57 1 58 23

이것은 기계 언어입니다. 기계가 직접 해석하는 것입니다.

어셈블리 언어는 사람이 읽을 수있는 텍스트입니다.

RCL 8 
+
1
=
STO 8

이 텍스트를 일련의 기계 코드 시퀀스로 변환하려면 프로그램이거나 해당 텍스트를 일련의 숫자로 변환하는 사람 일 수 있는 어셈블러 가 필요합니다 .

혼동은 종종 어셈블리 언어에서 기계 언어로의 매우 직접적인 번역이 있기 때문에 종종 수행되지만, 이것은 항상 완전히 직접적인 번역은 아닙니다. 매크로 어셈블러에는 강력한 매크로가있어 어셈블러에서 많은 작업을 수행하고 단일 어셈블리 명령어로부터 많은 기계어 명령어. 단순한 심볼릭 주소 변환은 분기 명령어의 op 코드 변경 (예 : 짧은 상대 주소 지정에서 긴 상대 또는 절대 주소 지정으로 전환 할 때)을 포함 할 수 있으므로 항상 생각만큼 직접적이지는 않습니다.


36

귀하의 질문의 두 부분에 대한 대답은 모두 아니오라고 말하고 싶습니다.이 계산기의 명령은 어셈블리 언어와 같지 않으며이 계산기를 프로그래밍하는 것은 어셈블리 언어의 프로그래밍과 다릅니다.

이 계산기가 프로그래밍 된 "언어"는 상당히 낮은 수준이지만 여전히 프로그래머에게는 보이지 않는 낮은 수준의 구문 위에 추상화를 나타냅니다. 나는 조금 추측하고 있지만 설명과 키보드를 보면 (그리고 1970 년대 후반과 1980 년대 초반 휴렛 팩커드 또는 텍사스 인스트루먼트의 유사한 계산기와 비교) 나는 각 프로그램이 "단계"라고 말합니다. "는"add "또는"swap X & Y "와 같은 간단한 연산 일뿐만 아니라 삼각법, 지수, 로그 등과 같은보다 복잡한 연산 일 수 있습니다. 이러한 각 단계는 내부 마이크로 코드 루틴으로 구현 될 수 있습니다. 이 마이크로 코드는 아마도 어셈블리 언어로 프로그래밍되어있을 것입니다.

다른 사람들이 설명했듯이 어셈블리 언어는 일반적으로 기본 시스템의 기능과 매우 가깝습니다 (1 : 1이 아닌 경우). 어셈블리 언어 프로그래밍에는이 계산기 프로그래밍에없는 다음과 같은 특성이 포함되어 있다고 말하고 싶습니다.

  • 연산에는 비트 AND, OR, XOR, 시프 팅과 같은 하위 수준의 연산이 포함됩니다. 다양한 데이터 크기 (예를 들어, 단정도 또는 배정도)에서 정수 및 (아마도) 부동 소수점 산술; 다양한 크기 (바이트, 하프 워드, 워드 등)의로드 / 저장

  • 상위 레벨 작업 (트리 그, 로그)은 일반적으로 명령이 아닌 서브 루틴 호출입니다. 다항식 평가 명령이있는 DEC VAX와 같은 일부 예외가 있습니다. [편집 : OP는 x87에도 삼각 기능이 있다고 지적했다.]

  • 기계의 주소 지정 체계가 노출됩니다. 주소 공간이 분할 된 경우 기본 주소를 레지스터에로드 한 다음 해당 레지스터와 관련된 주소 코드 또는 데이터를로드해야합니다. 플랫 주소 공간이 있어도 주소와 주소 산술을 알고 있습니다. 일반적으로 어셈블러에서는 프로그래머가 레이블을 사용하여 주소를 표시 할 수 있습니다. 그러나 주소가 다른 세그먼트에있는 경우 세그먼트 레지스터를로드해야 할 수 있습니다.

  • 메모리 정렬이 노출됩니다. 예를 들어, 많은 컴퓨터에서 4 바이트 워드는 4 바이트의 배수 인 주소에서만로드되거나 저장 될 수 있습니다.

  • 데이터 표현이 노출됩니다. 일반적으로 어셈블러는 16 진수, 8 진수, 10 진수, 부동 소수점 및 문자 데이터로 숫자 데이터를 지정하는 방법을 제공합니다.

  • 레지스터 전문화가 공개됩니다. 일부 아키텍처에서는 일부 레지스터에서 정수 및 주소 작업을 허용하지만 다른 레지스터에서는 부동 소수점 만 허용하거나 특정 레지스터에 상대적인 주소 지정 만 허용합니다. 때로는 주소 지정 또는 산술에 사용할 수없는 조건 또는 상태 비트가있는 레지스터와 같은 특수 레지스터가 있습니다.

  • 서브 루틴 호출 규칙이 노출됩니다. 인수와 반환 값은 레지스터로 전달되거나 스택에서 푸시되어 스택에서 팝될 수 있습니다. (이 스택은 일반적으로 XYZ 및 T와 같은 고정 세트가 아닌 특수 스택 포인터 레지스터로 주소가 지정된 메모리 영역입니다.)

  • OS와 상호 작용하는 방법이나없는 경우 저수준 하드웨어 기능을 처리하는 방법을 알고 있어야합니다. OS를 사용하면 인수를 레지스터 (또는 스택)에로드하고 커널에 트랩해야합니다. OS가 없으면 인터럽트와 타이머를 처리해야 할 것입니다.

어셈블리 프로그래밍에 대한 저의 기억은 매우 고통 스럽습니다. 이 계산기를 프로그래밍하는 것이 비교하기 쉽고 재미 있다고 생각합니다. (죄송합니다.)


1
파란색 기호 - 1) 음, 약간의 비트 연산을 가지고 AND, OR, XOR, NOT을 , , ИНВ키보드 (INV을 의미). 2) 사인, 코사인 등이 x86 프로세서에 대한 이 참조 ref.x86asm.net/coder32.html 에 따른 지침이라고 생각했습니다 . 그러나 물론 나는 어셈블러가 훨씬 더 복잡하다는 것에 동의합니다.
defhlt

당신이 원하는 경우 그 VMS 명령에 대한에 refrence 동작을 설정 - deathrow.vistech.net/...을 . 다른 재미있는 비트는 esolangs.org/wiki/…

25

예, 그것은 분명히 어셈블리 언어처럼 들립니다.

명령이 대상 플랫폼의 기계어 코드와 1 : 1로 매핑되는 언어 인 정의는 기계어 코드 자체에 대한 지식 없이는 결정하기 어렵 기 때문에 실제로 설명에 의한 어셈블리 인지 여부를 말하기 어렵습니다. 그러나 ASM이 다른 플랫폼에서 작동하는 방식처럼 들립니다.


11

분명히 어셈블리 언어와 비슷한 점이 있지만, 그것이 실제로는 아니라고 주장 할 것입니다.

어셈블리 언어에서 작업은 대부분 일대일로 CPU 명령에 매핑됩니다. 매크로 및 의사 -op (예를 들어, 레지스터 자체를 실제로 XOR하는 CLEAR 명령어)와 같은 예외가 있습니다. 실제 포인트는 어셈블리 프로그램이 생성 할 CPU 명령을 정확하게 결정한다는 것입니다. (이것은 어셈블리 언어와 C와 같은 고급 언어의 근본적인 차이점입니다. 후자는 프로그램이 동작을 지정합니다 ).

계산기에는 의심의 여지없이 CPU가 있지만 개별 CPU 명령어는 X, Y, Z 및 T "레지스터"를 참조하거나 xy또는 sin(또는 ПРГ그 의미가 무엇이든) 높은 수준의 작업을 수행한다고 의심합니다 .

대신, 많은 또는 대부분의 가시적 작업이 서브 루틴 호출로 수행된다고 확신합니다. 그리고 실행 된 각 작업에 대해 결과를 표시하기 위해 상당한 양의 추가 작업이 수행되어야합니다.

가시적 인 작업을 고급 가상 머신의 어셈블리 언어로 생각할 수 있지만 해당 가상 머신은 실제 CPU에서 실행되는 인터프리터와 같은 것을 통해 구현됩니다.

아직도, 나는 당신의 질문의 두 번째 부분에 대한 대답이라고 말합니다 :

이 장치를 사용하는 어셈블리 언어에 대한 기본 아이디어가 있습니까?

예입니다.


1
박스에는 AX, BX, CX & DX가 없으며 조립 언어에는 기호 번역이 허용됩니다. 나는 높은 수준의 기능이 가장 확실하지 않다는 데 동의하지만 그가 열거 한 기능에는 포함되어 있지 않습니다. 어쩌면 실제로는 어셈블 언어 일 가능성은 없지만 (어드레싱 모드가 작동하려면 모든 길이가 고정되어 있어야합니다) 나열된 명령 중 PC의 어셈블러를 능가하는 명령은 없습니다.
Loren Pechtel

2
"X <0 인 경우 프로그램 단계 ##로 이동"은 간단한 BMI (분기 인 경우 빼기) 조립 명령입니다.
mouviciel

1
@mouviciel 그리고 플랫폼이 BMI예제 와 같은 것을 직접 지원하지 않더라도 IF ... THEN ...일반적으로 두 가지 지침으로 읽습니다. 먼저 비교 ( x < 0이 경우), 그 비교 결과를 기반으로 한 작업 (작업시 점프 가능성) 어셈블리 언어로). Intel 8086 x에서 (AX에 있다고 가정 ) 과 같은 것 CMP AX, 0 JNL After_IfThen_Block입니다. (JNL은 Jump if Not Less, 고급 언어 if not (x < 0) then goto After_IfThen_Blockif (x >= 0) then {code until there}
에서는와

1
ПРГ(PRG-programming)은 일부 기능이 아니라 프로그래밍 모드로 전환하기위한 메타 키일뿐입니다.
Oleg V. Volkov

1
@mouviciel : "X <0이면 프로그램 단계 ##으로 가십시오"가 실제로 단일 하드웨어 CPU 명령으로 구현 된다는 회의적인 생각 입니다. 계산기에 입력 된 프로그램 은 일련의 CPU 명령으로 저장 되지 않습니다 . 대신, 펌웨어 프로그램에서 해석 되는 일련의 상위 레벨 명령으로 저장됩니다 . 이 계산기를 사용해 본 적이 없지만 HP-48을 사용했습니다. 사용자가 볼 수있는 명령어 세트는 사용하는 Saturn CPU의 명령어 세트와 매우 다릅니다.
키이스 톰슨

9

맞습니다. 게시 된 코드 조각은 어셈블리 언어 처럼 보입니다 . 이 코드를 올바르게 변환하면 버전이 정의됩니다.

편집 : 이 장치에 대한 특정 언어가 있지만 어셈블리는 아닙니다.

또한 소련에서 만든 계산기처럼 보입니다. 둥근 배터리 / 코드로 작동합니까?


3
맞습니다 .80 년대 중반부터 소비에트 우크라이나에서 생산되었습니다. 1991 년에 제조 된 제품이 있습니다. AA 배터리 3 개와 220v 어댑터 용 슬롯이 모두 있습니다.
defhlt

1
이것은 정말 향수입니다. 나는이 브랜드 이름 "Elektronika"를 기억한다 :)
EL Yusubov

3

나는 당신이 BASIC 어셈블리 언어 하이브리드에 더 가깝다고 주장하지만 그것은 실제로 기본 CPU와 아키텍처에 달려 있습니다. 말할 RAM이 없으면 직접 메모리에 액세스 할 필요가 없습니다. FPU가 없으면 부동 소수점 연산도 필요하지 않습니다.

간단한 테스트는 부동 소수점 숫자와 정수에 대한 덧셈 연산이라고 생각합니다. 대부분의 고급 프로그래밍 언어는 ADD 2.5, 7을 수락하고 9.5를 반환합니다. 그러나 어셈블리 언어는 호출 된 명령과 이진수로 된 기본 숫자 표현에 따라 출력이 달라집니다. 대부분의 어셈블리 언어는 부동 소수점 대 정수 연산을 사용하여 다른 명령어를 사용해야합니다. 이에 대한 예외는 일종의 고정 소수점 형식 일 수 있습니다.


단순히 모든 숫자를 부동 소수점으로 취급하고 인수 7.0 중 하나를 고려할 수 있습니다.
Oleg V. Volkov

@ OlegV.Volkov 그러나 어쩌면 합계가 실제 표현이없는 두 개의 부동 소수점 숫자 만 선택하면됩니다. 또한 빼기에서 취소 오류를 찾을 수 있습니다.
피터 스미스

3

역 폴란드 표기법 (RPN) 계산기는 고전적이었습니다. 아니요, 레지스터 지정은 어셈블리 언어처럼 보이지만 그렇지 않았습니다. 계산은 대수 형식에서 스택으로 변환하여 수행되었습니다. 사용 된 수를 스택에 넣고 마지막 스택 값에 대해 마지막 스택에서 작업을 수행했습니다.

표시된 값이 스택 멤버이므로 스택을 "회전"하여 값을 이동할 수 있습니다. 거의 복잡한 계산을 수행하기 위해 필요에 따라 결과를 바꾸거나 쌓을 수 있습니다. 스택 하드웨어와 어셈블리 언어를 이해한다면이 계산기는 패러다임이 가장 유사했기 때문에 배우기가 쉽지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.