首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇编:读取汇编指令行

汇编:读取汇编指令行
EN

Stack Overflow用户
提问于 2011-10-18 14:05:48
回答 1查看 650关注 0票数 1

我正在开发一个程序,它可以从包含汇编指令的文件中读取输入,然后输出每一行是否包含标签、操作码、oper1、oper2或注释。这是我到目前为止所知道的:

代码语言:javascript
复制
        .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

程序基本上是这样输出的:

代码语言:javascript
复制
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标志?

EN

回答 1

Stack Overflow用户

发布于 2011-10-18 15:46:27

最简单的,但不是完美的,应该是这样的…

首先确定一行上是否有注释,然后将其删除(物理删除或将有效行长度缩短到第一个分号的位置)。

然后看看剩下的部分里有没有冒号。如果有,则在其左侧是标签名称。您可以删除它(或者再次跳过它,假装该行是从冒号开始的)。

如果还有剩余的东西,第一项就是操作码。如果后面还有什么,那就是操作数(一个或多个用逗号分隔)。

这不是一个完美的解决方案,因为在各种x86汇编程序中都支持许多更复杂的结构,例如,如果指定了一个段,则会有一个与标签无关的冒号:

代码语言:javascript
复制
mov al, byte ptr es:[bx]

上面的mov al, byte ptr es不是一个标签。

或者,您可以像下面这样声明一个数组。数组的名称不是操作码,它实际上是一个标签,但后面没有冒号:

代码语言:javascript
复制
MyArray db 1,2,3,4,5 ; array of 5 bytes

您还可能在字符和字符串文字中遇到标点符号,这些标点符号没有将行分隔为标签、操作数和注释:

代码语言:javascript
复制
MyString db ':,a;'

在这里,MyString db '不是一个标签,因为它后面有一个冒号。a不是一个操作数,因为它前面有一个逗号。最后,;'不是一个注释,因为其中有一个分号。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7803072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档