装配:阅读装配说明书

时间:2011-10-18 06:05:48

标签: parsing assembly x86

我正在研究一个程序,该程序从包含汇编指令的文件中读取输入,然后输出每行是否包含标签,操作码,操作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标志?

1 个答案:

答案 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不是操作数,因为它之前有一个逗号。最后,;'不是评论,因为那里有分号。

要完全支持所有这些可能性,您需要实现更复杂的解决方案,可能涉及解析状态机。