Процедура не возвращает значения (MASM)
я написал эту процедуру, которая считает количество слов, предложений и абзацев в тексте, но она почему-то не получает нужные данные из кода на ассемблере. Вот сам код:
.686p
.MODEL FLAT, C
.STACK
.data
words dd 0
PrioritySpace dd 0
PriorityDots dd 0
Paragraph dd 0
dots dd 0
.code ; точка входа в программу
counterOfWrdSntncPrgrph proc str1:dword, res:dword, len:dword
xor edx, edx ;обнуление регистра edx, служащий для подсчета количества добавляемых символов в результирующую строку
mov ecx, [len] ;инициализация счетчика цикла длиной введенной строки
mov ebx, [str1] ;запись в ebx адреса первого элемента строки
cycle:
mov al, [ebx] ;запись в регистр al текущий символ строки
cmp al, 012q ;сравнение текущего символа с символом перевода строки
je line_break ;в случае совпадения, переход на метку для пробельного символа - переноса строки
cmp al, 040q ;сравнение текущего символа с символом пробела
je space ;в случае совпадения, переход на метку пробельного символа - пробела
cmp al,056q ;сравнение текущего символа с символом точки
je dot ;в случае совпадения, переход на метку предложений
cmp al, 041q ;сравнение текущего символа с символом восклицательного знака
je dot ;в случае совпадения, переход на метку предложений
cmp al, 077q ;сравнение текущего символа с символом вопросительного знака
je dot ;в случае совпадения, переход на метку предложений
jmp symbol ;если текущий символ не является специальным
;метка символа, неявляющимся специальным
symbol:
mov PriorityDots, 0 ;обнуление "булевой" переменной окончания строки
jmp resume
;метка переноса строки
line_break:
inc [Paragraph] ;инкрементирование количества абзацев
jmp resume ;переход на продолжение цикла
;метка пробела
space:
cmp PrioritySpace, ' ' ;проверка на текущий символ
jne space_inc ;если не пробел инкримируем кол-во слов
jmp resume
;инкримирование слов
space_inc:
inc [words] ;инкрементирование количества слов
jmp resume ;переход на продолжение цикла
dot:
cmp PriorityDots, 0
je dot_inc
jmp resume
dot_inc:
mov PriorityDots, 1
inc [dots]
jmp resume
;добавление количества абзацев, слов и предложений в переменные результата
;продолжение цикла
resume:
mov PrioritySpace, ebx ;запись текущего символа для проверки на многопробелье
inc ebx ;переход на адрес следующего элемента основной строки
dec ecx ;декрементация счетчика цикла
cmp ecx, 0 ;проверка счетчика на 0 - конец строки
jne cycle ;если не конец строки, новый проход по циклу
mov eax, [dots]
mov [res], eax
mov eax, [words]
mov [res+4], eax
mov eax, [Paragraph]
mov [res+8], eax
ret
counterOfWrdSntncPrgrph endp
end
и С++
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <conio.h>
#include <stdio.h>
using namespace std;
extern "C"
{
//
void counterOfWrdSntncPrgrph(char* str1, int[3], int len);
}
int main()
{
//инициализация переменных
string str;
char str1[250];
int answ[3] = {};
int len;
cout << "Enter the string: ";
//ввод текста
std::getline(cin, str, ';');
//определение длины строки
len = strlen(str1);
//вызов процедуры
cout << "Number of sentences, words and paragraphs:";
//вывод отформатированной строки
counterOfWrdSntncPrgrph(str1, answ, len);
for (int i = 0; i < 3; i++) {
cout << answ[i]<<' ';
}
_getch();
}