Как запустить файл MS-DOS .asm с помощью VS2013 или MASM32?

Вот мой код test.asm. По сути, «ничего» внутри, потому что сначала нужно, чтобы он собирался и работал без ошибок.

.model small
.stack 64
.data
.code

main proc
  mov ax,@data
  mov ds,ax

  mov ax,4c00h
  int 21h
main endp
end main

Я пытался использовать визуальную студию 2013, включая библиотеку, добавлял линкеры и все эти руководства с веб-сайтов, но не повезло. Всегда получаю это сообщение об ошибке «ошибка A2006: неопределенный символ: DGROUP» как для MASM32, так и для Visual Studio 2013.

Пожалуйста, проведите меня шаг за шагом по сборке и запуску. Кроме того, я пытался использовать dosbox, и это все, что я могу сделать.. введите здесь описание изображения Продолжайте использовать недопустимую команду. Что я делаю не так? :(


person Student    schedule 30.11.2014    source источник


Ответы (3)


Перефразируя: как накачать велосипедную шину картошкой?

Ваша сборка 16-битная, и вы ориентируетесь на MS-DOS (вызов int21 — это раздача). Ни VS2013, ни MASM32 не способны генерировать исполняемые файлы DOS. Попробуйте другой ассемблер, т.е. е. НАСМ. В качестве альтернативы, почитайте о современной сборке.

person Seva Alekseyev    schedule 30.11.2014
comment
Спасибо за предложение. Я все еще новичок в языке ассемблера. Я посмотрю на NASM больше. - person Student; 01.12.2014
comment
Изучение 32-битного плоского ассемблера было бы более полезным, ИМХО. DOS не самая популярная среда в наши дни. Единственная причина, по которой вы начали с DOS, заключается в том, что многие популярные руководства по ассемблеру были написаны еще во времена DOS. - person Seva Alekseyev; 01.12.2014

VS не включает 16-битный набор инструментов. Наиболее распространенным 16-битным ассемблером/набором инструментов Microsoft является MASM (ML.EXE) 6.11. (Есть патч для обновления до 6.14, но тогда вам нужен расширитель DOS или вам нужно запустить его из 32-битного окна консоли DOS). Возможно, для скачивания доступны и другие 16-битные версии MASM. Надеюсь, они будут включать инструкции по установке и настройке переменных среды.

Существуют и другие программы, которые идут вместе с 16-битным набором инструментов Microsoft, компоновщик, codeview (отладчик исходного кода), nmake (утилита make), h2inc (преобразует файл c .h в файл ассемблера .inc), qh (быстрая помощь) , pwb (рабочее место программиста, текстовая интегрированная среда разработки) и 16-битные версии C/C++.

DGROUP обычно группирует _data, _bss и stack в один сегмент, но если вы используете .model, вам не нужно ссылаться на него, и имена будут другими, например, @data вместо _data. Пример файла .asm (,c означает, что используется соглашение о вызовах C).

        .model  small,c
        .data
;       ...                     data goes here
        .stack  2048
        .code
        assume  cs:@code,ds:@data,es:nothing,ss:nothing
;-----------------------------------------------------------------------;
;       main                                                            ;
;-----------------------------------------------------------------------;
main    proc    far
        mov     ax,@data
        mov     ds,ax
        mov     es,ax
;       ...                     code goes here
        mov     ax,04c00h
        int     21h
main    endp
        end     main
person rcgldr    schedule 30.11.2014
comment
Ваше руководство работает, но я не хочу менять код на другой метод из-за моего школьного проекта. Мне просто нужен способ запустить его, если masm и vs не могут этого сделать. - person Student; 01.12.2014

Как создать программу MSDOS с помощью MASM32 и запустить ее в DOSBox

Загрузите MASM32 и DOSBox для Windows и установите их. После этого MASM32 должен быть в C:\masm32, а DOSBox в %ProgramFiles^(x86)%\DOSBox-0.74 соответственно. %ProgramFiles%\DOSBox-0.74.

Запустите быстрый редактор MASM (qeditor.exe) и загрузите menus.ini.

Прокрутите вниз до

&Run Program,"{b}.exe"

[&Tools]

Вставьте пять строк:

&Run Program,"{b}.exe"
-
Assemble 16-bit .asm to .obj,cmd /C\masm32\bin\ml.exe /c "{a}" & pause
Link 16-bit .obj to .exe,cmd /C\masm32\bin\link16.exe "{b}" ,,,,, & pause
Build 16-bit .asm to .exe,cmd /C\masm32\bin\ml.exe /Bl"C:\masm32\bin\link16.exe" "{a}" & pause
Run in DosBox,cmd /Cstart /D"%ProgramFiles(x86)%\DOSBox-0.74" DOSBox.exe "{b}.exe"

[&Tools]

В конце концов вам придется изменить %ProgramFiles(x86)% на %ProgramFiles% - там, где был установлен DOSBox. Введите в командной строке SET и посмотрите, какие каталоги выделены для этих переменных среды. Сохраните файл и перезапустите быстрый редактор MASM32. Теперь у вас в разделе «Проект» три новых пункта в конце.

Введите программу сборки MS-DOS в синтаксисе MASM:

.MODEL small
.STACK 1000h
.DATA
    hello db "Hello world!", 13, 10, '$'
.CODE
main PROC
    mov ax, @DATA           ; Initialize DS
    mov ds, ax

    mov dx, OFFSET hello    ; You can also write lea dx, hello
    mov ah, 09h             ; http://www.ctyme.com/intr/rb-2562.htm
    int 21h

    mov ax, 4C00h           ; http://www.ctyme.com/intr/rb-2974.htm
    int 21h
main ENDP
END main

и сохраните его под именем 8.3, например. hello.asm.

Нажмите Проецировать/собрать 16-разрядный .asm в .exe и закройте окно, нажав любую клавишу. Теперь нажмите Проект/Выполнить в DosBox. Откроются окна DOSBox, и программа запустится. Окна DOSBox остаются открытыми, поэтому вы запускаете программу в командной строке, например. введите "hello.exe".

person rkhb    schedule 10.04.2017
comment
У меня есть программа на ASM, которую я написал еще в 1993 году, и я понятия не имею, какой ассемблер использовать для ее повторной компиляции. Это не совсем похоже на программу, которую вы там разместили. Он начинается с общедоступного «КОДА» байта сегмента cseg. Я считаю, что он должен создать файл .COM. У вас есть какие-либо идеи, как мне его скомпилировать? - person mycelo; 26.04.2018
comment
@mycelo: чтобы создать файл .COM, вы должны добавить переключатель компоновщика /TINY. Альтернативой является переход на Turbo Assembler (TASM): sourceforge.net/projects/guitasm8086. У TASM есть собственный тег на этом сайте: stackoverflow.com/questions/tagged/tasm. - person rkhb; 28.04.2018