代码之家  ›  专栏  ›  技术社区  ›  Valentin Bogatu

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

  •  3
  • Valentin Bogatu  · 技术社区  · 7 年前

    我很擅长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位代码)。我试图做的是加载指向的指针。数据输入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
    
    3 回复  |  直到 7 年前
        1
  •  5
  •   Michael Petch    7 年前

    这个 MASM32 包不支持16位可执行文件的生成,尽管改变这种行为并不困难。这个 MASM公司 中的汇编程序 MASM32 包将生成16位代码,但提供的链接器不会生成16位可执行文件。这会导致您看到的错误类型。

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

    位置 link16.exe 进入 \masm32\bin 目录您必须修改生成的 makeit.bat 文件调用链接器的线路(如 link.exe polink.exe )必须替换为:

    \masm32\bin\link16.exe "filename.obj" ;
    

    filename.obj ml 线路输入 做吧。球棒 所以它不会产生 coff 文件夹。为此,请删除 /coff 选项:

    \masm32\bin\ml /c "filename.asm"
    

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


    其他观察结果

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

    • 去除 stack db 100 dup(?) 并使用 .stack 而不是指令

      .stack 100h
      
    • 您需要设置的段值 MSG 在里面 配电系统 相反:

      mov ax, seg MSG
      mov ds, ax 
      

      .small 模型只有一个 data 段在 .小的 模型 .data .data? 将合并为一个 .数据 段使用此内存模型,您还可以初始化 配电系统 这种方式:

      mov ax, @data
      mov ds, ax
      
    • 对于DOS EXE程序,您需要使用类似 DOS exit interrupt

      mov ax, 4c00h
      int 21h
      

    如果您正在使用 MASM32 在64位版本的Windows上,您将无法直接运行您创建的16位应用程序。您必须下载一个模拟器,如 DOSBox 运行它,或安装具有可以运行代码的DOS/Windows版本的虚拟机(VMWare、VirtualBox、QEMU等)软件。

        2
  •  0
  •   rcgldr    7 年前

    对于16位程序集,对于点指令(如.model、.data、.code),语法为:

            mov     ax, @data
            mov     ds, ax
    
        3
  •  0
  •   Valentin Bogatu    7 年前

    对于所有为我回答上述简单问题的人,我要说谢谢。实际上,我的问题的答案是link16。exe是生成16位代码所必需的。 另一种简单快速地组装代码的方法是使用WinAsm,它是我在谷歌上找到的一个旧的IDE。