我对M68000很满意,但X86对我来说很不合适。我正在尝试用MASM组装这个简单的程序
.MODEL SMALL
.data?
ONE dB ?
TWO dB ?
stack db 100 dup(?)
.data
MSG db 13,10, 'Enter deree of polynomials: $'
MSG2 db 13,10, 'Enter coefficient of x^ $'
MSG3 db 13,10, 'The polynomial created is: $'
MSG4 db 13,10, 'The first derivative is: $'
STR1 db 255 DUP('$')
.code
_start:
mov ax, offset MSG
mov ds, ax
end _start
我一直在收到错误 符号MSG的未知重定位类型(1)。 我知道这是什么(当位移大于模型允许的位置或类似的东西时发生)但我不知道如何解决这个错误(我知道MASM是一个32位汇编程序,我正在尝试写一个16位代码)。我要做的是将指向.data的指针加载到ds寄存器中。
MASM32 IDE生成的makeit.bat
为:
@echo off
if exist "derivative 1.obj" del "derivative 1.obj"
if exist "derivative 1.exe" del "derivative 1.exe"
\masm32\bin\ml /c /coff "derivative 1.asm"
if errorlevel 1 goto errasm
\masm32\bin\PoLink /SUBSYSTEM:CONSOLE "derivative 1.obj"
if errorlevel 1 goto errlink dir "derivative 1.*" goto TheEnd
:errlink
echo _
echo Link error
goto TheEnd
:errasm
echo _
echo Assembly Error
goto TheEnd
:TheEnd
pause
答案 0 :(得分:5)
MASM32 程序包不支持16位可执行文件生成,但改变此行为并不困难。 MASM32 包中的 MASM 汇编程序将生成16位代码,但提供的链接器不会生成16位可执行文件。这会导致您看到的错误类型。
您可以下载支持16位目标的旧链接器的副本。我已经在我的服务器上下载了link16.exe(版本5.60.339 Dec 5 1994)。
将link16.exe
放入\masm32\bin
目录。您必须修改生成的makeit.bat
文件。调用链接器的行(如link.exe
或polink.exe
)必须替换为:
\masm32\bin\link16.exe "filename.obj" ;
filename.obj
是您要链接的文件的名称。更改它以适合您的项目。末尾的分号将默认所有文件名,不会提示它们。然后,您必须修改ml
中的makeit.bat
行,以便它不会生成coff
个文件。为此,请删除/coff
选项:
\masm32\bin\ml /c "filename.asm"
再次filename.asm
可以替换为项目中文件的名称。
一旦能够生成16位可执行文件,您的代码就会出现一些问题:
删除stack db 100 dup(?)
并使用.stack
指令代替
.stack 100h
您需要在 DS 中设置MSG
的细分值:
mov ax, seg MSG mov ds, ax
使用.small
模型,只有一个data
段。在.small
模型中.data
和.data?
将合并为一个.data
细分。使用此内存模型,您还可以通过以下方式初始化 DS :
mov ax, @data mov ds, ax
对于DOS EXE程序,您需要退出DOS exit interrupt
之类的内容mov ax, 4c00h int 21h
如果在64位版本的Windows上使用 MASM32 ,则无法直接运行您创建的16位应用程序。您必须下载像DOSBox这样的模拟器来运行它,或者安装虚拟机(VMWare,VirtualBox,QEMU等)软件以及可以运行代码的DOS / Windows版本。
答案 1 :(得分:0)
对于16位汇编,使用点指令(如.model,.data,.code),语法为:
mov ax, @data
mov ds, ax
答案 2 :(得分:0)
对于所有给我回答上述简单问题的人,我说谢谢。确实,我的问题的答案是link16.exe是生成16位代码所必需的。 我可以简单快速地编写代码的另一种方法是使用WinAsm,这是我通过谷歌搜索找到的旧IDE。