Skip to content
🤔prompts chat🧠
🔍
question:Есть программа для сортировки введённой строки по длине слов и вывода отсортированной строки. Она компилируется, но не приводит к нужному результату. Найди ошибки #include <stdio.h> #include "conio.h" #include <iostream> using namespace std; int main() { char ch; char source[28] = "send string", dest[28] = " "; int len1; short cch; int i; len1 = strlen(source); ch = getchar(); cch = int(ch); _asm { Lea edi, source Mov al, byte ptr cch Mov ecx, len1 Repne scasb Mov al, byte ptr[edi] Dec edi mov ebx, edi // в bx адрес буквы s Mov al, ' ' Repne scasb Dec edi Mov al, [edi] mov edx, edi // в edx адрес пробела mov ecx, edx sub ecx, ebx // cx - длина слова Dec edx mov esi, edx // в si адрес последней буквы слова - адрес источника Lea edi, dest copir : mov al, byte ptr[esi] Mov[edi], al Dec esi Inc edi Dec cx Jne copir // Сортировка по длине слова mov ecx, len1 sub ecx, edx // Внешний цикл - количество слов mov ebx, ecx start_outer_loop : mov ecx, ebx sub ecx, edx mov esi, ebx dec esi start_inner_loop : mov edi, esi dec edi // Сравнение длин слов mov al, [eax + esi] mov bl, [eax + edi] cmp al, bl ja swap_words loop_inner_loop : cmp edi, edx je end_inner_loop movzx eax, byte ptr[eax + esi] mov[eax + edi], al inc edi jmp loop_inner_loop end_inner_loop : jmp start_outer_loop swap_words : mov al, ' '; временный регистр для хранения символа пробела movzx edx, byte ptr[eax + esi]; edx = длина текущего слова mov edi, esi loop_swap_words : movzx eax, byte ptr[eax + esi] mov bl, [eax + edi] mov[eax + esi], bl inc edi cmp edi, edx je end_swap_words mov al, byte ptr[eax + esi] mov[eax + edi], al inc edi jmp loop_swap_words end_swap_words : dec esi jmp start_inner_loop end_outer_loop : } cout << "source" << "n"; for (i = 1; i < 11; i++) cout << source[i]; cout << "n"; cout << "dest:" << "n"; for (i = 0; i < 11; i++) cout << dest[i]; cout << "dest" << "n"; return 0; } Есть программа для сортировки введённой строки по длине слов и вывода отсортированной строки. Она компилируется, но не приводит к нужному результату. Найди ошибки #include <stdio.h> #include "conio.h" #include <iostream> using namespace std; int main() { char ch; char source[28] = "send string", dest[28] = " "; int len1; short cch; int i; len1 = strlen(source); ch = getchar(); cch = int(ch); _asm { Lea edi, source Mov al, byte ptr cch Mov ecx, len1 Repne scasb Mov al, byte ptr[edi] Dec edi mov ebx, edi // в bx адрес буквы s Mov al, ' ' Repne scasb Dec edi Mov al, [edi] mov edx, edi // в edx адрес пробела mov ecx, edx sub ecx, ebx // cx - длина слова Dec edx mov esi, edx // в si адрес последней буквы слова - адрес источника Lea edi, dest copir : mov al, byte ptr[esi] Mov[edi], al Dec esi Inc edi Dec cx Jne copir // Сортировка по длине слова mov ecx, len1 sub ecx, edx // Внешний цикл - количество слов mov ebx, ecx start_outer_loop : mov ecx, ebx sub ecx, edx mov esi, ebx dec esi start_inner_loop : mov edi, esi dec edi // Сравнение длин слов mov al, [eax + esi] mov bl, [eax + edi] cmp al, bl ja swap_words loop_inner_loop : cmp edi, edx je end_inner_loop movzx eax, byte ptr[eax + esi] mov[eax + edi], al inc edi jmp loop_inner_loop end_inner_loop : jmp start_outer_loop swap_words : mov al, ' '; временный регистр для хранения символа пробела movzx edx, byte ptr[eax + esi]; edx = длина текущего слова mov edi, esi loop_swap_words : movzx eax, byte ptr[eax + esi] mov bl, [eax + edi] mov[eax + esi], bl inc edi cmp edi, edx je end_swap_words mov al, byte ptr[eax + esi] mov[eax + edi], al inc edi jmp loop_swap_words end_swap_words : dec esi jmp start_inner_loop end_outer_loop : } cout << "source" << "n"; for (i = 1; i < 11; i++) cout << source[i]; cout << "n"; cout << "dest:" << "n"; for (i = 0; i < 11; i++) cout << dest[i]; cout << "dest" << "n"; return 0; }

