Assembly MASM错误未知重定位类型(1),代码为16b
我对M68000很在行,但X86对我来说很困难。我正在尝试用MASM组装这个简单的程序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
.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生成的Mymakeit.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?
段。使用此内存模型,您还可以通过以下方式初始化DS:.data
- 对于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