请问assembly领域中parsing的含义是什么,它与compiling有何区别?
汇编场景下Parsing的含义及与Compiling的区别
汇编场景中Parsing的具体定义
Parsing即语法解析,是汇编器处理汇编源代码的第一个核心阶段,完全遵循对应CPU架构的汇编语法规则执行以下操作:
- 过滤源代码中的空行、注释内容,将每一行有效代码拆解为最小语法单元(Token):包括汇编助记符(如
mov、jmp)、操作数(寄存器eax、立即数0xff、内存引用[ebp-4])、标签(如func_start:)、伪指令(如db、equ)等 - 校验语法合法性:如果出现不符合架构规则的写法(比如x86平台写
mov ax, bx, cx这种三操作数的mov指令),会直接在该阶段抛出语法错误,终止后续流程 - 初步构建符号表:记录所有标签、自定义常量对应的位置信息,为后续的地址回填做准备
注:汇编场景下的Parsing仅识别对应架构的汇编语法规则,不会做任何指令转换、逻辑优化操作
Parsing与Compiling的核心区别
要区分二者首先要明确概念边界:
- 所属流程关系不同
Parsing是所有编译/汇编流程的前置子阶段:不管是高级语言编译器,还是汇编器,执行后续操作的前提都是先完成Parsing。而Compiling(编译)是指将上层编程语言转换为下层可执行代码的完整流程,狭义的编译指高级语言到汇编代码的转换过程,广义的编译可以覆盖从高级语言到最终可执行文件的全流程,Parsing永远是Compiling流程中最靠前的一个环节。 - 核心能力边界不同
- Parsing仅处理语法层面的工作:输出结构化的Token流、抽象语法树(AST)或初步符号表,不会生成任何可执行的机器码相关内容,也不会校验代码的逻辑合理性(比如你把立即数往cs寄存器里写,语法是合法的,Parsing不会报错,错误会在后续阶段抛出)
- Compiling覆盖Parsing之后的所有核心流程:包括语义分析、代码优化、指令生成、地址重定向、甚至链接等操作,最终输出可执行的目标文件或机器码。
- 汇编场景下的特殊差异
如果你提到的Compiling特指汇编器将汇编代码转换为机器码的过程,那二者是包含和被包含的关系:Parsing是该过程的第一个步骤,只有Parsing完成且没有报错,后续才会执行助记符转机器码、地址回填、重定位等汇编操作。
举个简单的实例:对于x86汇编代码add eax, ebx
- Parsing阶段只会拆分识别出助记符
add、两个32位通用寄存器操作数,确认语法合法,记录到结构化数据中 - 后续属于Compiling范畴的汇编阶段,才会将这行代码转换为对应的二进制机器码
01 D8
内容的提问来源于stack exchange,提问作者Jizanthapus
相关产品推荐
相关产品推荐

