我正在研究一个程序,该程序从包含汇编指令的文件中读取输入,然后输出每行是否包含标签,操作码,操作1,操作2或注释。以下是我到目前为止的情况:
.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标志?
答案 0 :(得分:0)
最简单但不完美的将是这样的......
首先确定某条线上是否有注释,然后将其从那里移除(实际上或将有效线长度缩短到第一个分号的位置)。
然后看看剩下的是否有冒号。如果有,则在其左侧是标签名称。您可以删除它(或者再次跳过它,假装冒号后的行开始)。
如果还剩下任何东西,第一项是操作码。如果之后有任何内容,那就是操作数(一个或多个用逗号分隔)。
这不是一个完美的解决方案,因为在各种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
不是操作数,因为它之前有一个逗号。最后,;'
不是评论,因为那里有分号。
要完全支持所有这些可能性,您需要实现更复杂的解决方案,可能涉及解析状态机。