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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2012, 14:56   #1
RazerVG
Пользователь
 
Регистрация: 27.12.2012
Сообщений: 15
По умолчанию Вывод введенного сообщения. Исправить ошибку.

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{char x;
char* fmt = "%s";
_asm
{
lea eax, x
push eax
push fmt
call scanf
add esp, 30;


lea eax, x
push eax
push fmt;
call printf;
add esp, 30;
}
return 0;
}

После выполнения выводит ошибку помогите исправить.
RazerVG вне форума Ответить с цитированием
Старый 27.12.2012, 15:08   #2
RazerVG
Пользователь
 
Регистрация: 27.12.2012
Сообщений: 15
По умолчанию

программа сама работает
RazerVG вне форума Ответить с цитированием
Старый 27.12.2012, 15:10   #3
RazerVG
Пользователь
 
Регистрация: 27.12.2012
Сообщений: 15
По умолчанию

Такая ошибка Stack around the variable 'x' was corrupted
RazerVG вне форума Ответить с цитированием
Старый 27.12.2012, 15:10   #4
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

RazerVG, а на кой предмет Вы стек на 30 байт выравниваете после вызовов функций? 8-ми хватит за глаза.
vadimych вне форума Ответить с цитированием
Старый 27.12.2012, 16:27   #5
RazerVG
Пользователь
 
Регистрация: 27.12.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от vadimych Посмотреть сообщение
RazerVG, а на кой предмет Вы стек на 30 байт выравниваете после вызовов функций? 8-ми хватит за глаза.
исправил только не понимаю почему именно 8?

и нашел ошибку char x[10];
RazerVG вне форума Ответить с цитированием
Старый 27.12.2012, 16:42   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

RazerVG, Вы передаёте функции через стек два параметра каждый размером dword. Итого 8 байт. Да, и надо передать адрес строки форматирования, а не саму строку.
vadimych вне форума Ответить с цитированием
Старый 27.12.2012, 16:48   #7
RazerVG
Пользователь
 
Регистрация: 27.12.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от vadimych Посмотреть сообщение
RazerVG, Вы передаёте функции через стек два параметра каждый размером dword. Итого 8 байт. Да, и надо передать адрес строки форматирования, а не саму строку.
Еще такой вопрос

lea eax, x; //заносим адрес переменной x в eax
push eax;// кладем адрес переменной x в стек
push fmt; //кладем адрес строки форматирования в стек
call scanf; //вызываем функцию scanf. Заметьте, что аргументы передаются в обратном порядке
add esp,8;// убираем аргументы из стека. 4 - размер одного аргумента; 2 - их количество

вот нашел описание

Вопрос вот в чем когда мы вызываем call scanf что мы считываем x или fmt ?
RazerVG вне форума Ответить с цитированием
Старый 27.12.2012, 16:49   #8
RazerVG
Пользователь
 
Регистрация: 27.12.2012
Сообщений: 15
По умолчанию

Зачем вообще здесь x ?
RazerVG вне форума Ответить с цитированием
Старый 27.12.2012, 17:11   #9
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Код:
#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
char x[256];
char* fmt = "%s";
_asm
{
lea ebx, x
push ebx
push fmt
call ds:scanf
add esp, 8;


push ebx
push fmt
call ds:printf;
add esp, 8;
}
return 0;
}
vadimych вне форума Ответить с цитированием
Старый 27.12.2012, 17:18   #10
RazerVG
Пользователь
 
Регистрация: 27.12.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от vadimych Посмотреть сообщение
Код:
#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
char x[256];
char* fmt = "%s";
_asm
{
lea ebx, x
push ebx
push fmt
call ds:scanf
add esp, 8;


push ebx
push fmt
call ds:printf;
add esp, 8;
}
return 0;
}
а значение какого регистра мы считываем вот этим call ds:scanf?
RazerVG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод сообщения в assembler Hrum Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 09.11.2012 23:45
Вывод сообщения в трей Avalon_Albio Помощь студентам 0 17.04.2012 10:02
вывод сообщения по дате WALL Помощь студентам 9 09.11.2010 09:28
Вывод сообщения по времени DimOn4Ik БД в Delphi 12 31.03.2010 23:00
Вывод сообщения об ошибке... Ho-ho Помощь студентам 12 02.11.2009 16:54