Ошибка с регистрами - Ассемблерные вставки - 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СХ-раз..
- }
Объяснение кода листинга программы
- Длина строки — 16.
- Адрес источника — C.
- Адрес приёмника — V.
- Читаем байт из ESI.
- Сравниваем байт с точкой.
- Если байт не точка, пропускаем.
- Записываем байт в EDI.
- Меняем точку на пробел.
- Записываем байт в EDI.
- Повторяем шаги 4–9 для каждого байта в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д