基本操作概念组装

Basic Operational Concepts Assembly

前段时间我在 fasm 中学习了一些 x86 汇编。我知道名为 ADD 的指令。例如:

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

但是今天我读了 Carl Hamacher 的一本关于 Computer Organization 的书,它说:

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 页)。

首先,有许多不同的指令集,x86 只是一个,它已经发展了数十年,添加了指令,并且更改或重新解释了旧指令工作方式的定义。

其次,汇编语言是由汇编程序定义的,即读取汇编语言的程序。不像 C 或 Python 或 JAVA 或其他有明确定义的地方,特别是每个人都遵守。汇编语言可以按照汇编程序作者的意愿进行定义。语言没有规则,唯一的规则(如果有的话)由硬件控制,要使该工具有用,您需要生成可执行的机器代码。

从历史上看,芯片供应商或在 IP 核的情况下,核心供应商提供他们自己的文档,其中定义了机器代码和汇编语言,供应商或代表他们的人在某个地方创建了符合该语言的汇编器,在 x86

的情况下
add ah,bl

表示ah = ah + bl

后来有人出现了(这个工具有这样做的习惯,将汇编语言更改为与 chip/core 供应商工具不兼容)和 created/ported 一个汇编程序,其中

add ah,bl

表示bl = bl + ah

语言差异不仅限于首先或最后的目的地,包括指令在内的整个语言都是语言的一部分,即使您有 AT&T 语法(目的地最后与英特尔语法记住英特尔创建并使这些处理器具有目的地优先)在两个或多个不同的汇编器上,其余语法可能不兼容,正如您应该从 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、mips 等,它们的语法 and/or 指令在某些方面与 x86 不同。那么在针对该目标的各种汇编程序中,可能并且将会存在语言差异。出于某种原因,移植 gnu 汇编程序的人们倾向于创建与 chip/IP 供应商定义的语言不兼容的语言。不是一个人做的只是有点一致的主题。

简答,不破,有点意料之中。语法与工具相关而不是目标。