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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2012, 09:09   #1
Веди
Пользователь
 
Аватар для Веди
 
Регистрация: 05.07.2012
Сообщений: 24
По умолчанию ассемблерная вставка

кто может, помогите!!!

объявлено на С++
Код:
int     i,j,s;
int     a[AWX][AHY];
необходимо
Код:
s=((a[i][j-1]+a[i-1][j]+a[i+1][j]+a[i][j+1])>>2)+1;
перевести в ассемблерный
Код:
__asm{
...
}
с простыми переменными вроде ясно, а с массивами не пойму как..
Веди вне форума Ответить с цитированием
Старый 06.07.2012, 10:32   #2
Веди
Пользователь
 
Аватар для Веди
 
Регистрация: 05.07.2012
Сообщений: 24
По умолчанию

попробовал так:
Код:
__asm{
        mov eax, a[i][j-1]
        add eax, a[i-1][j]
        add eax, a[i+1][j]
        add eax, a[i][j+1]
        sar eax, 2
        add eax, 1
        mov s, eax
        }
ругается на:
Код:
Expression syntax
чего не так делаю?
Веди вне форума Ответить с цитированием
Старый 06.07.2012, 10:50   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
mov eax, a[i][j-1]
i и j - это же не константы, а переменные по какому-то адресу (который к тому же может быть относительно ebp), да индексы ещё и умножать надо.
Код:
; [a + (i * AWY + j) * SIZEOF_INT] + (±AWY ±1) * SIZEOF_INT
mov	eax, AWY
mul	[i]
add	eax, [j]
lea	eax, [a + eax * SIZEOF_INT]

mov	edx, [eax - 1 * SIZEOF_INT]
add	edx, [eax - AWY * SIZEOF_INT]
add	edx, [eax + AWY * SIZEOF_INT]
add	edx, [eax + 1 * SIZEOF_INT]

shr	edx, 2
inc	edx
mov	[s], edx
Somebody вне форума Ответить с цитированием
Старый 06.07.2012, 11:09   #4
Веди
Пользователь
 
Аватар для Веди
 
Регистрация: 05.07.2012
Сообщений: 24
По умолчанию

попробовал вставить, та же ошибка, но ругается на 2,3,4 и последнюю строки..
и что за: SIZEOF_INT, если не трудно объясни.

Последний раз редактировалось Веди; 06.07.2012 в 11:13.
Веди вне форума Ответить с цитированием
Старый 06.07.2012, 11:21   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от Веди Посмотреть сообщение
и что за: SIZEOF_INT, если не трудно объясни.
Размер int'а в байтах. Надо объявить где-то как константу.
Цитата:
Сообщение от Веди Посмотреть сообщение
попробовал вставить, та же ошибка, но ругается на 2,3,4 и последнюю строки..
Это те строки, где используются сишные идентификаторы. Они объявлены?
Somebody вне форума Ответить с цитированием
Старый 06.07.2012, 11:55   #6
Веди
Пользователь
 
Аватар для Веди
 
Регистрация: 05.07.2012
Сообщений: 24
По умолчанию

i,j,s объявлены в классе главного окна (см. 1 пост)
Веди вне форума Ответить с цитированием
Старый 06.07.2012, 12:12   #7
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

ну тогда попробуй перед "[" ставить "dword ptr " хотя-бы частично но должно помочь. И вообще, явное указание разрядности операнда, применительно к памяти, очень часто помогает в случае ошибок компиляции. Не все компиляторы одинаково хорошо интерпретируют простые ссылки на переменные.

з.ы. Somebody, а вы уверены, что int = 4 байта, а не два, что так вольно их в 32-х разрядные регистры размещаете?
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 06.07.2012 в 12:22.
DiemonStar вне форума Ответить с цитированием
Старый 06.07.2012, 12:42   #8
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
з.ы. Somebody, а вы уверены, что int = 4 байта, а не два, что так вольно их в 32-х разрядные регистры размещаете?
Не уверен. Но если в условии ничего не написано, то это проблемы пишущего условие.
Somebody вне форума Ответить с цитированием
Старый 06.07.2012, 13:10   #9
Веди
Пользователь
 
Аватар для Веди
 
Регистрация: 05.07.2012
Сообщений: 24
По умолчанию

а 16х регистры это ах,dх?
и всё таки непонятно с массивами, пойду искать книжки, может посоветуете какую?
и, нужен какой-то инклюд для вставки асма в с++?

Последний раз редактировалось Веди; 06.07.2012 в 15:30.
Веди вне форума Ответить с цитированием
Старый 10.07.2012, 20:14   #10
Vort
Пользователь
 
Аватар для Vort
 
Регистрация: 10.07.2012
Сообщений: 16
По умолчанию

Вот вариант на проверку:

Код:
// VS2010
#include <stdio.h>
#include <memory.h>

class A
{
public:
	static const int AWX = 3;
	static const int AHY = 5;
	int i, j, s;
	int a[AWX][AHY];

public:
	A()
	{
		i = 1;
		j = 3;
		s = -1;

		memset(a, 0x00, AWX * AHY * 4);

		a[i][j-1] = 4000;
		a[i-1][j] = 800;
		a[i+1][j] = 120;
		a[i][j+1] = 12;
	}

	void Calc()
	{
		int vi = i;
		int vj = j;
		int vs = -1;
		int* va = &a[0][0];

		__asm
		{
			mov ebx, vi
			mov ecx, vj
			mov esi, va
		
			mov eax, ebx // i
			mul AHY      // i * AHY
			add eax, ecx // i * AHY + j
			dec eax      // i * AHY + j - 1
			mov edi, [esi + eax * 4] // a[i][j-1]

			mov eax, ebx
			dec eax
			mul AHY
			add eax, ecx
			add edi, [esi + eax * 4] // a[i-1][j]

			mov eax, ebx
			inc eax
			mul AHY
			add eax, ecx
			add edi, [esi + eax * 4] // a[i+1][j]

			mov eax, ebx
			mul AHY
			add eax, ecx
			inc eax
			add edi, [esi + eax * 4] // a[i][j+1]

			sar edi, 2
			add edi, 1

			mov vs, edi
		}
		s = vs;
	}

	void Print()
	{
		printf("%d\r\n", s);
	}
};

void main()
{
	A a;
	a.Calc();
	a.Print();
}
Vort вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблерная вставка Serg12 Помощь студентам 5 04.05.2017 19:43
Ассемблерная вставка panter Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 10.05.2012 22:41
Ассемблерная вставка _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 5 18.09.2010 14:31
Ассемблерная вставка! treki Помощь студентам 0 16.06.2010 00:15