汇编语言和机器语言之间有什么关系?

33

汇编语言和机器语言(对于同一基础系统)真的相同吗?这两个概念之间有什么区别吗?


就概念而言,汇编语言的全部意义在于节省劳动力。从理想的一对一指令到助记符再到语言的其他非指令部分。与概念相关的是,机器语言由逻辑定义,假定不可更改(有例外情况,我们现在先忽略这些)。而汇编语言由汇编器定义,一个机器语言可以有许多(不兼容的)汇编语言供人们编写。作为用户,您可以选择自己喜欢的语言。顺便说一下,这并不限于x86。 - old_timer
9个回答

40

汇编语言是机器语言的一种便利机制。使用汇编语言,您可以使用助记符序列而不是数字操作代码,并且可以使用符号标签而不是手动计算偏移量。它还可以保护您免受非常愚蠢的错误的影响——比如输入格式错误的处理器指令。

否则,汇编语言等同于机器语言。有时,您可能会遇到旧的汇编器不支持新处理器某些指令的助记符,那时您仍然可以将操作代码直接插入程序中。


汇编语言不仅仅是一个等效物,它通常包括除了使指令更易于人类阅读/编写之外的其他节省劳动力的设备。标签、指令、有时还有宏语言等都是汇编语言的一部分,它通常不限于理想的一对一机器到/从助记符的转换。 - old_timer

19

机器语言是CPU操作码的“位编码”。

汇编语言是CPU操作码的“符号编码”。

例如,以符号方式表示:

loop:  dec R1    # Decrement register R1
       bnq loop  # Branch if not equal to zero to
                 # address "loop"

变成位编码:

# Mythical CPU Machine code 4 bits operation,
#                           4 bit "option"
       0x41      # 4 is a "dec" and represents r1;
       0x7E      # 7 is bnq and E means PC -2;

通常情况下,汇编语言和机器码是一对一的关系,但有些汇编语言会偶尔有额外的汇编指令,这些指令可能映射到多个机器码指令或重用其他的操作码。例如,使用机器码“xor R1,R1”作为“clr R1”或非常相似的操作。

此外,汇编语言通常支持“宏编程”,在20世纪80年代广泛使用汇编语言时,它使源代码看起来更像是“高级语言”。我个人编写过汇编宏,看起来像“plot x,y”和“Hex Val”,以简化常见操作。

例如:

# Mythically CPU Macro
.macro spinSleep x,y
            ld #x,y
localLoop:  dec y
            brq localLoop
.endmacro
# Macro invocation
            spinSleep 100,R1
# Macro expantion
            ld #100,R1
localLoopM: dec R1
            brq localLoopM   # localLoopM is "Mangled" for localization.

7

我找到了一个非常好的解释,想在这里发布,以便其他人可以阅读:

机器语言是控制计算机处理器的实际位,通常被视为十六进制数字(通常是字节)的序列。处理器从程序存储器中读取这些位,并将这些位表示为下一步要执行的“指令”。因此,机器语言提供了一种将指令输入计算机的方法(无论是通过开关、打孔纸带还是二进制文件)。汇编语言是机器语言的更可读的形式。它不是用数字表示机器语言,而是为指令和寄存器赋予名称(通常是缩写词或助记符,例如ld表示“加载”)。与高级语言不同,汇编语言非常接近机器语言。除了助记符之外,主要的抽象是使用标签代替固定的内存地址和注释。汇编语言程序(即文本文件)由汇编器转换为机器语言。反汇编器执行相反的功能(虽然在汇编器过程中注释和标签名称将被丢弃)。

来源:机器语言和汇编语言有什么区别?


5
在汇编中,指令是CPU指令更易于理解的表示形式。
但汇编器也使地址寻址更加容易:
- 在机器语言中,您必须知道您所在位置与您想要跳转到的位置之间的距离(在地址空间中)。 - 在汇编语言中,您将一个地址称为“iWantToJumpHere”,然后可以说“jump iWantToJumpHere”。
这使得汇编更易于维护,特别是当地址之间的距离发生变化时。

2
机器语言是芯片能够理解的语言,而汇编语言是您能够理解的语言。每个汇编指令都有一个对应的机器语言。x86有一些单字节指令,但它们长度可变,最长可达15个字节(包括可选前缀)。
 machine code bytes |   x86 assembly language
8D B0 00 36 65 C4    lea    esi, [eax - 1000000000]     
BB 00 FC FF FF       mov    ebx, -1024
43                   inc    ebx
41                   inc    eax
3B CA                cmp    ecx,edx
C3                   ret

C5 F5 72 D2 01       vpsrld ymm1,ymm2,0x1        ; AVX2
C5 F5 D4 6D 88       vpaddq ymm5,ymm1,YMMWORD PTR [ebp-0x78]
C5 CD D4 AD 68 ff ff ff vpaddq ymm5,ymm6,YMMWORD PTR [ebp-0x98]

0
汇编语言首先由汇编器转换为机器语言,存储在内存(RAM)中,处理器/中央处理器从内存中获取并存储到寄存器中,然后按照指令集依次执行。

2
在说一条指令存储在寄存器中之前,请先确认正确性。这不是必然的;类似x86或VAX这样的CISC机器具有可变长度的指令,并且不能像按顺序的非超标量MIPS那样有用地使用指令的位作为内部控制信号。即使是乱序执行的CPU也会给出依次运行指令的假象,因此这是一个有用的描述。除了具有显式并行性的VLIW架构! [x86寄存器:MBR / MDR和指令寄存器](https://stackoverflow.com/q/51522368)。 - Peter Cordes

0

机器语言

机器语言由一串二进制的1和0组成,因此很难通过直接观察来理解。如果我们想要修改代码,这将是一个巨大的问题。机器语言也是一种编程语言(第一代)。我们的计算机CPU可以直接执行该机器码而无需任何汇编器。

汇编语言

汇编语言由语法、数字和字母组成,易于修改现有代码。因此,我们的计算机无法理解该程序。所以机器使用汇编器将汇编语言代码转换为机器码。


0

汇编语言是使编程变得简单的第一步,它允许程序员编写助记符而不是二进制代码(机器码)。


-3
汇编语言是一种符号化的操作码(operation code),人类可以理解,仅用于指导计算机处理器(硬件操作)和机器人(机器操作)执行特定任务的语言。 这是一种人类可以理解的语言。此语言仅用于指导硬件操作,并绝对不用于创建软件程序。 汇编器用于将这个操作码(operation code)的符号化部分转换为机器语言。 操作码(Opcode)是机器语言的一部分。

这个答案想要传达什么意思并不清楚。 - Agi Hammerthief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接