answer:Ошибки в программе: 1. Необходимо добавить заголовок "string.h" для использования функции strlen(). 2. Заголовок "conio.h" и директива "using namespace std" не используются и можно удалить. 3. В строке `Mov al, byte ptr cch` необходимо заменить `byte ptr` на `ptr`. 4. В строке `mov esi, edx // в si адрес последней буквы слова - адрес источника` необходимо заменить `si` на `esi`. 5. В строке `mov al, [eax + esi]` необходимо заменить `eax` на `edi`. 6. В строке `mov al, ' '; временный регистр для хранения символа пробела` необходимо заменить `ал` на `ebx`. 7. В строке `movzx edx, byte ptr [eax + esi]; edx = длина текущего слова` необходимо удалить пробел перед `[eax + esi]`. 8. В строке `movzx eax, byte ptr [eax + esi]` необходимо удалить пробел перед `[eax + esi]`. 9. В строки `mov al, byte ptr [eax + esi]` и `mov [eax + edi], al` необходимо поменять местами `eax` и `edi` для корректной работы обращения к памяти. 10. В строке `mov al, byte ptr [eax + esi]` необходимо удалить пробел перед `[eax + esi]`. 11. В строке `mov [eax + edi], al` необходимо удалить пробел перед `[eax + edi]`. 12. В строке `mov al, ' '; временный регистр для хранения символа пробела` необходимо удалить `;` в конце строки. Исправленный код программы: ```cpp #include <stdio.h> #include <string.h> #include <iostream> using namespace std; int main() { char ch; char source[28] = "send string", dest[28] = " "; int len1; short cch; int i; len1 = strlen(source); ch = getchar(); cch = int(ch); _asm { Lea edi, source Mov al, ptr cch Mov ecx, len1 Repne scasb Mov al, byte ptr[edi] Dec edi mov ebx, edi // в bx адрес буквы s Mov al, ' ' Repne scasb Dec edi Mov al, [edi] mov edx, edi // в edx адрес пробела mov ecx, edx sub ecx, ebx // cx - длина слова Dec edx mov esi, edx // в esi адрес последней буквы слова - адрес источника Lea edi, dest copir : mov al, byte ptr[esi] Mov[edi], al Dec esi Inc edi Dec cx Jne copir // Сортировка по длине слова mov ecx, len1 sub ecx, edx // Внешний цикл - количество слов mov ebx, ecx start_outer_loop : mov ecx, ebx sub ecx, edx mov esi, ebx dec esi start_inner_loop : mov edi, esi dec edi // Сравнение длин слов mov al, [edi] mov bl, [esi] cmp al, bl ja swap_words loop_inner_loop : cmp edi, edx je end_inner_loop movzx eax, byte ptr[esi] mov[edi], al inc edi jmp loop_inner_loop end_inner_loop : jmp start_outer_loop swap_words : mov al, ' ' // временный регистр для хранения символа пробела movzx edx, byte ptr[esi] ; edx = длина текущего слова mov edi, esi loop_swap_words : movzx eax, byte ptr[esi] mov bl, [esi + edi] mov[esi], bl inc edi cmp edi, edx je end_swap_words mov al, byte ptr[esi] mov[edi], al inc edi jmp loop_swap_words end_swap_words : dec esi jmp start_inner_loop end_outer_loop : } cout << "source" << "n"; for (i = 1; i < 11; i++) cout << source[i]; cout << "n"; cout << "dest:" << "n"; for (i = 0; i < 11; i++) cout << dest[i]; cout << "dest" << "n"; return 0; } ```

question:Mov al, ptr cch - синтаксическая ошибка из-за ptr

answer:Сожалею за путаницу. Действительно, в инструкции `Mov al, ptr cch` есть ошибка. Для корректного копирования значения переменной `cch` в регистр `al`, необходимо использовать инструкцию `Mov al, cch`. Вот исправленный фрагмент кода: ```cpp Mov al, cch ``` Причина этой ошибки заключается в неверном использовании синтаксиса инструкции `mov`, где `ptr` не тот атрибут, который нужно использовать.

question:Теперь в этой строке конфликт размеров операндов

answer:Извините за путаницу. В фрагменте кода указана неправильная инструкция для перемещения значения переменной `cch` в регистр `al`. Используйте инструкцию `movzx` для корректного копирования значения переменной `cch` в `al`. Вот исправленный фрагмент кода: ```cpp movzx eax, cch mov al, byte ptr[eax] ``` Это позволит корректно скопировать значение `cch` (предположительно, это длина слова) в `al`. Обратите внимание, что мы копируем значение из `eax` в `al`, используя `mov al, byte ptr[eax]`.

question:При fsub происходит st(0) = st(0) - st(1) или st(0) = st(1) - st(0)?

answer:При выполнении инструкции `fsub` в формате `FPU` происходит пересчёт значения в регистре `st(0)` следующим образом: `st(0) = st(1) - st(0)`. То есть значение, находящееся на вершине стека `st(0)`, вычитается из значения на верхнем уровне стека `st(1)`, а результат сохраняется в `st(0)`. В результате выполнения инструкции, значение `st(0)` будет обновлено результатом операции вычитания.

Released under the MIT License.

has loaded