Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 08:44   #1
Studik
Пользователь
 
Аватар для Studik
 
Регистрация: 07.05.2010
Сообщений: 34
Печаль Компиляция

Доброго времени суток. Немогу откомпилировать простейшую 32 битную программу на MASMе:
Код:
.386
    .model flat, stdcall  ; 32 bit memory model
    option casemap :none  ; case sensitive

.const
    ;константанты

.data
    ;инициализированные данные
msg db "halloooo!!! World!!!"
.data?
    ;неинициализированные данные

.code
mov ah,9h
mov dx, offset msg
int 21h
mov ah,10h
int 16h
end
Компилирую таким образом:
Код:
ml.exe /c /coff exe.asm
link.exe /SUBSYSTEM:WINDOWS exe.obj
Но после первой же команды выводит ошибку: error A2022: instruction operands must be the same size.
Хотелосьбы разобраться в компиляции 32 битной программы без подключаемых библиотек и программных модулей.
Если бы все люди были идеальны, то любого человека можно было бы заменить любым другим...
Studik вне форума Ответить с цитированием
Старый 16.04.2011, 09:00   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
mov dx, offset msg
Оффсет то уже 32-битный, а dx... ?
p51x вне форума Ответить с цитированием
Старый 16.04.2011, 12:26   #3
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

По моему, у тебя половина программа 16-бит а половина 32-бит. Ты задаешь модел flat что означает 32-бита, а потом в коде вызываешь прерывания. Но помимо этого пытаешься загрузить в 16-битный регистр dx адрес. Для доса это будет правильно, так как там смещения, а для 32 бит это не правильно, потому что адрес уже больше регистра dx. Т.е. Надо вместо dx написать edx.
Ibanez Wizard вне форума Ответить с цитированием
Старый 16.04.2011, 13:11   #4
Studik
Пользователь
 
Аватар для Studik
 
Регистрация: 07.05.2010
Сообщений: 34
По умолчанию

dx изменил, в целом программа заработала, но есть две непонятные проблемы: При компиляции овыводится ошибка L4021: no stack segment, но exe файл создается и запускается.
программа не совсем коректно работает, перед выводом заветной строки выводится без малого две строки всякого мусора, как я понял код программы воспринимаемая как текст. Почему? Ни какой арифметики со смещением msg не производилось вроде...
Если бы все люди были идеальны, то любого человека можно было бы заменить любым другим...
Studik вне форума Ответить с цитированием
Старый 16.04.2011, 13:32   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Даю подсказку: вы кое-что забыли в конце определения строки
p51x вне форума Ответить с цитированием
Старый 16.04.2011, 14:21   #6
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию

Судя по программе, в команде линковщика вроде надо указывать SUBSYSTEM:CONSOLE, а не SUBSYSTEM:WINDOWS
N1KeL вне форума Ответить с цитированием
Старый 16.04.2011, 18:55   #7
Studik
Пользователь
 
Аватар для Studik
 
Регистрация: 07.05.2010
Сообщений: 34
По умолчанию

Никел, проблему это не решает...
Народ неужели ни кто не поможет с прогой разобраться, вот файлы для эксперементов: exe.rar
p21x $-я конечно заметил поздновато, но пару строк выводится ДО надписи, а значит это не та ошибка)))
Если бы все люди были идеальны, то любого человека можно было бы заменить любым другим...

Последний раз редактировалось Studik; 16.04.2011 в 19:07.
Studik вне форума Ответить с цитированием
Старый 17.04.2011, 10:06   #8
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Я посмотрел что ты там делал, и честно говоря ты все в одну кучу смешал
Опять же работаешь с сегментами, а используешь 32 битные регистры ( edx)
Ну а теперь об ошибках.
Для начала твой код:

Код:
.386
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG, gs:CSEG, fs:CSEG
    .model flat, stdcall  ; 32 bit memory model
    option casemap :none  ; case sensitive

;org 100h
.const
    ;константанты

.data
    ;инициализированные данные

.data?
    ;неинициализированные данные

.code
start:
mov ah,9h
mov edx, offset msg
int 21h
mov ah,10h
int 16h
int 21h

