所以我有一个问题。目前我正在研究装配。我并不是真的想要编写代码,但它对我正在工作的一些C / C ++项目很有用。
我正在查看此页面:http://ref.x86asm.net/coder32.html并且似乎有很多不同的说明变体。
像:
mov eax, eax
与
不同mov 0xaddress, 0xaddress
为什么计算机不会根据"参数"来解释这些??
答案 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
只要您能够实现足够有用的指令,理想情况下就是整个指令集。理想情况下,每一行都会创建一个特定的指令。您在此历史中遇到的问题是找到此工具的用户/使用者。几乎没有人编码纯粹的汇编语言,所以主要的消费者是编译器,而那些已经有他们用作输出的汇编语言的人,他们不必写的(现有的像气体)。