这是汇编语言吗?


70

在我的童年时代,我曾使用MK-61 苏联计算器编程。它具有四个操作寄存器(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 2013年

这看起来像是HP 65的苏联克隆版本。可以用反向波兰记法对它进行编程,并带有推入和拉出堆栈的操作。RPN运算符仅记录在内存中,并用可能等同于4004 CPU的含义进行解释。4004 ROM中的代码可能是从4004汇编程序编译的,但是击键实际上更像电子表格宏。
Meredith Poor

Answers:


13

这不是汇编语言,这是机器语言。

机器语言是任何对机器有物理意义的东西。对于便携式计算机,它是按键,被编码为机器中的数字。您不会提供有关这台Electronika MK61机器的更多信息,因此,我将以TI-57为例:机器语言使用了以十位数为单位的键编号,以行为单位。因此,例如,将增加内存8的程序将是:

33 8  57 1 58 23

这是机器语言:机器直接解释的语言。

汇编语言将是人类可读的文本:

RCL 8 
+
1
=
STO 8

要将文本转换为机器代码序列,您需要一个汇编程序,它可以是程序,也可以是将文本转换为数字序列的人。

常常会造成混淆,因为通常是从汇编语言到机器语言的直接转换,但这并不总是完全直接的转换:宏汇编程序具有强大的宏,可以在汇编程序中完成很多工作并生成一个宏。单个汇编指令中的很多机器语言指令。仅对符号地址的转换可能涉及更改分支指令的操作码(例如,从短相对地址切换为长相对或绝对地址时),因此它并不总是像您想的那样直接。


36

我会说,对您的问题的两个部分的回答都是“否”:该计算器的命令与汇编语言不同,并且对该计算器进行编程与在汇编语言中进行编程是不同的。

该计算器所编程的“语言”是相当低的级别,但它仍代表着您对程序员不可见的较低级别结构的抽象。我有点猜测,但是从您的描述以及查看键盘(并将其与1970年代末和1980年代初的Hewlett Packard或Texas Instruments的外观相似的计算器进行比较)中,我会说每个程序都“ “不仅可以是简单的操作(例如“ add”或“ swap X&Y”),还可以是更复杂的操作,例如三角函数,求幂,对数等。这些步骤中的每一个都可能被实现为内部微编码例程。那个微代码可能是用汇编语言编写的,但是我不认为它是

正如其他人所描述的那样,汇编语言通常与基础机器的设备非常接近(如果不是1:1)。我想说汇编语言编程包括以下特性,这些特性可能在对计算器进行编程时不存在。

  • 运算包括较低级别的运算,例如按位与,或,异或,移位;整数和(也许)浮点运算,基于各种数据大小(例如单精度或双精度);加载/存储各种大小(字节,半字,字等)。

  • 更高级别的操作(触发,对数)通常是子例程调用,而不是指令。有一些例外,例如DEC VAX具有多项式求值指令。[编辑:OP指出x87也具有触发功能。

  • 机器的寻址方案已公开。如果地址空间是分段的,则必须将基址加载到寄存器中,然后再加载相对于该寄存器的地址代码或数据。即使地址空间平坦,您也知道地址和地址算法。通常,汇编程序将允许程序员使用标签来表示地址。但是,如果地址在另一个段中,则可能必须先加载一个段寄存器,然后才能访问它。

  • 内存对齐已暴露。例如,在许多机器上,只能从4字节的倍数的地址中加载或存储4字节的字。

  • 数据表示已公开。通常,汇编程序提供某种方式来指定十六进制,八进制,十进制,浮点以及偶数字符数据中的数字数据。

  • 公开了寄存器的专业化。一些架构允许在某些寄存器中进行整数和地址运算,但仅在其他某些寄存器中允许浮点运算,或者仅允许相对于某些寄存器进行寻址。有时,某些专用寄存器(例如带有条件或状态位的寄存器)不能用于寻址或算术运算。

  • 公开了子例程调用约定。参数和返回值可以在寄存器中传递,也可以推入堆栈或从堆栈中弹出。(此堆栈通常是一个特殊的堆栈指针寄存器寻址的内存区域,而不是像XYZ和T这样的固定集。)

  • 您可能需要意识到如何与操作系统交互,或者如果没有,则应如何处理底层硬件设施。对于操作系统,您必须将参数加载到寄存器(或堆栈)中并捕获到内核中。没有操作系统,您可能必须处理中断和计时器。

我对汇编程序设计的回忆是,它非常非常痛苦。与之相比,我认为对该计算器进行编程既简单又有趣。(抱歉。)


1
1)好了,它有一些按位运算AND,OR,XOR,NOT -蓝色符号ИНВ(这意味着INV)键盘上。2)我认为正弦,余弦等是根据x86处理器参考ref.x86asm.net/coder32.html的指令。但是我当然同意您的观点,即汇编程序要复杂得多。
2012年

如果您想要该VMS指令集操作的参考-deathrow.vistech.net/…。其他一些有趣的地方可以在esolangs.org/wiki/…中

