我想在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
你能帮助我吗?我的错在哪里? 也许我选择了错误的方法来实现我想要的东西? 请帮助....答案 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)。
如果我找到直接在多段程序中显示字符串的方法,我会发布答案。