2017-02-16 13 views
0

Я программирование на ассемблере и произошла следующая ошибка мне:Доступ место нарушения Сочинения встречающееся в Ассамблее

Exception брошенного в 0x00B71792 в Application1.exe: 0xC0000005: нарушение прав доступа письменность местоположение 0x00B76BED.

Необработанное исключение в 0x00B71792 в Application1.exe: 0xC0000005: место записи нарушения доступа 0x00B76BED.

Я использую Visual Studio для программирования. Далее следует мой код:

char *strCat(char *dest, char *src) { 
    __asm { 
     xor eax, eax 
     mov ecx, 0xffffffff 
     mov esi, src 
     mov edi, dest 
     mov al, 0 
     cld 
     repne scasb 
     dec edi 
    L0 : 
     lodsb 
     stosb 
     test al, al 
     jne L0 
     mov eax, edi 
    }; 
} 

ocurr ошибка в stosb инструкции по отладку.

С моей точки зрения, код верен. Не удалось найти ошибку.

+3

активизировали вас через встроенный ассемблер в Visual C Studios в ++ отладчик смотреть что происходит? –

+1

Значение 0xffffffff выглядит подозрительно. Для чего это? –

+4

Нам нужно знать, какие параметры вы использовали для вызова этой функции. Вы не можете просто конкатенировать персонажей по своему усмотрению. 'strCat (« abc »,« 123 »)' например, скорее всего, приведет к сбою. – PaulMcKenzie

ответ

2

Проблема с сбоем заключается в том, что вы пытаетесь объединить символы в строковый литерал. Это неопределенное поведение в C++ (и C).

Для вызова вашей функции безопасности, вы должны

1) Убедитесь, что буфер назначения достаточно велик, чтобы держать сцепленную строку, и

2) Буфер назначения записи памяти, а не строка -literal.

Чтобы сделать доступной для записи памяти, один из способов является просто объявить массив символов, который достаточно велик, чтобы держать весь сцепленную строку:

char destination[100] = "abc"; 
strCat(destination, "123"); 
+0

Спасибо, человек! Это сработало для меня. Функция работает как сконструированная –