Ошибка с регистрами - Ассемблерные вставки - 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 для каждого байта в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д