Val*_*atu 3 x86 assembly masm masm32 x86-16
我很擅长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
Run Code Online (Sandbox Code Playgroud)
我一直收到符号MSG的错误未知重定位类型(1).我知道这是什么(当位移大于模型允许的位置或类似的东西时发生)但我不知道如何解决这个错误(我知道MASM是一个32位汇编程序,我正在尝试写一个16位代码).我想要做的是将指向.data的指针加载到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
Run Code Online (Sandbox Code Playgroud)
该MASM32包不附带用于16位可执行文件生成的支持,虽然它不是很难改变这种行为.MASM32包中的MASM汇编器将生成16位代码,但提供的链接器不会生成16位可执行文件.这会导致您看到的错误类型.
您可以下载支持16位目标的旧链接器的副本.我已经在我的服务器上下载了link16.exe(版本5.60.339 Dec 5 1994).
将link16.exe进入\masm32\bin目录.您将不得不修改生成的makeit.bat文件.调用链接器的行(如link.exe或polink.exe)必须替换为:
\masm32\bin\link16.exe "filename.obj" ;
Run Code Online (Sandbox Code Playgroud)
filename.obj是要链接的文件的名称.更改它以适合您的项目.末尾的分号将默认所有文件名,不会提示它们.然后,您必须修改该ml行,makeit.bat以便它不会生成coff文件.要做到这一点删除/coff选项:
\masm32\bin\ml /c "filename.asm"
Run Code Online (Sandbox Code Playgroud)
filename.asm可以再次替换为项目中文件的名称.
一旦您能够生成16位可执行文件,您的代码就会遇到一些问题:
请删除stack db 100 dup(?)并使用该.stack指令
Run Code Online (Sandbox Code Playgroud).stack 100h
您需要MSG在DS中设置段值:
Run Code Online (Sandbox Code Playgroud)mov ax, seg MSG mov ds, ax
使用该.small模型只有一个data部分.在该.small模型.data和.data?将被组合成单个.data部分.使用此内存模型,您还可以通过以下方式初始化DS:
Run Code Online (Sandbox Code Playgroud)mov ax, @data mov ds, ax
对于DOS EXE程序,您需要退出DOS退出中断等操作
Run Code Online (Sandbox Code Playgroud)mov ax, 4c00h int 21h
如果您在64位版本的Windows上使用MASM32,则无法直接运行您创建的16位应用程序.您必须下载像DOSBox这样的模拟器来运行它,或者安装可以运行代码的DOS/Windows版本的虚拟机(VMWare,VirtualBox,QEMU等)软件.