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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2014, 02:47   #1
xotonic
 
Аватар для xotonic
 
Регистрация: 07.04.2013
Сообщений: 8
По умолчанию Строки из Си на asm и исключения

Хочу вставить символ в строку.
Для этого описал прототип функции в СИшном исходнике:
Код:
extern "C"
{
	 void func(char *str);

}
и ее реализацию на asm:
Код:
.686
.MODEL FLAT, C
.STACK 256
....
.CODE
func PROC str1:Ptr byte

         mov ebx, str1  ; заносим адрес параметра в регистр
	 
	 mov al, 48 ; копируем символ в al
	 mov byte ptr[ebx], al ; и вот тут VS выводит диалог мол необработанное исключение по адресу такому-то, нарушение прав доступа по такому то адресу
	 
ret 
func ENDP
END
1) Что собственно не так? Почему возникает это иключение? И как правильно вставить символ?
2) Или может код правильный, но VS специально блокирует запись в неугодную в память? Если да, то как это отключить?

При передаче параметра память под строку выделял. VS 2013.
xotonic вне форума Ответить с цитированием
Старый 22.10.2014, 10:29   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А вы проверьте совпадает ли адрес ошибки с выделенным адресом.
Если адрес совпадает, значит неправильно выделяете память.
Если не совпадает, значит неправильно передаете параметр и/или неправильно загружаете в регистр.
waleri вне форума Ответить с цитированием
Старый 22.10.2014, 14:59   #3
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Вполне может быть, что исключение происходит уже после возврата из процедуры. Она ведь нарушает правило сохранности ключевых регистров. Значение EBX нельзя просто так изменять. Возьми EDX или ECX.
Vapaamies вне форума Ответить с цитированием
Старый 22.10.2014, 17:55   #4
xotonic
 
Аватар для xotonic
 
Регистрация: 07.04.2013
Сообщений: 8
По умолчанию

Нашел ошибку! Дело было в неправильном выделении памяти для параметра
До этого присваивал значение так:
Код:
char *c;
// выделил для с память malloc`ом
с = "string";
оказывается такое присваивание просто ставит указатель на другую область памяти, которая read only.
Strcpy же копирует участки памяти, правильно вот так:
Код:
char *c;
// выделил для с память malloc`ом
strcpy(c, "string");
Спасибо за наводку
xotonic вне форума Ответить с цитированием
Старый 22.10.2014, 20:14   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Терь ждем, когда начнет падать из-за разрушения EBX.
Vapaamies вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменить код asm x32 под asm x64 за вознаграждение Ecosasha Фриланс 2 28.11.2013 14:11
ввод и вывод строки в ASM 8086 eugrita Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 13.05.2013 10:48
Asm. Передача параметров командной строки. Adverse Помощь студентам 0 15.04.2012 19:42
Asm. Разбивка строки на две части levis07 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 30.03.2010 14:30
Преобразование строки(ASM) ManU Помощь студентам 4 11.06.2008 17:20