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)
我发现了一个非常好的解释,想在这里发布,以便其他人可以阅读它:
机器语言是用于控制计算机中处理器的实际位,通常被视为十六进制数字序列(通常为字节).处理器从程序存储器中读取这些位,这些位表示下一步操作的"指令".因此,机器语言提供了一种将指令输入计算机的方式(无论是通过交换机,穿孔带还是二进制文件).
汇编语言是一种更易读的机器语言视图.指令和寄存器不是将机器语言表示为数字,而是给出名称(通常是缩写词或助记符,例如ld表示"加载").与高级语言不同,汇编程序非常接近机器语言.主要的抽象(除了助记符)是使用标签而不是固定的内存地址和注释.
汇编语言程序(即文本文件)由汇编程序转换为机器语言.反汇编程序执行反向功能(尽管标签的注释和名称将在汇编程序进程中被丢弃).
在汇编中,指令是更容易理解的CPU指令表示.
但是汇编程序也使得例如更容易解决:
这使得装配更容易维护,尤其是当地址之间的距离改变时.