簡體   English   中英

組裝:閱讀組裝說明行

[英]Assembly: reading lines of assembly instructions

我正在開發一個程序,該程序將從包含匯編指令的文件中讀取輸入,然后輸出每行是否包含標簽,操作碼,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標志?

最簡單但不完美的就是這樣...

首先確定一行上是否有注釋,然后從該注釋中刪除(從物理上或將有效行長縮短至第一個分號的位置)。

然后查看剩余的內容是否有冒號。 如果有,則在其左側為標簽名稱。 您可以刪除它(或者再次跳過它,假裝該行在冒號之后開始)。

如果還有剩余,則第一項是操作碼。 如果后面有任何內容,則為操作數(一個或多個,以逗號分隔)。

這不是一個完美的解決方案,因為在各種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不只是因為有一個逗號前右它的操作數。 最后, ;' 只是因為其中有一個分號而未發表評論。

為了完全支持所有這些可能性,您需要實現一個更復雜的解決方案,其中可能涉及解析狀態機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM