Ошибка с регистрами - Ассемблерные вставки - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Стоит задача написать программу, которая будет копировать содержимое строки С в строку V, вставляя после каждой точки два пробела. Вот моя реализация :
Листинг программы
  1. #include"stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. int main()
  6. {
  7. string C;
  8. string V;
  9. cout << "Please, enter your string" << endl;
  10. getline(cin, C);
  11. cout << endl;
  12. __asm
  13. {
  14. mov ax, C
  15. mov ds, ax
  16. mov es, ax
  17. cld //df=0;
  18. lea si, C
  19. lea di, V
  20. mov cx, 16
  21. rep movs C, V
  22. mov ax, C
  23. mov ds, ax
  24. push ds
  25. pop es
  26. cld
  27. mov cx, 16
  28. lea di, V
  29. mov al, '.'
  30. m1:
  31. repne scas V
  32. jne fin
  33. dec di
  34. mov word ptr[V], ' .'
  35. inc di
  36. loop m1
  37. fin :
  38. }
  39. cout << V << endl;
  40.  
  41. system("PAUSE");
  42. return 0;
  43. }
Программа компилируется, но когда доходит дело ко копирования введенной строки, то ругается на строку :
Листинг программы
  1. mov ds, ax
Если закомментировать ее, то будет ругаться на следующую строчку, а если закомментировать обе строчки - ругается на
Листинг программы
  1. rep movs C, V
Вот скрин , подскажите что не так...

Решение задачи: «Ошибка с регистрами - Ассемблерные вставки»

textual
Листинг программы
  1. __asm {
  2.       mov   ecx,16         ; длина строки
  3.       mov   esi,C          ; адрес источника
  4.       mov   edi,V          ; адрес приёмника
  5. @@1:  lodsb                ; читаем байт из ESI
  6.       cmp   al,'.'         ;
  7.       jne   next           ; пропускаем, если не точка
  8.       stosb                ; иначе: записываем её в EDI
  9.       mov   al,' '         ; меняем точку на пробел
  10.       stosb                ; запись 1 раз
  11. next: stosb                ;   ..и следом второй
  12.       loop  @@1            ; мотаем цикл EСХ-раз..
  13.       }

Объяснение кода листинга программы

  1. Длина строки — 16.
  2. Адрес источника — C.
  3. Адрес приёмника — V.
  4. Читаем байт из ESI.
  5. Сравниваем байт с точкой.
  6. Если байт не точка, пропускаем.
  7. Записываем байт в EDI.
  8. Меняем точку на пробел.
  9. Записываем байт в EDI.
  10. Повторяем шаги 4–9 для каждого байта в строке.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы