Версия ассемблера - Assembler
Формулировка задачи:
Добрый вечер всем, столкунлся со следующей проблемой:
Не могу понять, какая в точности версия ассемблера мне нужна.
Вот несколько программ.
Этот пример Был взят из этой темы, большое спасибо автору.
Вот еще одна программа:
Устанавливаю под 64-разрядную Windows 7.
В программе Far Manager они должны компилироваться с помощью команд:
Значит, похоже, мне нужны некая версия Tasm? Но вопрос в том какая именно?
.MODEL SMALL
.STACK 100h
.DATA
HelloMessage DB 'Hello World',13,10,'$'
.CODE
START:
mov ax,@data
mov ds,ax
mov ah,9
mov dx,OFFSET HelloMessage
int 21h
mov ah,4ch
int 21h
END START.model small
.data
num1 db 2
num2 db 3
.stack 100h
.CODE
start:
mov ax, @data
mov ds, ax
mov ah, num1
add ah, num2
mov AX, 4c00h
int 21h
end startc:\tasm\bin\tasm /z /zi /n bios,, c:\tasm\bin\tlink /v /x bios,,
Решение задачи: «Версия ассемблера»
textual
Листинг программы
@echo off
setlocal EnableExtensions
echo.
if [%1] == [] (
echo Usage:
echo TASM source.asm /dos^|/exe^|/com^|/gui^|/con^|/dll [/nolink] [/pause] [link_params]
exit /b
)
set tasmpath=D:\Lang\Asm\tasm
set dosbox="C:\Program Files (x86)\DOSBox-0.74\DOSBox.exe"
set dos=0
set Tparams=
set Lparams=
if /i [%2] == [/dos] (set dos=1&set Tparams=/m /ic:\include&set Lparams=/t /3 /x&shift /2) else (
if /i [%2] == [/com] (set dos=1&set Tparams=/m /ic:\include&set Lparams=/t /3 /x&shift /2) else (
if /i [%2] == [/exe] (set dos=1&set Tparams=/m /ic:\include&set Lparams=/3 /x&shift /2) else (
if /i [%2] == [/gui] (set Tparams=/m /mx /i%tasmpath%\include&set Lparams=/Tpe /aa /c /x /L%tasmpath%\lib&shift /2) else (
if /i [%2] == [/con] (set Tparams=/m /mx /i%tasmpath%\include&set Lparams=/Tpe /ap /c /x /L%tasmpath%\lib&shift /2) else (
if /i [%2] == [/dll] (set Tparams=/m /mx /i%tasmpath%\include&set Lparams=/Tpd /aa /c /x /L%tasmpath%\lib&shift /2) else (
echo TASM: Please specify platform/format!
exit /b
))))))
set pause=0
set nolink=0
:nextparam
if /i [%2] == [/nolink] (set nolink=1) else (
if /i [%2] == [/pause] (set pause=1) else goto go
)
shift /2
goto nextparam
:go
if %dos% == 1 (
if not exist %tasmpath%\dbox$cmp.tmp md %tasmpath%\dbox$cmp.tmp
copy /b "%~dp1*.*" %tasmpath%\dbox$cmp.tmp\ > nul
echo @echo off > %tasmpath%\dbox$cmp.bat
echo cd dbox$cmp.tmp >> %tasmpath%\dbox$cmp.bat
echo c:\bin\tasm %Tparams% %~nxs1 >> %tasmpath%\dbox$cmp.bat
if %nolink% == 0 echo if exist %~ns1.obj c:\bin\tlink %Lparams% %~ns1.obj %2 %3 %4 %5 %6 %7 %8 %9 >> %tasmpath%\dbox$cmp.bat
if %pause% == 1 (echo pause >> %tasmpath%\dbox$cmp.bat) else (echo if errorlevel 1 pause >> %tasmpath%\dbox$cmp.bat)
%dosbox% %tasmpath%\dbox$cmp.bat -exit -noautoexec
if %nolink% == 0 (
if exist %tasmpath%\dbox$cmp.tmp\%~ns1.com (copy %tasmpath%\dbox$cmp.tmp\%~ns1.com "%~dpn1.com" > nul) else if exist %tasmpath%\dbox$cmp.tmp\%~ns1.exe copy %tasmpath%\dbox$cmp.tmp\%~ns1.exe "%~dpn1.exe" > nul
) else (
if exist %tasmpath%\dbox$cmp.tmp\%~ns1.obj copy %tasmpath%\dbox$cmp.tmp\%~ns1.obj "%~dpn1.obj" > nul
)
del %tasmpath%\dbox$cmp.bat > nul
del /q %tasmpath%\dbox$cmp.tmp\* > nul
rd %tasmpath%\dbox$cmp.tmp > nul
) else (
%tasmpath%\bin\tasm32.exe %Tparams% %1
if %nolink% == 0 (
if exist "%~dpn1.obj" (
%tasmpath%\bin\tlink32.exe "%~dpn1.obj" %Lparams% %2 %3 %4 %5 %6 %7 %8 %9
del "%~dpn1.obj"
)
)
if %pause% == 1 pause
)
Объяснение кода листинга программы
- Установлены переменные окружения:
tasmpath- путь к ассемблерному компилятору TASM;dosbox- путь к исполняемому файлу DOSBox;dos- флаг, указывающий, что будет использоваться платформа DOS;Tparams- параметры компиляции для TASM;Lparams- параметры линковщика для TASM;pause- флаг, указывающий, нужно ли приостановить выполнение после завершения компиляции;nolink- флаг, указывающий, нужно ли пропустить линковку.
- Проверено, какой формат был передан в качестве параметра:
/dos- компиляция для платформы DOS;/com- компиляция для платформы DOS и создание файла с расширением.com;/exe- компиляция для платформы DOS и создание файла с расширением.exe;/gui- компиляция для платформы GUI (графический интерфейс);/con- компиляция для платформы консоли;/dll- компиляция для платформы DLL.
- Если выбран формат, отличный от
/dos, создан файл с расширением.bat, который содержит все необходимые команды для компиляции и линковки. - Если выбран формат
/dos, созданы временные файлы для компиляции и линковки, а затем выполнен скрипт.bat. - Если выбран формат, отличный от
/dos, выполнен ассемблерный компилятор TASM32.EXE. - Если выбрана платформа GUI или консоли, выполнен линковщик TLINK32.EXE.
- Если выбрана платформа DOS и файл
.objсуществует, он удален. - Если выбрана платформа DOS и файл с расширением
.comили.exeсуществует, он скопирован в ту же директорию с новым именем, соответствующим имени исходного файла без расширения. - Если выбрана платформа GUI или консоли, файлы временной директории удалены, а сама директория удалена.