25

是的,在我看来,这听起来绝对像是汇编语言。

很难说这实际上是否只是从描述中提取出来的,因为定义(一种其命令与目标平台的机器代码以1:1映射的语言)在不了解机器代码本身的情况下很难确定,但这听起来确实像ASM在其他平台上的工作方式。


11

它当然与汇编语言有一些相似之处,但是我要说的不是事实。

在汇编语言中,这些操作大多数将一对一映射到CPU指令。有一些例外,例如宏和伪操作(例如,一条CLEAR指令,它实际上将一个寄存器与自身进行XOR)。真正的意义是汇编程序准确地确定了要生成的CPU指令。(这是汇编语言和高级语言(例如C)之间的根本区别;在后者中,程序指定行为)。

毫无疑问,计算器中有一个CPU,但是我怀疑单个CPU指令是否引用X,Y,Z和T​​“寄存器”,或执行诸如xysin(或ПРГ,或意味着什么!)之类的高级操作。

相反,我确定许多或大多数可见操作都是作为子例程调用完成的。对于执行的每个操作,必须进行大量的额外工作才能显示结果。

您可以将可见操作视为高级虚拟机的汇编语言,但是该虚拟机是通过运行在真实CPU上的解释器之类的东西实现的。

不过,我想说的是问题第二部分的答案:

我对使用此设备的汇编语言有基本的了解吗?

是是的。


1
我们的盒子也没有AX,BX,CX和DX-允许使用汇编语言进行符号翻译。我确实同意,高级功能肯定不是汇编程序,但请注意,他列出的功能并不包含这些功能。虽然我认为这真的不太可能是汇编语言(寻址模式才能正常运行所有内容),但列出的命令都没有超出PC上的汇编程序。
罗伦·佩希特

2
“如果X <0,则转到程序步骤##”是一条简单的BMI(如果为负则分支)汇编指令。
mouviciel 2012年

1
@mouviciel即使平台不直接支持类似BMI示例的内容,IF ... THEN ...通常也可以理解为两条指令:首先进行比较(x < 0在这种情况下),然后根据比较结果进行操作(很可能是在工作时发生跳跃)汇编语言)。在Intel 8086中,类似(假设x在AX中)CMP AX, 0 JNL After_IfThen_Block。(JNL如果不是不小于,则为Jump;在更高级别的语言中,if not (x < 0) then goto After_IfThen_Blockif (x >= 0) then {code until there}
其含义应

1
ПРГ(PRG-编程)只是切换到编程模式的元键,而不是某些功能。
Oleg V. Volkov

1
@mouviciel:我很怀疑,“如果X <0,则进入程序步##”实际上是实现作为一个单一的硬件CPU指令。我推测在计算器上输入的程序不会存储为CPU指令序列。而是将其存储为由固件程序解释的一系列高级指令。我从来没有使用过这种特殊的计算器,但是我使用过HP-48。用户可见的指令集与其使用的Saturn CPU的指令集有很大不同。
基思·汤普森

9

是的,发布的代码片段确实看起来像汇编语言。此代码的正确转换将定义版本。

编辑:此设备具有某些特定语言,但不是汇编语言。

它看起来也像苏联制造的计算器。它可以在圆形电池/电线上运行吗?


3
正确,它是80年代中期在苏联乌克兰生产的。我有一个1991年制造的。它既有3个AA电池插槽,又有220v适配器插槽。
2012年

1
这对我来说真的很怀旧。我确实记得这个品牌名称“ Elektronika” :)
EL Yusubov

3

我认为您更接近于BASIC汇编语言混合体,但它实际上取决于底层CPU和体系结构。如果您没有真正的RAM,则不需要直接进行内存访问。没有FPU也不需要浮点运算。

我认为一个简单的测试将是对浮点数和整数的加法运算。大多数高级编程语言会接受ADD 2.5、7并返回9.5。但是,汇编语言将根据被调用的指令以及二进制形式的基础数字表示形式,不同输出。大多数汇编语言基于使用浮点数与整数运算要求使用不同的指令。这种例外可能是某种定点格式。


它可以简单地将所有数字视为浮点数,并考虑参数7.0之一。
Oleg V. Volkov

也许@ OlegV.Volkov,但是您只需要选择两个浮点数,它们的和没有真实的表示形式。您也可以寻找减法中的取消错误。
彼得·史密斯

3

波兰语反向符号(RPN)计算器是经典的。不,尽管寄存器名称看起来像汇编语言,但不是。通过将代数格式转换为堆栈来进行计算。所使用的数字被压入堆栈,并针对最后堆叠的值对最后堆叠的值执行操作。

您可以“旋转”堆栈以移动值,因为显示的值是堆栈成员。结果可以根据需要交换或堆叠以执行几乎复杂的计算。如果您确实了解堆栈硬件和汇编语言,那么学习该计算器就很容易了,因为它的范例最为相似。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.