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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2013, 15:12   #1
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию Использование функции scanf и цикла

Пытаюсь считать функцией scanf целое значение в ассемблерной вставке
и в цикле вывести с помощью printf на консоль, но где-то у меня неправильно:
Код:
#include <stdio.h>
#include <windows.h>

DWORD a, b, c;
char s[] = "Result %d\n";
char z[] = "%d";
int i;

void main()
{
printf("Input a and b\n");


__asm
{
lea eax, z
push a
push eax
call scanf
add esp, 8//здесь прерывается

mov eax, a
add eax, 2


lea edx, s

xor ebx, ebx
L1:
push eax
push edx
call printf
add esp, 8
inc ebx
cmp ebx, 0x0A//если ebx = 10, выход из цикла
je  L2:
jmp L1:
}
 L2:
system("pause");
}
В чём состоит моя ошибка?
Объясните пожалуйста.

Последний раз редактировалось Alexey_68; 19.05.2013 в 18:15.
Alexey_68 вне форума Ответить с цитированием
Старый 19.05.2013, 22:47   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Я бы писал так:
Код:
...
push a
push eax
mov ecx,scanf
call ecx
add esp, 8//здесь прерывается

....
push eax
push edx
mov ecx,printf
call ecx
add esp, 8
Кроме этого у вас есть еще логические ошибки. Например, printf имеет конвенцию CDECL, а по ней eax, ecx, edx НЕ СОХРАНЯЮТСЯ. Так что программа в любом случае выведет мусор.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 20.05.2013, 02:22   #3
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

спасибо за ответ, но на инструкцию:
mov ecx,scanf
ругается:Operand size mismatch
Alexey_68 вне форума Ответить с цитированием
Старый 20.05.2013, 05:55   #4
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Код:
lea eax, z
push offset a
push eax
call ds:scanf
add esp, 8//здесь прерывается

mov eax, a
add eax, 2


lea edi, s

xor ebx, ebx
L1:
push eax
push edi
call ds:printf
add esp, 8
inc ebx
cmp ebx, 0x0A//если ebx = 10, выход из цикла
jnz L1
vadimych вне форума Ответить с цитированием
Старый 20.05.2013, 08:27   #5
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Я написал для Visual Studio (похож синтаксис), у меня работает, по-другому у меня не получилось вызвать,компилятор выбирает неправильную адресацию. Если у вас выдает ошибку, наверно пользуетесь другим компилятором.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 20.05.2013, 17:36   #6
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

пользуюсь C++ Builder 2007,
to vadimych выдаёт ошибку
http://rghost.ru/46134049
Alexey_68 вне форума Ответить с цитированием
Старый 20.05.2013, 18:31   #7
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Alexey_68, я писал в Visual Studio 2012.
vadimych вне форума Ответить с цитированием
Старый 20.05.2013, 18:43   #8
Alexey_68
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 39
По умолчанию

спасибо alexcoder и vadimych
всё работает:
push offset a
push eax
call scanf
add esp, 8
С Уважением Алексей
Alexey_68 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка массива с использование операторов цикла с условием MikaNika Паскаль, Turbo Pascal, PascalABC.NET 1 08.04.2012 21:53
использование операторов цикла. 555ALEXANDR555 Помощь студентам 2 10.01.2011 17:11
Есть ли альтернатива функции ввода scanf()? arcer Общие вопросы C/C++ 4 24.08.2010 22:29
Использование цикла со счётчиком Sexy girl* Помощь студентам 0 23.12.2009 21:41
Использование операторов цикла кася Паскаль, Turbo Pascal, PascalABC.NET 3 02.05.2008 00:32