基本运营概念大会

时间:2018-07-16 16:13:04

标签: assembly x86 cpu-architecture fasm

一段时间前,我在某种程度上学习了x86汇编语言。我知道名为ADD的指令。例如:

ADD eax,edx ; Precisely ADD destination,source .
The output gets stored in eax.

但是今天我读了卡尔·哈马切尔(Carl Hamacher)写的关于计算机组织的书,上面写着:

Add LOCA,R0
"This instruction adds the operand at memory location LOCA to the operand in a register in the processor, R0, and places the sum into register R0."

ADD R1,R0
This instruction adds the contents of register R1 and R0 and places the sum in R0. 

这是什么意思?它违背了我之前学习的内容。结果存储在左侧位置。这本书是否正确,还是我弄错了? (第1.3页)。

1 个答案:

答案 0 :(得分:0)

首先,有许多不同的指令集,x86只是其中之一,它经过数十年的发展,增加了指令,并更改或重新解释了旧指令的工作方式。

第二,汇编语言由汇编程序定义,该程序读取汇编语言。与C或Python或JAVA或其他存在明确定义的,特别是每个人都遵循的定义不同。汇编语言是并且可以定义,但是汇编程序的作者想要。语言上没有任何规则,只有任何规则受硬件支配,为了使该工具有用,您需要生成可执行的机器代码。

从历史上看,芯片供应商或就IP内核而言,核心供应商会提供自己的文档,其中定义了机器代码,并在其中提供了汇编语言,无论是某个地方的供应商或代表他们创建了汇编程序的人符合该语言,对于x86

add ah,bl

表示ah = ah + bl

后来又有其他人出现(该工具习惯于更改汇编语言以使其与芯片/核心供应商工具不兼容),并在其中创建/移植了汇编器

add ah,bl

意味着bl = bl + ah

语言的差异不仅限于目标的第一位或最后一位,包括指令在内的整个语言都是该语言的一部分,即使您具有AT&T语法(目标为最后vs intel语法也要记住intel是创建的,并使这些处理器首先具有目标)在两个或多个不同的汇编器上,其余语法可能是不兼容的,正如您从fasm中应该了解的那样。

Intel最初的定义是通过重载mov助记符而不是隔离寄存器到寄存器,内存到寄存器等来使其变得更加复杂。其他指令集的作用类似于

ldrb r0,[r1]
ldr r0,[r1]

表示这是从某个地址的内存中读取(加载)的8位或32位。不需要其他语法,但是对于x86,历史上类似

mov [bx], 5

该指令是不止一个

mov word ptr [bx], 5

可以,但是有些汇编程序您必须使用大写字母而不是小写字母,等等。

因此,就像对Python vs JAVA进行编程一样,您需要了解所编程语言的语法。使用x86,您可以尝试类似

mov bx,5
mov 5,bx

看看有什么抱怨或可能需要

mov %bx,5
mov 5,%bx

要消除一个错误,另一个汇编器要使用另一种汇编语言。

然后您进入其他目标,例如arm,mip等,它们的语法和/或指令将在某种程度上与x86不同。然后,针对该目标的各种汇编器之间可能会存在语言差异。由于某些原因,移植gnu汇编程序的人倾向于创建与芯片/ IP供应商定义的语言不兼容的语言。不是一个人在做,只是一个一致的主题。

简短的回答,没有打破,有些期待。语法与工具无关,而与目标无关。