Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2016, 16:03   #1
Dmitriy1991
Пользователь
 
Регистрация: 22.11.2016
Сообщений: 11
По умолчанию Удаление лишних пробелов (Ассемблер)

Есть код. Нужно переписать его с ассемблерной вставкой
Код:
#include<iostream>
 
using namespace std;
 
extern "C" char *spaceasm(char *szsrc, char *chdst);
 
int main() {
    char szSrc[] = "This is    just a  testing    test string   (for   example  ;o)";
    char chDst[sizeof (szSrc)];
    cout << "Source: " << szSrc << endl;    
    cout << "Source: " << spaceasm(szSrc, szSrc) << endl;
    system("pause");
    return 0;
}
Код:
;
.386
.MODEL FLAT, C
;
.CODE
spaceasm PROC Public Uses ESI EDI pszsrc:Dword, pchdst:Dword
      MOV   ESI, pszsrc
      MOV   EDI, pchdst
copy_loop:
      LODSB
put_char:
      STOSB
      TEST  AL, AL
      JZ    done
      CMP   AL, " "
      JNE   copy_loop
skip_loop:
      LODSB
      CMP   AL, " "
      JE    skip_loop
      JMP   put_char
done:
      MOV   EAX, pchdst
      RET
spaceasm ENDP
;
END
;
Dmitriy1991 вне форума Ответить с цитированием
Старый 17.12.2016, 20:07   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Код:
   mov  ecx,chDst        ; длина строки
   lea   esi,szSrc       ; её адрес для чтения
   mov   edi,esi         ;   ..и для записи
   xor   eax,eax         ; EAX = 0
cycle:                   ;
   lodsb                 ; считать символ
   cmp   al,' '          ; пробел?
   jne   miss            ; нет
   cmp   ax,'  '         ; иначе: тест с предыдущим
   je    next            ; 2 пробела - пропускаем
miss:                    ;
   stosb                 ; перезапись символа
next:                    ;
   xchg  ah,al           ; запомним текущий символ
   loop  cycle           ; промотать ECX-раз..
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 17.12.2016 в 20:10.
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Удаление лишних пробелов Поксочка Помощь студентам 4 13.01.2014 23:12
Удаление лишних пробелов. Lucky777 Помощь студентам 0 01.12.2010 21:49
Удаление лишних пробелов. qwertytol Общие вопросы C/C++ 5 16.05.2010 15:43
(Ассемблер)Ввод\вывод строк, удаление лишних пробелов... Марияzzz Помощь студентам 0 28.04.2010 20:01