FASM:宏来显示字符串

时间:2013-02-19 18:05:28

标签: dos fasm

我想在FASM中创建宏,它可以直接打印字符串(int DOS),如下所示:

prints 'hey there!!!!'

我写了这样的代码:

format MZ

use16
stack 0x100
entry _TEXT@16:_start

;
macro prints str
{
    call @f
    db str, 0x24

    @@:
        pop dx
        mov ah, 9
        int 0x21
}

segment _DATA@16 use16
    msg db 'hi!', 0xd, 0xa, 0x24

segment _TEXT@16 use16
    _start:
        push _DATA@16
        pop ds

        prints 'hi there))) !!!!'
        prints 'me'

        mov ax, 0x4c00
        int 0x21
    ret

问题是:当我将_DATA @ 16段留空(没有任何变量)时,一切都很好。 但是当我在该段中定义新变量时,一些原始额外符号开始显示如下:http://board.flatassembler.net/files/err_758.png

你能帮助我吗?我的错在哪里? 也许我选择了错误的方法来实现我想要的东西? 请帮助....

1 个答案:

答案 0 :(得分:2)

据我所知,这是因为int 21h期望_DATA @ 16段中的偏移而不是_CODE @ 16段。所以,最简单的方法 - 在程序中只使用一个段或只使用.com文件。这是样本:

use16
org 0x100

macro prints [str*]
{
    pusha

    if str in <0xd, 0xa, 9>\
        | str eqtype ''

        call @f
        db str, 0x24

        @@:
            pop dx
    else
        mov dx, str
    end if

    mov ah, 9
    int 0x21

    popa
}

_start:
    prints 0xd, 0xa, 9
    prints 'hi!', 0xd, 0xa
    mov ax, msg
    prints ax, 0xd, 0xa
    prints msg

    int 0x20
ret

msg db 'hey there!', 0x24

它可以直接接受字符串,寄存器和变量中的字符串地址。 它还可以处理3个特殊字符 - 0xd(CR),0xa(LF)和9(TAB)。

如果我找到直接在多段程序中显示字符串的方法,我会发布答案。