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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2011, 11:24   #1
upset
 
Регистрация: 26.02.2011
Сообщений: 3
По умолчанию Ассемблер и Cи

Всем привет!
У меня возникли возникли сложности с объединением модулей, написанных на си и асме. Задание следующее: реализовать основной алгоритм обработки как процедуру на языке ассемблера, ввод-вывод данных и вызов процедуры в си как головную программу.

В целом, алгоритм представляется мне так: написать 2 документа с кодом, компилятором си создать 1.obj, tasm-ом - 2.obj и объединить их через tlink в 3.exe.

Теперь хронология событий:

1. Система у меня 64-х битная, пришлось спецом для ассемблера ставить dosbox

2. Сначала я объединяла обжекты от vs2010 и tasm. Ошибка:
fatal: bad object file record in vs_test.obj near module file offset 0x00000704
Возникло предположение, что студия компилит 32 бита, а тасм 16.

3. Раздобыла тасм32 и тлинк32, соответственно.
Команда: TLINK32.exe test.obj vs_test.obj
Ошибка: fatal: 16 bit segments not supported in module test.asm.
Команда: TLINK32.exe vs_test.obj test.obj
fatal: bad file 'vs_test.obj' near file offset 0

WTF??

(Не знаю, какой из обжектов ставить первым, в любом случае в первом варианте от перемены слагаемых ничего не менялось)

Я в отчаянье!! Что же делать? Почему это 32-х битный тасмовский обжект не поддерживает 16-битные сегменты? Или они настолько не дружат с visual studio 2010(она же не делает 64 бита, да)?
Есть борланд билдер как альтернатива студии, но я не знаю ни библиотек, ни синтаксиса и как-то совсем и не хочется узнавать.

Пожалуйста, помогите. Как правильно сделать .exe?
upset вне форума Ответить с цитированием
Старый 27.02.2011, 10:58   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Вы пытаетесь скрестить кита со слоном. Мало того, что тасм компилирует 16-разрядный кол, а VS 32-разрядный, так еще их obj файлы имеют несовместимый друг с другом формат. Общего там только расширение!
Варианта 2:
1 ассемблерную часть компилировать в МАСМ32
2 делать в тасм(без 32) + borland c++
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 27.02.2011, 22:01   #3
upset
 
Регистрация: 26.02.2011
Сообщений: 3
По умолчанию

объединяю борланд и тасм(не 32):

fatal: 32-bit record encountered in module c:\Program Files (x86)\Borland\CBuilder\Progects\uni t1.cpp

с тасм32:

fatal: 16 bit segments not supported in module test.asm

это Borland c++ builder 6.0.
попробовала еще borland compiler 5.5,но там при вызове через командную строку bcc.exe говорит, что ему не хватает path

в masm32 и masm611 не работает link. Никаких сообщений об ошибках, просто не реагирует на вызов и всё
upset вне форума Ответить с цитированием
Старый 27.02.2011, 22:53   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Так запросто меняете компиляторы, операционки. Вообще очень странно, что у вас нет ошибок на уровне компиляции, я уж молчу про выполнение....
Может на чем-то остановитесь одном, дос или винда ?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 09.02.2021, 02:53   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Читаю книгу Голубь.Н.Г Искусство программирования на ассемблере.djvu
Никак не могу создать ни одного проекта.) Установил в virtualBox Windows XP на неё tasm, masm borland 5.02 C++. В borlfnd создаю проект на С++ компилирую, .obj создаётся tasm запускаю создаю файл .obj создаётся, но не линкуется. fatal: 32-bit record encountered in module .cpp, не знаю что делать....
Цитата:
Код:
#include<iomanip.h>
#include<stdlib.h>
#include<time.h>

const int N = 3000;
int A[N];
int n;

long S;

extern "C"
{
	void SummA(void);
}

void inputN(const int N, int& n)
{
	do
	{
		cout << "\n??? n[1.."<< N <<"]=========>";
		cin >> n;
		cout << "inputN: n = " << n << endl;
	}while(n < 1 || n > N);
}

void inputA(int A[], int n)
{
	randomize();
	int j = 1;
	long temp;
	for(int i = 0; i < n; ++i)
		if(n < 10)
		{
			cout << "??? A[" << i << "]========>";
			cin >> temp;
			A[i] = (int)temp;
			if(A[i] != tmp)
				--i;
		}
		else 
		{
			j = -j;
			A[i] = j*(int)random(30000);
		}
}

void outputA(const int A[], int n)
{
	cout << "\n====================================================\n"
		 << " Array:\n";
		 
	for(int i = 0; i < n; ++i)
		cout << setw(8) << A[i];
	cout << endl;
}

double summaP(const int A[], int n)
{
	double sum = 0.0;
	for(int i = 0; i < n; ++i)
		sum += (double)A[i];
	return sum;
}

int main()
{
	for(;;)
	{
		inputN(N, n);
		inputA(A, n);
		outputA(A, n);
		cout << "\nThe sum of all elements of a Array\n";
		cout << "C++: " << summaP(A, n) << endl;
		SummaA();
		cout << "ASM: " << S;
		cout << "\nExit Ctrl-C";
	}
}
apofioz вне форума Ответить с цитированием
Старый 09.02.2021, 02:54   #6
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Код:
.model lareg, C 
LOCALS   @@

.CODE 
Extrn C A:Word, n:Word, S:Word 

PUBLIC C SummaA 

;Синонимы 
a    EQU  A[BX]
s0   EQU WORD PTR S 
s2   EQU WORD PTR S + 2 

SummaA Proc  C far 
	xor bx, bx 
	xor si, si
	xor di, di 
	mov cx, n 
	jcxz  @@4 
@@1: 
	mov ax, a 
	CWD 
	add si, ax 
	adc di,dx 
	inc bx 
	inc bx 
	LOOP @@1 
	
@@4:
	mov s0, si 
	mov s2, di 
	
SummaA Endp
	End
apofioz вне форума Ответить с цитированием
Старый 09.02.2021, 07:53   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
void SummA(void);
Цитата:
Сообщение от apofioz Посмотреть сообщение
PUBLIC C SummaA
Никакой разницы не видите?


Цитата:
Сообщение от apofioz Посмотреть сообщение
.model lareg, C
А это точно "lareg"? А может "large"?
waleri на форуме Ответить с цитированием
Старый 09.02.2021, 21:16   #8
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А это точно "lareg"? А может "large"?
Конечно, я исправил эти ошибки. Толку то, ошибка выскакивает, нужно сказать, что файл .exe всё же создаётся, через раз, но после ввода последнего значения, вылетает сообщение, что что-то пошло не так и предложение отправить отчёт об ошибке в Microsoft. Значит завершается с ошибкой.
apofioz вне форума Ответить с цитированием
Старый 10.02.2021, 09:28   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Конечно, я исправил эти ошибки
Исправляйте дальше - как, по-вашему, надо выходить из подпрограммы?
waleri на форуме Ответить с цитированием
Старый 11.02.2021, 13:22   #10
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Исправляйте дальше - как, по-вашему, надо выходить из подпрограммы?
Завершать функцию нужно по ret или, возможно, по ren n.
apofioz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблер farxad Помощь студентам 6 11.09.2016 14:19
Ассемблер ViSaDeR Помощь студентам 2 25.12.2010 20:37
Ассемблер Майкл18 Помощь студентам 0 27.11.2009 09:16
Ассемблер Artur95 Помощь студентам 2 11.09.2009 22:30
Ассемблер maziLa Помощь студентам 2 14.07.2009 09:25