汇编语言和机器语言(对于同一基础系统)真的相同吗?这两个概念之间有什么区别吗?
汇编语言和机器语言(对于同一基础系统)真的相同吗?这两个概念之间有什么区别吗?
汇编语言是机器语言的一种便利机制。使用汇编语言,您可以使用助记符序列而不是数字操作代码,并且可以使用符号标签而不是手动计算偏移量。它还可以保护您免受非常愚蠢的错误的影响——比如输入格式错误的处理器指令。
否则,汇编语言等同于机器语言。有时,您可能会遇到旧的汇编器不支持新处理器某些指令的助记符,那时您仍然可以将操作代码直接插入程序中。
机器语言是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.
我找到了一个非常好的解释,想在这里发布,以便其他人可以阅读:
机器语言是控制计算机处理器的实际位,通常被视为十六进制数字(通常是字节)的序列。处理器从程序存储器中读取这些位,并将这些位表示为下一步要执行的“指令”。因此,机器语言提供了一种将指令输入计算机的方法(无论是通过开关、打孔纸带还是二进制文件)。汇编语言是机器语言的更可读的形式。它不是用数字表示机器语言,而是为指令和寄存器赋予名称(通常是缩写词或助记符,例如ld表示“加载”)。与高级语言不同,汇编语言非常接近机器语言。除了助记符之外,主要的抽象是使用标签代替固定的内存地址和注释。汇编语言程序(即文本文件)由汇编器转换为机器语言。反汇编器执行相反的功能(虽然在汇编器过程中注释和标签名称将被丢弃)。 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]
机器语言
机器语言由一串二进制的1和0组成,因此很难通过直接观察来理解。如果我们想要修改代码,这将是一个巨大的问题。机器语言也是一种编程语言(第一代)。我们的计算机CPU可以直接执行该机器码而无需任何汇编器。
汇编语言
汇编语言由语法、数字和字母组成,易于修改现有代码。因此,我们的计算机无法理解该程序。所以机器使用汇编器将汇编语言代码转换为机器码。
汇编语言是使编程变得简单的第一步,它允许程序员编写助记符而不是二进制代码(机器码)。