Что не так с этой программой сборки? - PullRequest
3 голосов
/ 30 июня 2009

Я очень плохо знаком с программированием на ассемблере, так что это, вероятно, очень очевидная ошибка, но ...

Я использую MSVC ++, и когда я компилирую любой проект, имеющий файл с расширением .asm, он использует правило

NAME    EXTENSIONS    COMMAND LINE                                  RULE FILE
MASM    *.asm         ml.exe \c [All Options] [Additional Opti...   C:\Program Files\Microsoft Visual St...

И чтобы убедиться, что компилятор работает, я попробовал код

main proc
  mov ax, 10
main endp
end main

Но когда я его скомпилировал, я получил три ошибки

.\compt1.asm(1) : error A2034:must be in segment block : main
.\compt1.asm(2) : error A2034:must be in segment block
.\compt1.asm(3) : fatal error A1010:unmatched block nesting : main

Так что мне просто интересно, есть ли какая-то очевидная ошибка в части кода, или это испортил компилятор.

Ответы [ 6 ]

1 голос
/ 15 июля 2009

При быстром просмотре кажется, что сборка под VS.NET достаточно редка, и вам приходится настраивать пользовательские правила сборки. Вы можете найти пример здесь: http://www.cs.virginia.edu/~evans/cs216/guides/vsasm.html

Из любопытства чего ты пытаешься достичь? Если вы просто делаете это для развлечения или для изучения ассемблера, вам, вероятно, будет лучше использовать специальный редактор ассемблера. MASM32 SDK является одним из таких вариантов. Затем вы можете создать ссылку на библиотеки, созданные в проекте Visual Studio.

Если вы планируете использовать небольшие сегменты сборки в критических по времени элементах проекта C / C ++, я бы посоветовал внимательно изучить встроенные функции компилятора (http://msdn.microsoft.com/en-us/library/26td21ds.aspx), прежде чем принимать решение об использовании полностью сборочные файлы с ручной кодировкой.

1 голос
/ 01 июля 2009

Перед кодом нет директивы .code, чтобы MASM знал, что это должно быть в сегменте кода. Кроме того, вы никоим образом не ВОЗВРАЩАЕТЕСЯ из кода, поэтому ЦП блаженно пытается выполнить любые байты, как если бы они были исполняемым кодом. Не удивительно, что он падает после запуска.

1 голос
/ 30 июня 2009

Я предполагаю, что коду нужны некоторые директивы, попробуйте это:

.model small
.code
main:
  mov ax, 10
end main

Здесь .model говорит, что мы будем использовать «небольшую» модель программы памяти, а .code говорит, что следующие строки являются исполняемым кодом.

EDIT: Хорошо, есть еще один пример, который должен работать нормально.

; 
  include \masm32\include\masm32rt.inc
;

comment * -----------------------------------------------------
                 Build this console app with
              "MAKEIT.BAT" on the PROJECT menu.
        ----------------------------------------------------- *

  .data?
    value dd ?

  .data
    item dd 0

  .code

start:

; -------------------------------------------------------------------------

  call main
  inkey        ; wait for a keystroke before exiting
  exit

; -------------------------------------------------------------------------

main proc

  print "Hello World",13,10
  ret

main endp

; -------------------------------------------------------------------------

end start

(я взял это из здесь )

1 голос
/ 30 июня 2009

Попробуйте это:

.model small
.stack
.data
message   db "Hello world!", "$"

.code

main   proc
   mov   ax,seg message
   mov   ds,ax

   mov   ah,09
   lea   dx,message
   int   21h

   mov   ax,4c00h
   int   21h
main   endp
end main
0 голосов
/ 09 июля 2009

Это работает для меня, используя следующие строки ML и LINK
ml / coff / c test.asm
ссылка / подсистема: консоль test.obj

TITLE Test app
.386
.MODEL flat, stdcall
.STACK 4096
; --------------------
.code
main PROC
ret
main ENDP
; --------------------
END main
0 голосов
/ 30 июня 2009

Вам нужно использовать оператор segment. Попробуйте segment CODE вверху.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...