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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2015, 06:43   #1
sky99
Пользователь
 
Регистрация: 07.05.2015
Сообщений: 18
По умолчанию FASM

FASM.Изменить регистр введенного символа на противоположный по всей строке. Обязательно использовать команду scas. Строку описать в сегменте данных. Помогите, пожалуйста, и, если можно, с выводом.
sky99 вне форума Ответить с цитированием
Старый 07.05.2015, 23:38   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Латиница..
ASCII заглавной буквы, на 20h меньше прописной.
Диапазон заглавных - от 41h до 5Ah; прописных - от 61h до 7Ah.
Выходит, чтоб выделить заглавную букву, достаточно проверки на "меньше или равно 5Аh" (JLE).
Соответственно для выделения прописной, проверяем на "больше или равно 61h" (JGE).

По-сути, оптимальным вариантом было-бы сразу проверять введённый символ, и записывать в сегмент данных уже 'противоположный'.., но раз-уж приспичил SCASB, то будет двойная работа..

В твоём случае можно сделать так:
1. читаем символ с клавиатуры, и сразу выводим его юзеру
2. записываем этот символ в сегмент данных (stosb).
3. по-Enter заканчиваем ввод. значение DI будет длинной строки.
4. переходим к (scasb). сначала переведём все/заглавные в прописные.
5. заносим в AL фактор 5Аh, условие - плюс 20h
6. если символ найден, перезаписываем его в ту-же ячейку
7. теперь, переведём прописные в заглавные: фактор 61h, условие - минус 20h
8. выводим результат юзеру (lodsb, int 29h)

Код:
use16
org 100h
jmp start

text  db  13,10,' Input string...: $'
rezz  db  13,10,' Output string..: $'
pres  db  13,10,' ==============================='
      db  13,10,' Press any key.. $'

start:
   mov  dx,text         ; запрос на ввод
   mov  ah,9
   int  21h

   cld                  ; прямое направление строки
   push di              ; сохраним адрес строки для вывода

inString:
   xor  ax,ax           ; ждём символ с клавиатуры -----------------------------------------|
   int  16h
   cmp  al,0dh          ; это Enter ?!
   je   scanBig         ; если да, то переходим к сканированию
   int  29h             ; если нет, то выводим символ на экран
   stosb                ; сохраняем его в сегменте данных
   jmp  inString        ; ждём следующий..

scanBig:                ; перевод заглавных в прописные ------------------------------------|
   mov  cx,di           ; считаем длинну строки,
   add  cx,2            ; ..cкорректируем её,
   push cx              ; и сохраним в стеке для сканирования.
   push cx              ; это для вывода на экран.
   xor  di,di           ; начало строки
   mov  al,5ah          ; фактор для заглавных..
continue:
   repne scasb          ; сканируем строку по-байтно
   jle  small           ; совпало? на обработку!
   cmp  cx,0            ; конец строки?
   je   scanSmall       ; если да, то переходим к обработке прописных
   jmp  continue        ; сканируем следующий байт
small:
   dec  di              ; вернёмся назад к символу
   add  byte[di],20h    ; добавим к нему 20h
   jmp  continue        ; продолжим сканирование

scanSmall:              ; перевод прописных в заглавные ------------------------------------|
   xor  di,di           ; указатель на начало строки
   pop  cx              ; снимем со-стека длинну строки
continue2:
   mov  al,61h          ; фактор для прописных..
   repne scasb          ; сканируем строку
   jge  big             ; совпало? на обработку!
   cmp  cx,0            ; конец строки?
   je   endScan         ; если да, то выводим из процедуры сканирования
   jmp  continue2       ; продолжаем сканирование
big:
   dec  di              ; вернёмся назад к символу
   sub  byte[di],20h    ; отнимем от него 20h
   jmp  continue2       ; продолжим сканирование