msg db "halloooo!!! World!!!$"
end start
Во-первых ты перед
Код:
org 100h
поставил точку с запятой, а поскольку точка с запятой означает комментарий к программе, то эта команда у тебя не воспримется. Второе - программа у тебя не завершится. Потому что ты перепутал прерывание. В конце программы ты поставил
Код:
int 21h
Чтобы программа завершилась, то тебе надо написать либо
Код:
int 20h
или дополнить 21-е прерывание одной строчкой сверху, т.е. получится
Код:
   MOV AH,4CH
   INT 21h
Ну а теперь на счет того, о чем я уверенно не могу говорить - о построении программы. По моему смысла в этих строчках нет:

Код:
.386CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG, gs:CSEG, fs:CSEG


;org 100h
.const
    ;константанты

.data
    ;инициализированные данные

.data?
    ;неинициализированные данные

.code
Я имею ввиду смысла в этих строчках:

Код:
    .model flat, stdcall  ; 32 bit memory model
    option casemap :none  ; case sensitive
.const
    ;константанты

.data
    ;инициализированные данные

.data?
    ;неинициализированные данные

.code
Все эти сегменты данных записываются так в 32битных программах, а у тебя 16-бит. Т.е. я думаю что эти строки вообще надо убрать.
.code тут тоже не нужно, так как в самом начале программы ты написал:
Код:
    CSEG segment
А это уже значит, что место сегмента кода ты уже объявил. Ну и тут уже ещё одна ошибка - ты объявил место начала сегмента кода и не закончил. Т.е. не написал в конце
CSEN ends
И ещё, меня как то смущают двойные апострофы в месте объявления области памяти для сообщения. Т.е. я думаю в этой строке
Код:
msg db "halloooo!!! World!!!$"
Двойные апострофы заменить на одинарные. Ну соответственно по моему программа должна приобрести такой вид:

Код:
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG, gs:CSEG, fs:CSEG
org 100h

start:
mov ah, 09h
mov dx, offset msg
int 21h
mov ah,10h
int 16h
mov ah,4CH
int 21h

msg db 'halloooo!!! World!!!$'
CSEG ends
end start
P.S. Я писал это на основе своих начальных знаний, поэтому не могу быть уверен в некоторых вещах, которые я написал. И ещё - я этот вариант не откомпилировал (времени пока не хватило).
Ibanez Wizard вне форума Ответить с цитированием
Старый 17.04.2011, 10:54   #9
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Ibanez Wizard, не то, чтобы хотелось вмешиваться, но...
Цитата:
Немогу откомпилировать простейшую 32 битную программу на MASMе:

Расскажите человеку про апи функи )
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 17.04.2011, 11:50   #10
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
Ibanez Wizard, не то, чтобы хотелось вмешиваться, но...

Расскажите человеку про апи функи )
Аа. Так значит он не 16 битку с 32 смешал, а 32 с 16 Я прав?
Если так, то вместо прерываний дл вывода сообщения, нужно использовать API функции (раз 32 битка). Для вывода сообщения нужно использовать функцию MessagBox, а для выхода ExitProcess...В общем это совсем другая тема, которой нужно учиться. Я просто пример такой программы для наглядности приведу:

Код:
.386
.model flat, stdcall
option casemap : none
include\masm32\include\windows.inc
include\masm32\include\kernel32.inc
include\masm32\include\user32.inc
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib

.data
msg db "halloooo!!! World!!!", 0

.code
start:
invoke MessageBox, NULL, addr msg, NULL, MB_OK
invoke ExitProcess, NULL
end start
Вот архив с батником и примером exe.rar
Ibanez Wizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компиляция Андрей 93 Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 17.12.2010 15:52
компиляция DeDoK Общие вопросы Delphi 4 02.11.2010 18:21
Компиляция BlincAttack Общие вопросы .NET 12 20.09.2009 23:35
компиляция DarK_NighT Общие вопросы Delphi 1 25.03.2009 13:18
Компиляция в Qt Diman2008 Qt и кроссплатформенное программирование С/С++ 6 16.11.2008 20:57