Assembly 基本作战概念汇编

Assembly 基本作战概念汇编,assembly,x86,cpu-architecture,fasm,Assembly,X86,Cpu Architecture,Fasm,不久前,我在fasm中学习了一些x86汇编。我知道名为ADD的说明。e、 g: ADD eax,edx ; Precisely ADD destination,source . The output gets stored in eax. 但今天我读了一本卡尔·哈马彻写的关于计算机组织的书,书上说: Add LOCA,R0 "This instruction adds the operand at memory location LOCA to the operand in a registe

不久前,我在fasm中学习了一些x86汇编。我知道名为ADD的说明。e、 g:

ADD eax,edx ; Precisely ADD destination,source .
The output gets stored in eax.
但今天我读了一本卡尔·哈马彻写的关于计算机组织的书,书上说:

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或其他语言不同,C、Python、JAVA或其他语言有一个明确的定义,每个人都特别遵守。汇编语言可以按照汇编程序作者的意愿定义。语言上没有任何规则,只有这些规则(如果有的话)是由硬件控制的,为了使工具有用,您需要生成可执行的机器代码

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

add ah,bl
表示ah=ah+bl

后来有人来了(这个工具有这样做的习惯,将汇编语言更改为与芯片/核心供应商的工具不兼容),并创建/移植了一个汇编程序,其中

add ah,bl
表示bl=bl+ah

语言差异不仅限于destination first或last,包括指令在内的整个语言都是语言的一部分,即使您有AT&T语法(destination last vs intel语法记住intel created并使这些处理器具有destination first)在两个或多个不同的汇编器上,语法的其余部分可能不兼容,您应该从fasm中了解到这一点

Intel最初的定义使mov助记符重载,而不是将寄存器与寄存器、内存与寄存器等隔离,从而使这一点更加复杂。其他指令集可以执行以下操作

ldrb r0,[r1]
ldr r0,[r1]
mov [bx], 5
mov bx,5
mov 5,bx
显示这是从某个地址的内存中读取(加载)8位或32位。不需要其他语法,但对于x86,历史上

ldrb r0,[r1]
ldr r0,[r1]
mov [bx], 5
mov bx,5
mov 5,bx
哪个指令是有多个

mov word ptr [bx], 5
好的,这很有帮助,但有些汇编程序必须使用大写字母,而不是小写字母,等等

因此,就像编程Python vs JAVA一样,您需要了解正在编程的语言的语法。使用x86,您可以尝试以下操作

ldrb r0,[r1]
ldr r0,[r1]
mov [bx], 5
mov bx,5
mov 5,bx
看看它抱怨什么,或者可能需要什么

mov %bx,5
mov 5,%bx
为了消除其中一个错误,另一个汇编程序使用另一种汇编语言

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


简短的回答,没有断章取义,有点出乎意料。语法与工具而不是目标绑定。

并非所有汇编语言都是相同的。在某些情况下,源在左侧,目标在右侧。“英特尔”语法恰好是“目标”后跟“源”。无论您阅读的内容是针对英特尔以外的其他产品(例如,英特尔x86没有r0和r1),那么,您是否建议在某些平台上添加源代码和目标代码?谢谢。添加源,目的地和添加目的地,源是一样的。由汇编程序创建与指令关联的底层机器代码。有许多用于x86体系结构的汇编程序。大多数使用Intel风格,其中目标后跟源(如NASM、MASM),但GNU assembler(默认情况下)使用AT&T语法,其中源是第一个,目标是第二个。由汇编程序将其语法转换为机器代码。由汇编程序的开发人员来指定语法。谢谢,伙计,我今年19岁,对内核和底层的东西非常感兴趣。你的帮助让我过得更好+999k respektEach CPU有自己的指令集,因此Intel的
add
和ARM的
add
很可能有些不同(我忽略了明显的差异,比如通用寄存器的不同名称和不同的二进制编码),就像它们可以设置不同的/ly标志一样(或者还有一些CPU根本不使用标志)但是,即使在同一个平台上,比如x86,也有不同语法的汇编程序,它们将产生完全相同的机器指令,比如MASM/NASM/FASM/中的
addeax,edx
。vs
addl%edx,%eax
在GAS中,但它们的语法即使在参数顺序上也不同……我没有任何话要感谢您提供这样的信息作为一名CSE 2年级的学生,这样的信息帮助我建立了坚实的基础,并领先于我的班级和老师。+对Mate来说,另一件事是数字语法,在C真正普及之前(在C发明很多年之后)将十六进制数描述为$7A或早期的英特尔语法7Ah,或者如果它是更大的数字0C3h,这并不少见,因为C3h是一个标签/字符串而不是一个数字。一旦C语法真正深入,我们习惯了键入0x7A或0xC3,汇编程序就开始支持这种语法。然后,一些汇编程序最终放弃了尾随的h符号。一些当时的公司是基于八进制的,直到指令被分解成3位字段,有些甚至有9位字节和36位字。pdp-11是一个尽管你认为仍然存在的版本。还有一个gcc后端和binutils