Мое назначение - реализовать функцию в сборке, которая будет делать следующее: цикл через последовательность символов и свопинг их таким образом, чтобы конечный результат был исходной строкой в обратном порядке (100 баллов) Подсказка: соберите строку от пользователя как C-строку, затем передайте ее функции сборки вместе с количеством символов, введенных пользователем. Чтобы узнать количество символов, используйте функцию strlen().Сборка: циклическая последовательность символов и их замена
Я написал как C++, так и сборки, и он отлично работает для расширения: например, если я ввожу 12345, то вывод правильно показан как 54321, но если вы перейдете более чем на 5 символов: стартовый старт будет неправильным: например, если я ввожу 123456, выход: 653241. Я буду очень признателен всем, кто может указать, где моя ошибка состоит в том:
.code
_reverse PROC
push ebp
mov ebp,esp ;stack pointer to ebp
mov ebx,[ebp+8] ; address of first array element
mov ecx,[ebp+12] ; the number of elemets in array
mov eax,ebx
mov ebp,0 ;move 0 to base pointer
mov edx,0 ; set data register to 0
mov edi,0
Setup:
mov esi , ecx
shr ecx,1
add ecx,edx
dec esi
reverse:
cmp ebp , ecx
je allDone
mov edx, eax
add eax , edi
add edx , esi
Swap:
mov bl, [edx]
mov bh, [eax]
mov [edx],bh
mov [eax],bl
inc edi
dec esi
cmp edi, esi
je allDone
inc ebp
jmp reverse
allDone:
pop ebp ; pop ebp out of stack
ret ; retunr the value of eax
_reverse ENDP
END
и вот мой C++ код:
#include<iostream>
#include <string>
using namespace std;
extern"C"
char reverse(char*, int);
int main()
{
char str[64] = {NULL};
int lenght;
cout << " Please Enter the text you want to reverse:";
cin >> str;
lenght = strlen(str);
reverse(str, lenght);
cout << " the reversed of the input is: " << str << endl;
}
Не заметили никаких реальных ошибок, просто действительно странные вещи. Если вы собираетесь использовать EBP в качестве реестра общего назначения, вы должны оставить материал 'mov ebp, esp'. (И просто получить доступ к вашим аргументам со смещением от ESP). Такие комментарии, как 'set data register to 0', бесполезны. Было бы полезно описать, для чего используется ваша функция EDX. 'mov eax, ebx' в верхней части функции кажется бесполезным, почему бы просто не загружать в EAX? Единственное использование EBX в остальной части функции - положить байты в BL и BH. –
Одна ошибка заключается в том, что вы должны сохранять/восстанавливать EBX, как вы делаете EBP, потому что он сохраняется во всех обычных 32-битных соглашениях. Вероятно, у вас, вероятно, есть еще одна ошибка, так как переход на значение EBX вашего вызывающего абонента, вероятно, не приведет к поведению, которое вы видите. Вы должны сделать один шаг через свой код в отладчике, чтобы узнать, что он делает. –
Большое спасибо Мистер Кордес за ваши замечательные и конструктивные комментарии, я сожалею, что загрузил такой плохой код без комментариев вообще, я был настолько расстроен своим кодом, что забыл посмотреть на мои глупые комментарии. – ArashDe