我正在开发一个程序,它可以从包含汇编指令的文件中读取输入,然后输出每一行是否包含标签、操作码、oper1、oper2或注释。这是我到目前为止所知道的:
.model small
.8086
.data
line db 'LABEL=','$'
opcode db 'OPCODE=','$'
oper1 db 'OPER1=','$'
oper2 db 'OPER2=','$'
com db 'COMMENT=',13,10,13,10,'$'
filemsg db '... end of file',13,10,1Ah,'$'
.code
start:
mov ax,@data
mov ds,ax
progloop:
mov ah,8
int 21h
cmp al,1Ah
je eof
mov dl,al
mov ah,2
int 21h
cmp dl,3Ah ; this is where I would check for a colon. incomplete for now
cmp dl,0Ah
je eol
jmp progloop
eol:
mov dx,offset line
mov ah,9
int 21h
mov dx,offset opcode
mov ah,9
int 21h
mov dx,offset oper1
mov ah,9
int 21h
mov dx,offset oper2
mov ah,9
int 21h
mov dx,offset com
mov ah,9
int 21h
jmp progloop
eof:
mov dx,offset filemsg
mov ah,9
int 21h
exit: mov ax,4c00h
int 21h
end start程序基本上是这样输出的:
Addval: add [salary],1000 ; this line has all five operands
LABEL=Y OPCODE=Y OPER1=Y OPER2=Y COMMENT=Y
testit: ; a label and a comment
LABEL=Y OPCODE=N OPER1=N OPER2=N COMMENT=Y我不确定如何正确地处理这件事。我是否应该创建一个linemsg,并让它跟踪LABEL=、OPCODE=等?我应该如何跟踪Y/N标志?
发布于 2011-10-18 15:46:27
最简单的,但不是完美的,应该是这样的…
首先确定一行上是否有注释,然后将其删除(物理删除或将有效行长度缩短到第一个分号的位置)。
然后看看剩下的部分里有没有冒号。如果有,则在其左侧是标签名称。您可以删除它(或者再次跳过它,假装该行是从冒号开始的)。
如果还有剩余的东西,第一项就是操作码。如果后面还有什么,那就是操作数(一个或多个用逗号分隔)。
这不是一个完美的解决方案,因为在各种x86汇编程序中都支持许多更复杂的结构,例如,如果指定了一个段,则会有一个与标签无关的冒号:
mov al, byte ptr es:[bx]上面的mov al, byte ptr es不是一个标签。
或者,您可以像下面这样声明一个数组。数组的名称不是操作码,它实际上是一个标签,但后面没有冒号:
MyArray db 1,2,3,4,5 ; array of 5 bytes您还可能在字符和字符串文字中遇到标点符号,这些标点符号没有将行分隔为标签、操作数和注释:
MyString db ':,a;'在这里,MyString db '不是一个标签,因为它后面有一个冒号。a不是一个操作数,因为它前面有一个逗号。最后,;'不是一个注释,因为其中有一个分号。
要完全支持所有这些可能性,您需要实现一个更复杂的解决方案,可能涉及一个解析状态机。
https://stackoverflow.com/questions/7803072
复制相似问题