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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2011, 19:55   #1
EugenK
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 22
По умолчанию Ассемблер в С

Подскажите пожалуйста, ситуация такова, я выполнил некторые операции, в своей программе, с помощью ассемблерных вставок,и передо мной стоит задача теперь вывести содержимое некоторых регистров на экран, с помощью каких команд я могу это выполнить?
EugenK вне форума Ответить с цитированием
Старый 04.08.2011, 00:22   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Все локальные переменные созданные в С++ коде, можно использовать в ассемблерной вставке. Например вот так:

Код:
#include <iostream>
#include <conio.h>

void printVector(float array[4]) {
	std::cout<<array[0]<<" "<<array[1]<<" "<<array[2]<<" "<<array[3];
	std::cout<<std::endl;
}

int main(int argc, char* argv[])
{
	float vector_0[4]={ 1,2,3,4 };
	float vector_1[4]={ 10,10,0,10 };

	std::cout<<"Vector 0:\n ";
	printVector(vector_0);

	std::cout<<"....multiplyed by...."<<std::endl;
	
	std::cout<<"Vector 1:\n ";
	printVector(vector_1);

	_asm {
		movups xmm0,[vector_0]
		movups xmm1,[vector_1]
		mulps xmm0,xmm1
		movups [vector_0],xmm0
	}

	std::cout<<"\nRfesult:\n ";
	printVector(vector_0);
	getch();
}
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 04.08.2011, 00:22   #3
EugenK
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 22
По умолчанию

Можно ли сделать так, что я объявляю некоторую переменную в самой программе, а потом с помощью ассемблерной вставки заношу данные из некоторого регистра в эту переменную? Например есть переменная x и регистр СН, в котором нужное мне число, вряд ли я смогу написать
mov x, CH
как быть?

попробую, спасибо большое

Последний раз редактировалось Stilet; 05.08.2011 в 20:04.
EugenK вне форума Ответить с цитированием
Старый 04.08.2011, 00:39   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Да запросто. Вот только с косвенными обращениями получается не очень. Хотя я на ассемблере( в особенности встроенном в MSVC) писал очень давно, может позабыл чего да как, тем не менее вот это вполне рабочее решение, разве что для косвенной адресации отдельный регистр используется, с адресом как-то не получилось.
Код:
int main(int argc, char* argv[])
{
	int var;
	int definedVar=99;
	int* pvar=&definedVar;
	_asm {
		mov var,10;
		mov eax,pvar;
		mov [eax],15;
	}
	std::cout<<"var: "<<var<<std::endl;
	std::cout<<"pointer var: "<<*pvar<<std::endl;
	getch();
}
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 04.08.2011, 01:20   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
void Foo() {
 int Temp = 4455;
 __asm {
  Mov Cl, BYTE Ptr Ds:[Temp]
  Mov Ax, WORD Ptr Ds:[Temp]
  Mov Edx, DWORD Ptr Ds:[Temp]
 }
}
Цитата:
передо мной стоит задача теперь вывести содержимое некоторых регистров на экран, с помощью каких команд я могу это выполнить
Так не пойдет?
Код:
void Foo()
{
 int Buffer;
 _asm {
  Mov Eax, 5
  Mov [Buffer], Eax
 }
 printf("%d", Buffer);
}

Последний раз редактировалось coNsept; 04.08.2011 в 01:51.
coNsept вне форума Ответить с цитированием
Старый 05.08.2011, 09:43   #6
EugenK
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 22
По умолчанию

Спасибо большущее, но тут вот такая проблема, мне пишут следующее: "Invalid combination of opcode and operands".
PHP код:
main() {
int buffer;
_asm {
mov AH2
mov 
[buffer], AH
}
printf("jjj",buffer);

          return 
0;

EugenK вне форума Ответить с цитированием
Старый 05.08.2011, 13:16   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
_asm {
 Mov Ah, 2
 Mov Byte Ptr Ds:[buffer], Ah
}

printf("%d", buffer);
coNsept вне форума Ответить с цитированием
Старый 05.08.2011, 13:52   #8
EugenK
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 22
По умолчанию

Возникает такая ситуация, что выводит в переменную buffer непонятно что(((
PHP код:
_asm {

 
Mov Byte Ptr Ds:[buffer], 2
}

printf("%d"buffer); 
т.е. даже если я так сделаю, оно мне выводит не 2
EugenK вне форума Ответить с цитированием
Старый 05.08.2011, 14:15   #9
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

ah он 8-битный какбе
надо ax или eax юзать.
Код:
	int i=10;
	int k=5;

	i/=k;

	int tmp;

	__asm {
		mov tmp, ecx
	}

	printf("%d\n",tmp);
видим, что в ecx остался лежать результат деления == 2.
onewho вне форума Ответить с цитированием
Старый 05.08.2011, 15:32   #10
EugenK
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 22
По умолчанию

Спасибо, а можно тогда задать следующий вопрос

Обработчик прерывания BIOS от системного таймера (Int 8) подсчитывает количество прерываний (каждые 55 мсек или 18,2 раза в секунду) в двойном слове памяти с адресом 0040h:006Сh. Данная функция возвращает накопленное значение (двоичный код) и сбрасывает его в 0. В регистре AL возвращается 0, если содержимое счетчика не превысило значения, соответствующего 24 часам (при достижении этого значения счетчик сбрасывается), иначе возвращается AL = 1.

Вызов: АН = 00h.

Возврат: СХ:DX – число тактов системного времени от полуночи,

AL – флаг перехода через сутки.

Примеры возвращаемых значений в СХ:DX:

1 сек 12h или 18,

1 минута 04 44h или 1092,

1 час 1 00 07h или 65543,

24 часа 18 00 B0h или 1 573 040.

Для задержек меньших 14 секунд можно пользоваться только младшим байтом регистра DX

B данном примере установлена задержка на 5 секунд, что соответствует 91 отсчету таймера

..........

Код:
 mov ah,0                   ;Функция "чтения" циклов таймера

                            int 1Ah                      ;Получаем значение счетчика циклов в cx:dx

                            add dx,91                  ;Добавляем 5 сек. к младшему слову в dx

                            mov bx,dx                 ;Запоминаем требуемое значение в bx и выполняем

                            ;постоянную проверку значений счетчика времени суток

repeat:                  int 1Ah                      ;Вновь получаем значение счетчика

                            cmp dx,bx                 ;Сравниваем с искомым

                            jne repeat                  ;Если не равно, то повторяем снова,

                                                       ;иначе задержка окончена

Правильно ли я понимаю, что если вставить следующий элемент в программу, то следующие за ним команды выполнятся только через 5 сек? И ещё при компиляции выскакивает ошибка мол "Undefined label "repeat"."
EugenK вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблер farxad Помощь студентам 6 11.09.2016 14:19
Ассемблер SWEET_15 Помощь студентам 3 06.09.2016 08:45
ассемблер klim_666 Фриланс 5 29.12.2010 14:52
Ассемблер Александе еть я Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 14.05.2010 13:52