[英]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.