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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2013, 02:00   #1
YourKrosh
Новичок
Джуниор
 
Регистрация: 20.11.2013
Сообщений: 1
По умолчанию Макроопределения

Имеется код макроопределения, который используется в программе, написанной на С++(для компиляции используется masm,встроенный в VS2012). Выдает следующую ошибку при вводе строк(первая-набор произвольных символов, вторая - один символ):
нарушение прав доступа при исполнении по адресу 0x8060FC59
Задание заключается в поиске в первой строке символа из второй и удаление его из первой строки(хотя надо бы реализовать следующее: ввести строку, затем ввести, какой символ надо заменить, а затем ввести, на что будем заменять. Но тут у меня вообще ступор). Предполагаю, что ошибаюсь в работе с esi и edi.
Вот код:
macro.asm
Код:
.686
.model flat, c

; макрос нахождения длины строки

get_length macro string1
	lea esi, [string1] ;заносим в esi адрес начала s(смещение в памяти), чтобы работать со строкой
	xor ecx, ecx ;очищаем регистр ecx
L:
	mov bl, byte ptr [esi] ;заносим в bl значение по адресу esi
	cmp bl, 0 ;сравниваем с нулем,т.е. определяем конец строки или пустую строку
	je end_macro ;переходим на метку end_macro, если bl=0
	inc ecx ;увеличиваем ecx на один
	inc esi ;увеличиваем esi
	jmp L;возвращаемся на метку L
end_macro:
	mov len, ecx ;заносим в len длину строки из ecx
endm

; макрос нахождения количества символов в строке

number_of_spaces macro string1, string2
	lea esi, [string1]
	mov ecx, len
	lea edi, [string2]
	mov al, byte ptr [edi]
L4:
	mov bl, byte ptr [esi]
	cmp bl, al 
	jne L3
	inc num
L3:
	inc esi
	loop L4
Lend:
endm

; макрос нахождения индекса пробела в строке

find_space_index macro string1, string2
	mov ecx, len
	lea esi, [string1]
	mov eax, 0
	lea edi, [string2]
	mov al, byte ptr [edi]
	
L1:
	mov bl, byte ptr [esi]
	cmp bl, al 
	je end1
	inc esi
	inc eax
	jmp L1

end1:
endm

; макрос удаления символа по его индексу

delete_space macro string1, pos
	mov edx, pos
	lea edi, [string1+edx]
	inc edx
	lea esi, [string1+edx]
	
	mov ecx, len
	sub ecx, pos
	inc ecx
L2:
	mov bl, byte ptr [esi]
	mov byte ptr [edi], bl
	inc esi
	inc edi
	loop L2
endm

.stack

.data
	string1 byte 255 dup(0)
	string2 byte 1 dup(0)
	len dword 0
	num byte 0
	inputmsg1 byte "Enter a string: ", 0
	inputmsg2 byte "Enter a string: ", 0
	outmsg byte "Changed string: %s", 10, 13, 0
	



.code

printf proto arg1:ptr byte, printlist: vararg
input proto s:ptr byte

; описание функции, которая вызывает макросы

f proc 
	invoke printf, addr inputmsg1
	invoke input, addr string1

	invoke printf, addr inputmsg2
	invoke input, addr string2

	
	get_length string1
	number_of_spaces string1, string2
P:
	cmp num, 0
	je toend

	find_space_index string1, string2
	delete_space string1, eax

	dec num
	jmp P

toend:
	invoke printf, addr outmsg, addr string1
	ret
f endp

end
main.cpp
Код:
#include <iostream>

using namespace std;

extern "C"{
	void f();
}

int main() {
	f();

	system("pause");
	return 0;
}

extern "C"
void input(char s[]) {
	gets(s);
}

Последний раз редактировалось YourKrosh; 20.11.2013 в 02:09.
YourKrosh вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при многократном вызове макроопределения xVxSeRGxVx Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 01.03.2010 23:46