如何解析含任意空格的TASM mov指令字符串至变量?
解析MOV指令字符串为操作数变量的实用方案
嘿,我来帮你搞定这个MOV指令解析的问题!看起来你需要一个能处理汇编里MOV指令字符串的解释器,不管输入里有多少空格,都能精准提取出两个操作数opr1和opr2,甚至能从多条指令的混合字符串里挑出MOV指令来解析对吧?
下面我一步步给你讲思路和具体实现:
第一步:先给输入字符串“洗个澡”——预处理
不管输入里有多少连续空格、首尾空格,咱们先统一处理成干净的格式:把所有空白字符(空格、制表符啥的)替换成单个空格,再去掉字符串首尾的空白。这一步用正则表达式就能轻松搞定,比如用\s+匹配所有连续空白,替换成单个空格,再trim一下。
举个例子:
- 输入
mov cs, ax→ 处理后变成mov cs, ax - 输入
mov ah, 09h mov dx, offset entstr int 21h→ 处理后变成mov ah, 09h mov dx, offset entstr int 21h
第二步:区分单条MOV指令和多条指令的情况
情况1:输入是单条MOV指令
比如mov cs, 9或者mov cs, ax这种,咱们用一个简单的正则就能直接提取操作数:
^\s*mov\s+([^,]+),\s+(.+)\s*$
解释下这个正则:
^\s*:匹配开头的任意空格mov\s+:匹配MOV指令的助记符,后面跟至少一个空格([^,]+):捕获第一个操作数(直到遇到逗号),之后咱们再trim掉它前后可能带的空格,\s+:匹配逗号和后面的空格(.+):捕获第二个操作数,直到字符串结尾\s*$:匹配结尾的任意空格
情况2:输入是多条指令的混合字符串
比如你给的第一个例子mov ah, 09h mov dx, offset entstr int 21h,这里面有三条指令,咱们需要先把所有MOV指令挑出来,再分别解析操作数。用这个正则就能匹配所有MOV指令:
mov\s+([^,]+),\s+(.+?)(?=\s+(?:mov|int|ret|call|\Z))
这个正则的关键是用了正向预查(?=\s+(?:mov|int|ret|call|\Z)),它会确保匹配的MOV指令后面要么是另一条指令(比如int、call),要么是字符串结尾,这样就不会把后续指令的内容误当成当前MOV的操作数。
第三步:具体代码实现(以Python为例)
我写了个示例函数,能同时处理单条和多条指令的情况,你可以参考:
import re def parse_mov_instruction(input_str): # 预处理:统一空白格式 cleaned_input = re.sub(r'\s+', ' ', input_str).strip() # 先尝试匹配单条MOV指令 single_mov_regex = r'^mov\s+([^,]+),\s+(.+)$' single_match = re.match(single_mov_regex, cleaned_input, re.IGNORECASE) if single_match: # 提取操作数并去掉多余空格 opr1 = single_match.group(1).strip() opr2 = single_match.group(2).strip() return {"opr1": opr1, "opr2": opr2} # 如果是多条指令,提取所有MOV指令 multi_mov_regex = r'mov\s+([^,]+),\s+(.+?)(?=\s+(?:mov|int|ret|call|\Z))' multi_matches = re.finditer(multi_mov_regex, cleaned_input, re.IGNORECASE) result_list = [] for match in multi_matches: opr1 = match.group(1).strip() opr2 = match.group(2).strip() result_list.append({"opr1": opr1, "opr2": opr2}) return result_list # 测试几个示例 print(parse_mov_instruction("mov ah, 09h mov dx, offset entstr int 21h")) # 输出:[{'opr1': 'ah', 'opr2': '09h'}, {'opr1': 'dx', 'opr2': 'offset entstr'}] print(parse_mov_instruction("mov cs, 9")) # 输出:{'opr1': 'cs', 'opr2': '9'} print(parse_mov_instruction(" mov cs, ax ")) # 输出:{'opr1': 'cs', 'opr2': 'ax'}
一些额外的小提示
- 我加了
re.IGNORECASE标志,这样不管输入是mov还是MOV都能匹配到,更灵活。 - 如果需要处理更复杂的操作数(比如
mov [bx+si], 0x1234这种带括号的内存地址),可以把正则里的[^,]+改成([\w\[\]+-]+),这样就能匹配包含括号、加减号的操作数了。 - 如果你的解释器是用其他语言写的(比如C++、Java),思路是一样的,只是正则的语法细节略有不同,核心都是预处理+正则匹配提取。
内容的提问来源于stack exchange,提问作者Dmitry Sokolov
相关产品推荐
相关产品推荐

