2017-10-15 103 views
1

最近我要学习一些基本的汇编语言,我已经搜索了wiki,并且我意识到汇编语言只是机器语言的“文本版本”,以便让人们阅读?所以这意味着任何机器语言都可以做汇编语言也可以完成,对吗?或者它在汇编语言中存在一些限制,就像高级编程语言和汇编语言之间的差距(我们在高级语言中做不到的东西,所以我们不得不使用汇编),所以有些情况我们别无选择,机器语言?汇编语言不能做什么,但只有机器语言可以吗?

另一个问题是,我发现一种低于机器语言的语言是“微码”?有谁知道机器码和微码之间的关系吗?

+2

这一切都取决于您的汇编程序,将文本转换为机器码。例如,在x86上,一些汇编指令可能会以多种方式编码为机器代码,而汇编器可能会或可能不会提供一种方法来指定您想要的。但它通常不重要。微码存在于CPU内部,通常你不能以应用程序员的身份访问它。 – Jester

+0

https://electronics.stackexchange.com/questions/1911/microprogramming-vs-machine-language-programming – Juan

+0

就像@Jester,我想到的主要问题是当你想要一个特定的编码。在asm中,你可以使用'db 0x90'或其他任何东西来代替'nop'来手动编码一条指令,否则,汇编程序的便利将会受益。 –

回答

3

这取决于你如何定义组件和机器代码之间的区别:

如果调用是由汇编“汇编代码”翻译任何“源”代码的明确答复是所有装配的99%使用:“否”

你可以任何你喜欢的机器代码指令添加到使用像.bytedb或指令但是你的汇编名字你的汇编源代码,该指令是这样的:

move X,Y 
.byte 1 
.byte 2 
.byte 3 
add Y,X 

如果你说:任何指令输入为数字(使用.byte指令)不是汇编的答案是:“经常是”:

在8088例如存在可以以多种方式来表示一些指令:jmp或例如mov ax, value。 (对于很多像MIPS这样的RISC CPU,情况更糟......)

如果在汇编器中输入这样的指令,汇编器可以自由决定如何转换指令。 CPU将以相同的方式执行这两种变体,那么为什么汇编器可以让您在两种变体之间进行选择?

但是,其他要求可能会强制您明确使用以下两种变体之一:似乎有DOS模拟器需要某种文件格式的第一条指令为指令的3字节变体。

如果你简单的写了下面的汇编代码:

jmp _start 
_start: 
    ... 

你无法控制的,如果汇编器使用3字节或指令jmp _start的2个字节的变种。我想大多数汇编程序将使用2字节的变体。

如果它使用2字节变体,例如DOS模拟器将无法读取该文件!