gpt4 book ai didi

assembly - MASM 错误 Unknown relocation type (1) with 16b code

转载 作者:行者123 更新时间:2023-12-01 11:18:23 26 4
gpt4 key购买 nike

我很擅长 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

最佳答案

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

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

link16.exe 放入 \masm32\bin 目录。您必须修改生成的 makeit.bat 文件。调用链接器的行(如 link.exepolink.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 指令

    .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运行它,或安装具有可以运行代码的 DOS/Windows 版本的虚拟机(VMWare、VirtualBox、QEMU 等)软件。

关于assembly - MASM 错误 Unknown relocation type (1) with 16b code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47439100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com