0

我想在 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

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

4

1 回答 1

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)。

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

于 2013-02-20T10:31:31.550 回答