Сборка: чтение строк инструкции по сборке - PullRequest
1 голос
/ 18 октября 2011

Я работаю над программой, которая должна читать входные данные из файла, который содержит инструкции по сборке, и затем выводить, содержит ли каждая строка метку, код операции, 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?

1 Ответ

0 голосов
/ 18 октября 2011

Простейшим, но не идеальным, было бы что-то вроде этого ...

Сначала определите, есть ли комментарий к строке, а затем удалите его оттуда (либо физически, либо сократите эффективную длину строки доположение первой точки с запятой).

Затем посмотрите, есть ли в остатке двоеточие.Если есть, слева от него находится название метки.Вы можете удалить его (или снова просто пропустить его, притворяясь, что строка начинается после двоеточия).

Если все еще что-то осталось, первый элемент - это код операции.Если после этого есть что-то, то это операнды (один или несколько, разделенные запятыми).

Это не идеальное решение, потому что в различных ассемблерах 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 не операнд только потому, что перед ним стоит запятая.И, наконец, ;' не является комментарием только потому, что там есть точка с запятой.

Для полной поддержки всех этих возможностей вам потребуется реализовать более сложное решение, вероятно, с использованием конечного автомата синтаксического анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...