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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2011, 21:59   #1
stas135642
Пользователь
 
Регистрация: 31.10.2010
Сообщений: 39
По умолчанию Процедуры в asm

Здраствуйте. На днях нашел в инете интересную прогу, которая решает данную задачу:разработать программу вычисления функции y=f(a,b,c,d,e). Значения аргументов a, b, c, d, e должны вводиться с клавиатуры ПЭВМ. Значение функции y следует вывести на экран дисплея.
для ввода-вывода числовых данных использовать следующий формат: ЗнЦЦЦ…Ц, где Ц – цифра (0…9), Зн – знак (+,-). Предусмотреть в программе вывод текста, содержащего вычисляемую функцию и формат аргументов, а также выдачу запроса на ввод каждого аргумента. Вычисление функции и преобразование вводимых и выводимых данных оформить в виде процедур: func – вычисление заданной функции, ascbin – преобразование числа из строки ASCII-кодов в двоичное число, binasc – преобразование числа, представленного в виде двоичного кода, в строку ASCII кодов.
Передача аргументов между вызывающей и вызываемой процедурами может осуществляться несколькими способами (или их комбинацией):
Способ передачи Передаются данные Передаются адреса
Через регистры 1 2
Через сегмент стека 3 4
Через сегмент данных 5 6
Через сегмент кода 7* 8*
* – Если реализация данного варианта невозможна по объективным причинам (ограничения накладываемые операционной системой и средой разработки), то вариант заменяется на подобный, не указанный в задании.
Функция: y=a*b+c*d/e
Вызов/ возврат (func) 3/4
Вызов/возврат (ascbin) 5/6
вызов/возврат (binasc) 7/8
Формат данных b
Прога:
Код:
#include <stdio.h>
#include <conio.h>

char prompt[] = "Enter a: ";
char _NEG = 0;
char buf[10];
char num = 0, digit = 0;
char abcde[5], * next = abcde, y = 0;

__declspec(naked) 
void func(void)
{
	__asm
	{
		xor EAX, EAX
		xor EDX, EDX
		mov AL, [EBX + 2]
		mov CL, [EBX + 3]
		div CL
		sub DL, AL
		mov AL, [EBX]
		mov CL, [EBX + 1]
		imul CL
		add DL, AL
		add DL, [EBX + 4]
		mov [ESP + 4], DL
		ret
	}
}

__declspec(naked) 
void ascbin(void)
{
	__asm
	{
		xor EAX, EAX
		mov EBX, [ESP + 4]
		mov EDI, [ESP + 8]
		mov AL, [EBX]
		cmp AL, 0x2D
		jne LabelStart1
		mov _NEG, 0x01
		inc EBX
LabelStart1:
		cmp AL, 0x2B
		jne LabelStart2
		mov _NEG, 0x00
		inc EBX
LabelStart2:	
		xor EDX, EDX
		mov DL, [EBX]
		test DL, DL
		je endLabelStart2
		sub EDX, 0x30
		mov digit, DL
		mov AL, num
		xor EDX, EDX
		mov DX, 10
		imul DX
		xor EDX, EDX
		mov DL, digit
		add EAX, EDX
		mov num, AL
		inc EBX
		jmp LabelStart2
endLabelStart2:
		mov AL, num
		mov [EDI], AL
		cmp _NEG, 0x01
		jne Label
		neg [EDI]
Label:	
		mov num, 0x00
		mov digit, 0x00
		mov _NEG, 0x00
		ret
	}
}

__declspec(naked) 
void binasc(void)
{
	__asm
	{
		xor EAX, EAX
		xor EBX, EBX
		xor ESI, ESI
		lea EDI, y
		mov AL, [EDI]
		cmp AL, 0x00
		jge Label1
		neg [EDI]
		mov AL, byte ptr [EDI]
		mov _NEG, 0x01
Label1:
		lea EBX, buf
		mov CL, 0x64
		idiv CL
		add AL, 0x30
		cmp AL, 0x30
		je Label2
		mov [EBX + ESI], AL
		inc ESI
Label2:
		xchg AH, AL
		xor AH, AH
		mov CL, 0x0A
		idiv CL
		add AL, 0x30
		cmp AL, 0x30
		je Label3
		mov [EBX + ESI], AL
		inc ESI
Label3:
		add AH, 0x30
		mov [EBX + ESI], AH
		inc ESI
		mov [EBX + ESI], 0x00
		ret
	}
}

void main(void)
{
	char * result= "y = %s";
	__asm
	{
		lea ESI, prompt
		add ESI, 0x06
		mov ECX, 0x05
LabelStart1:	
		push ECX
		lea EAX, prompt
		push EAX
		call dword ptr printf
		add ESP, 0x04
		lea EAX, buf
		push EAX
		call dword ptr gets
		add ESP, 0x04
		push next
		lea EAX, buf
		push EAX
		call ascbin
		add ESP, 0x08
		inc next
		inc [ESI]
		pop ECX
		loop LabelStart1

		lea EBX, abcde
		xor EAX, EAX
		push EAX
		call func
		pop EAX
		mov y, AL
		call binasc
		cmp _NEG, 0x01
		jne LabelStart2
		mov EAX, 0x2D
		push EAX
		call dword ptr putchar
		add ESP, 0x04
LabelStart2:	
		lea EAX, buf
		push EAX
		mov EAX, result
		push EAX
		call dword ptr printf
		add ESP, 0x08
	}
	_getch();
}
Плз, помогите с комментами. Заранее спсб)
stas135642 вне форума Ответить с цитированием
Старый 10.05.2011, 01:10   #2
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

У меня есть только один комментарий
;учи матчасть
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование имени процедуры в качестве параметра другой процедуры Alexey355 Помощь студентам 1 23.04.2011 13:59
Использование asm процедуры в Delphi Alex1991 Общие вопросы Delphi 4 08.02.2011 12:50
закончить выполнение процедуры из тела другой процедуры Alaysor Общие вопросы Delphi 14 23.01.2011 05:26
asm код процедуры D2009 Kolik317 Общие вопросы Delphi 6 27.08.2010 20:03