Ошибка с регистрами - Ассемблерные вставки - 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 для каждого байта в строке.