为什么某些ASM指令有这么多变化而不是让计算机解释它们

时间:2018-02-03 20:14:59

标签: assembly x86

所以我有一个问题。目前我正在研究装配。我并不是真的想要编写代码,但它对我正在工作的一些C / C ++项目很有用。

我正在查看此页面:http://ref.x86asm.net/coder32.html并且似​​乎有很多不同的说明变体。

像:

mov eax, eax

不同
mov 0xaddress, 0xaddress

为什么计算机不会根据"参数"来解释这些??

1 个答案:

答案 0 :(得分:1)

cpu会根据x86中的参数解释这些。有一个字节,一个操作数和作为您的文档,当然还有一些更好的文档显示操作数表以及它们映射到的内容。基于操作数,它可能需要另一个字节(或更多),但是当它解析初始操作数之后的每个字节时,图片变得更清楚cpu应该做什么,这是一个mov但是什么样的,好吧它是一个寄存器寄存器,好的是两个寄存器,最后是一些指示每个寄存器的位。这是一个mov,好吧什么样的,寄存器,立即,然后更多的操作数指示寄存器和立即。

但我们不认为这些是操作数的函数。所以我们通常不会以这种方式编写汇编语言。相反,汇编语言旨在缩小特定机器语言位以获得非常具体的指令

mov ax,1234h
mov ah,byte ptr[ax]

如果我记得正确的英特尔实际上可能不关心位或其他功能,你可以实现两种不同的有效方式(参见a86文档或是as86?)

英特尔确实/确实有一个指令集(不是x86或相关的)确实有一个基于功能的汇编语言,我不会说它是什么但我只是搜索并且有合法和/或非法的课堂讲座等展示一些这种语法。

alu[x,--,y,+,z]

可能有意地类似于一个函数,这就是说x = y + z; 我认为你可以使用parens代替括号,宏语言看起来也像函数

  mymacro(w,x,y,z)

这些项目可以在你想要的宏中使用,就像C中的定义一样,宏只是按原样推送文本,所以你必须确保它符合。

  alu[w,--,x,+,y]
  alu[w,--,w,and,z]

我见过有人使用C作为汇编程序,这非常非常酷,很容易实现汇编程序,因为C编译器负责所有的解析

add(r0,r1);
sub(r2,r3);

您将后端链接/包含在主“程序”

#define r0 0
#define r1 1
#define r2 2
#define r3 3

void add ( unsigned int a, unsigned int b)
{
   emit(0x4140|(ra<<3)|rb);
}

我不记得条件是如何工作的我认为有类似

的东西
label("hello");
...
bne("hello");

和前向引用最后修补了......

可以用这样的方法在创纪录的时间内敲出一个汇编程序......但是大多数人可能从未见过这种情况,也没有试图使用或实现它。

有些处理器是固定长度的指令,有些是可变的,变量更像是操作码,你可以从中找出操作数多少的操作码。固定长度仍然有操作数字段/位,但然后根据解释剩余的位,非常容易实现一个单一时钟周期内的解码器,而不是你不能有一个宽的移位寄存器x86固定在一个时钟同样,但从历史上看,它不是如何运作的,CISC倾向于微码。

汇编语言由汇编程序定义,汇编程序是解析它的程序。由汇编程序的作者决定语法,只要你符合机器语言就可以制作任何你能想到的语法,没有任何理由你不能使x86汇编程序成为函数喜欢操作数。

  addrr(ax,bx);  //mov ax,bx
  movbptr(ah,bx); //mov ah,byte ptr bx

只要您能够实现足够有用的指令,理想情况下就是整个指令集。理想情况下,每一行都会创建一个特定的指令。您在此历史中遇到的问题是找到此工具的用户/使用者。几乎没有人编码纯粹的汇编语言,所以主要的消费者是编译器,而那些已经有他们用作输出的汇编语言的人,他们不必写的(现有的像气体)。