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

时间:2017-11-22 16:03:28

标签: assembly x86 masm x86-16 masm32

我对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

3 个答案:

答案 0 :(得分: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" ;

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。