endScan:                ; выводим результат ------------------------------------------------|
   mov  dx,rezz         ; сообщение юзверу
   mov  ah,9
   int  21h

   pop  cx              ; длинна строки
   pop  si              ; указатель на начало для 'lodsb'
prints:
   lodsb                ; читаем символ
   int  29h             ; выводим его на экран
   loop prints          ; мотаем CX раз

   mov  dx,pres         ; Press any key...
   mov  ah,9
   int  21h

   xor  ax,ax           ; ждём любую клавишу
   int  16h
   ret                  ; и на выход! ------------------------------------------------------|
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 10.05.2015, 20:18   #3
sky99
Пользователь
 
Регистрация: 07.05.2015
Сообщений: 18
По умолчанию

Спасибо огромное! Очень помогли
sky99 вне форума Ответить с цитированием
Старый 17.02.2016, 02:56   #4
kapetsa
Новичок
Джуниор
 
Регистрация: 17.02.2016
Сообщений: 3
Вопрос вопрос

но ведь после выполнения перевода всех строчных букв в заглавные (scanBig) строка будет полностью состоять из заглавных, соответственно, после выполнения scanSmall строка будет целиком состоять из строчных? и задача будет решена неверно. поправьте, если я ошибаюсь.
kapetsa вне форума Ответить с цитированием
Старый 17.02.2016, 08:55   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..согласен, что код тупой до-безобразия (хотя и рабочий). Давно это было и много не знал. Вполне можно было обойтись и простыми/логическими операциями:

Код:
ORG  100h
JMP  start

mess0   DB  13,10,'TYPE STRING: $'
mess1   DB  13,10,'RESULT     : $'
buff    DB  80 DUP('$')   ; забиваем буфер баксами

start:
   MOV   AH,9           ; запрос на ввод строки
   MOV   DX,mess0       ;
   INT   21h            ;

   MOV   DI,buff        ; приёмник для STOSB
@input:                 ;
   MOV   AH,1           ; ввод символа c эхо
   INT   21h            ;
   CMP   AL,13          ; ENTER - закончить ввод
   JE    print          ;
   TEST  AL,20h         ; проверяем бит(5) в введённом символе
   JNZ   small          ;
   OR    AL,20h         ; взводим бит(5)
   STOSB                ; ..и сохраняем его в буфере
   JMP   @input         ; сл.символ..
small:                  ;
   AND   AL,0DFh        ; сбрасываем бит(5)
   STOSB                ; сохранение в буфере
   JMP   @input         ;

print:                  ;
   MOV   AH,9           ; выводим на экран
   MOV   DX,mess1       ; ..мессагу,
   INT   21h            ;
   MOV   DX,buff        ;     и результат с буфера.
   INT   21h            ;

exit:                   ;
   XOR   AX,AX          ; выход!
   INT   16h            ;
   INT   20h            ;
Нашедшего выход - затаптывают первым..

Последний раз редактировалось R71MT; 17.02.2016 в 09:00.
R71MT вне форума Ответить с цитированием
Старый 18.02.2016, 05:53   #6
kapetsa
Новичок
Джуниор
 
Регистрация: 17.02.2016
Сообщений: 3
По умолчанию

спасибо)

Последний раз редактировалось kapetsa; 18.02.2016 в 06:00.
kapetsa вне форума Ответить с цитированием
Старый 18.02.2016, 05:59   #7
kapetsa
Новичок
Джуниор
 
Регистрация: 17.02.2016
Сообщений: 3
По умолчанию

ага, только теперь scas нету... ох уж эта извращенная фантазия преподавателей)
kapetsa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Учебник по FASM Roof Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 33 09.12.2013 23:16
fasm : loop Warn Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 27.04.2012 16:39
Чем отличаеться fasm от fasm editor&? TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 07.11.2011 17:00
add, sub(fasm) Lunex.08 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 01.10.2011 12:21
создание ОС на FASM vova65 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 29.09.2011 22:57