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

fre*_*ght 31 architecture assembly operating-system machine-code isa

汇编语言和机器语言(对于相同的底层系统)是否真的相同?这两个概念之间有什么不同吗?

sha*_*oth 40

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

否则,汇编语言相当于机器语言.有时您会有一个旧的汇编程序,它不支持助记符来处理新处理器的某些指令 - 然后您仍然可以将操作代码直接插入程序中.


NoM*_*ots 19

机器语言是CPU的操作码的"位编码".

Assembly langauge是CPU的操作码的"符号编码".

因此,例如符号:

loop:  dec R1    # Decrement register R1
       bnq loop  # Branch if not equal to zero to
                 # address "loop"
Run Code Online (Sandbox Code Playgroud)

成为比特编码:

# 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;
Run Code Online (Sandbox Code Playgroud)

通常它是一对一的关系,但是一些汇编语言将在国际上具有额外的汇编指令,这些汇编指令映射到多个机器代码指令或重用另一个操作码.例如使用机器代码"xor R1,R1"作为"clr R1"或类似的东西.

此外,汇编语言将倾向于支持"宏编程",在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.
Run Code Online (Sandbox Code Playgroud)


Naw*_*waz 7

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

机器语言是用于控制计算机中处理器的实际位,通常被视为十六进制数字序列(通常为字节).处理器从程序存储器中读取这些位,这些位表示下一步操作的"指令".因此,机器语言提供了一种将指令输入计算机的方式(无论是通过交换机,穿孔带还是二进制文件).

汇编语言是一种更易读的机器语言视图.指令和寄存器不是将机器语言表示为数字,而是给出名称(通常是缩写词或助记符,例如ld表示"加载").与高级语言不同,汇编程序非常接近机器语言.主要的抽象(除了助记符)是使用标签而不是固定的内存地址和注释.

汇编语言程序(即文本文件)由汇编程序转换为机器语言.反汇编程序执行反向功能(尽管标签的注释和名称将在汇编程序进程中被丢弃).

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


wei*_*ure 5

在汇编中,指令是更容易理解的CPU指令表示.

但是汇编程序也使得例如更容易解决:

  • 在机器语言中,您必须知道您所在位置和要跳转到的位置之间的距离(在地址空间中)
  • 在汇编语言中,您调用一个地址"iWantToJumpHere",然后您可以说"jump iWantToJumpHere"

这使得装配更容易维护,尤其是当地址之间的距离改变时.