MASM错误带有16b代码的未知重定位类型(1)

Val*_*atu 3 x86 assembly masm masm32 x86-16

我很擅长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
Run Code Online (Sandbox Code Playgroud)

我一直收到符号MSG的错误未知重定位类型(1).我知道这是什么(当位移大于模型允许的位置或类似的东西时发生)但我不知道如何解决这个错误(我知道MASM是一个32位汇编程序,我正在尝试写一个16位代码).我想要做的是将指向.data的指针加载到ds寄存器中.

makeit.bat的MASM32 IDE生成的是:

@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
Run Code Online (Sandbox Code Playgroud)

Mic*_*tch 5

MASM32包不附带用于16位可执行文件生成的支持,虽然它不是很难改变这种行为.MASM32包中的MASM汇编器将生成16位代码,但提供的链接器不会生成16位可执行文件.这会导致您看到的错误类型.

您可以下载支持16位目标的旧链接器的副本.我已经在我的服务器上下载了link16.exe(版本5.60.339 Dec 5 1994).

link16.exe进入\masm32\bin目录.您将不得不修改生成的makeit.bat文件.调用链接器的行(如link.exepolink.exe)必须替换为:

\masm32\bin\link16.exe "filename.obj" ;
Run Code Online (Sandbox Code Playgroud)

filename.obj是要链接的文件的名称.更改它以适合您的项目.末尾的分号将默认所有文件名,不会提示它们.然后,您必须修改该ml行,makeit.bat以便它不会生成coff文件.要做到这一点删除/coff选项:

\masm32\bin\ml /c "filename.asm"
Run Code Online (Sandbox Code Playgroud)

filename.asm可以再次替换为项目中文件的名称.


其他观察

一旦您能够生成16位可执行文件,您的代码就会遇到一些问题:

如果您在64位版本的Windows上使用MASM32,则无法直接运行您创建的16位应用程序.您必须下载像DOSBox这样的模拟器来运行它,或者安装可以运行代码的DOS/Windows版本的虚拟机(VMWare,VirtualBox,QEMU等)软件.