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

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

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

Здравствуйте. Стоит задача написать программу, которая будет копировать содержимое строки С в строку V, вставляя после каждой точки два пробела. Вот моя реализация :
#include"stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string C;
    string V;
 
    cout << "Please, enter your string" << endl;
    getline(cin, C);
    cout << endl;
 
    __asm
    {
        mov ax, C
        mov ds, ax
        mov es, ax
        cld //df=0;
        lea si, C
        lea di, V
        mov cx, 16
        rep movs C, V
 
        mov ax, C
        mov ds, ax
        push ds
        pop es
        cld
        mov cx, 16
        lea di, V
        mov al, '.'
 
        m1:
        repne scas V
            jne fin
            dec di
            mov word ptr[V], '  .'
            inc di
            loop m1
            fin :
        }
 
    cout << V << endl;

    system("PAUSE");
    return 0;
}
Программа компилируется, но когда доходит дело ко копирования введенной строки, то ругается на строку :
mov ds, ax
Если закомментировать ее, то будет ругаться на следующую строчку, а если закомментировать обе строчки - ругается на
rep movs C, V
Вот скрин , подскажите что не так...

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

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

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

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

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


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

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

5   голосов , оценка 4.2 из 5
Похожие ответы