【问题标题】:FASM: macro to display stringFASM:显示字符串的宏
【发布时间】:2013-02-19 18:05:28
【问题描述】:

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

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

【问题讨论】:

    标签: dos fasm


    【解决方案1】:

    据我了解,这是因为 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)。

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

    【讨论】:

    • 在 int 21h 调用之前推送 cs/pop ds。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多