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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2011, 18:10   #1
Zart
 
Регистрация: 07.12.2009
Сообщений: 8
По умолчанию FASM (assembler). Удалить пробелы в начале и в конце строки

Задали в универе программу именно на FASM, помогите кто сможет.
Задана строка, удалить из неё пробелы в начале и в конце строки и вывести (через консоль желательно).
Буду ооочень признателен, если к основным строкам кода будут написаны комментарии с описанием действия.
Zart вне форума Ответить с цитированием
Старый 07.04.2011, 07:59   #2
Zart
 
Регистрация: 07.12.2009
Сообщений: 8
По умолчанию

На крайний случай хотя бы на MASMе помогите написать...
Zart вне форума Ответить с цитированием
Старый 07.04.2011, 18:11   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
FORMAT PE CONSOLE
include 'win32axp.inc'

.data
        string db '        ABCDEF        ',0

.code
start:

    mov     eax, string     ; адрес строки в eax
    mov     ecx, eax        ; и в ecx
    push    eax             ; и в стек (пригодится позже)

;        ________ABCDEF________0
;     eax^ecx

; пропускаем начальные пробелы
skip_lead:                 ;                                   <--+
    mov     dl, [ecx]       ; читаем байт                          |
    inc     ecx             ; увеличиваем позицию на 1             |
    cmp     dl, 32          ; байт в этой позиции = 32 (пробел)?   |
    je      skip_lead       ; да, проверяем следующий -------------+
    dec     ecx             ; нет, уменьшаем обратно позицию на 1
    dec     eax             ;      уменьшаем позицию eax на 1

;        ________ABCDEF________0
;    eax^       ^ecx

; "сдвигаем" строку влево, начиная с позиции ecx, затирая ведущие пробелы
shift_left:                ;                                         <--+
    mov     dl, [ecx]       ; читаем байт (начиная с первого не-пробела) |
    inc     eax             ; увеличиваем позицию в eax на 1             |
    inc     ecx             ; увеличиваем позицию в eсx на 1             |
    mov     [eax], dl       ; копируем этот байт в начало строки         |
    or      dl, dl          ; байт = 0 (последний в строке)?             |
    jnz     shift_left      ; нет, возвращаемся и копируем следующий ----+
    pop     ecx             ; достаём из стека адрес первого символа строки и кладём в ecx

;         ABCDEF________________0
;      ecx^                     ^eax

; пропускаем хвостовые пробелы

skip_trail:
    dec     eax             ; уменьшаем eax на 1                     <--+
    cmp     byte[eax], 32   ; байт байт в этой позиции = 32 (пробел)?   |                              
    je      skip_trail      ; да, проверяем предыдущий -----------------+                                  
    inc     eax             ; нет, отступаем на 1 вправо
    mov     byte[eax], 0    ; записываем 0 (конец строки)

;         ABCDEF0_______________0
;      ecx^     ^eax

   sub      eax, ecx                               ; отнимем от eax ecx, получим в eax длину строки
   xchg     eax, ecx                               ; поменяем местами с ecx
   invoke   GetStdHandle, STD_OUTPUT_HANDLE        ; получаем в eax - дескриптор консоли
   invoke   WriteConsole, eax, string, ecx, 0, 0   ; выводим в консоль символы строки string в количестве ecx штук
   invoke   Sleep, 5000                            ; пауза 5 сек
   invoke   ExitProcess, 0                         ; выход

.end start
пыщь

Последний раз редактировалось JTG; 07.04.2011 в 18:19.
JTG вне форума Ответить с цитированием
Старый 07.04.2011, 20:12   #4
Zart
 
Регистрация: 07.12.2009
Сообщений: 8
По умолчанию

Огромное спасибо!!! С комментариями прям вообще супер. Теперь полностью понял как со строками работать в FASM.
Zart вне форума Ответить с цитированием
Старый 23.04.2011, 21:18   #5
Zart
 
Регистрация: 07.12.2009
Сообщений: 8
По умолчанию

А может ещё пожалуйста объяснить как сначала строку считать с файла, а потом уже полученную без пробелов записать в тот же файл.
Zart вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно удалить все пробелы из написанной строки. ISV-777 Помощь студентам 3 23.12.2010 09:37
удалить лишние пробелы со строки так чтобы между символами осталось по одному пробелу delphi MASIK Общие вопросы Delphi 7 22.12.2010 18:23
Как удалить лишние пробелы из строки? MyLastHit Общие вопросы Delphi 26 11.08.2010 21:44
Аналог функции Trim-удаление лишних пробелов в начале и в конце передаваемой строки GULINA Помощь студентам 6 23.05.2009 15:07
удалить лишние пробелы со строки так чтобы между символами осталось по одному пробелу c++ DimaG Общие вопросы C/C++ 1 01.11.2007 21:50