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

Assembly MASM错误未知重定位类型(1),代码为16b,assembly,x86,masm,x86-16,masm32,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 cre

我对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生成的My
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

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

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

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

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

\masm32\bin\link16.exe "filename.obj" ;
filename.obj
是要链接的文件名。更改它以适合您的项目。末尾的分号将默认所有文件名,并且不会提示输入这些文件名。然后,您必须修改
makeit.bat
中的
ml
行,以便它不会生成
coff
文件。为此,请删除
/coff
选项:

\masm32\bin\ml /c "filename.asm"
同样,可以用项目中的文件名替换
filename.asm


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

  • 删除
    stack db 100 dup(?)
    并改用
    .stack
    指令

  • 您需要在DS中设置
    MSG
    的段值:

    对于
    .small
    模型,只有一个
    数据段。在
    .small
    模型中,
    .data
    .data?
    将组合成一个
    .data
    段。使用此内存模型,您还可以通过以下方式初始化DS:

  • 对于DOS EXE程序,您需要使用


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

对于以上简单问题的答案,我要说谢谢。事实上,我的问题的答案是link16.exe是生成16位代码所必需的。
另一种简单快速地汇编代码的方法是使用WinAsm,这是我通过谷歌搜索发现的一个较旧的IDE。

添加命令行,说明如何调用MASM(这将更有可能吸引具有MASM知识的人来尝试)。您希望将
ds
加载到地址的
部分,而不是
偏移量
。即
mov-ax,段MSG
mov-ds,ax
mov-bx,offset-MSG
=>
ds:bx
包含20位物理内存地址的完整段:偏移表示。虽然从错误的角度看,您的MASM设置似乎有一些更基本的错误,可能将该源代码视为32/64b,因为您编写的代码应该在16b中编译,这是没有意义的。没有命令行,我使用makeit.bat(它是IDE命令)
makeit.bat
是DOS批处理文件(类似于unix shell脚本)。您可以在文本编辑器中打开它,查看调用了哪些命令以及使用了哪些参数。“来自MASM”。等等,MASM只是汇编程序,您不能“在其中”,你是说Visual Studio吗?然后你仍然可以用一些标志来检查调用了哪些命令。我不能具体说明,因为我在过去10年中没有看到Microsoft产品,我已经完全迁移到linux和其他*NIX系统,在这些系统中,这些操作很简单(只要你不介意不同的汇编语法,我个人更喜欢NASM)。发布版本可能会有所帮助…是的,我知道我可以编辑.bat文件,我只是将其复制到了C:并且它不允许我编辑它。C:\>键入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”如果错误级别1转到errasm\masm32\bin\PoLink/子系统:控制台“派生1.obj”如果错误级别1转到errlink dir“派生1.*”转到结束:errlink echo u echo Link error转到结束:errasm echo u echo Assembly error转到结束:TheEnd pausemov ax,@data我收到错误未定义的符号:DGROUP有人说要玩这个模型是的,它适用于16个汇编程序。我正在研究这个问题。汇编错误可以修复在批处理文件中,使用命令行选项/omf:
ml/c/omf example.asm
,但我不确定如何获得16位链接输出。@ValentinBogatu-我只能使用16位链接器来获得该输出。在我的情况下,我有一整套16个构建工具。您可以找到并下载16位工具集Visual c/c++1.52c.Visual的副本32位工具集Visual C/C++4.1中也包含C/C++1.52c,但这将很难找到。我将尝试在线查找16位汇编程序。:)
.stack 100h
mov ax, seg MSG
mov ds, ax 
mov ax, @data
mov ds, ax
mov ax, 4c00h
int 21h