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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2008, 20:51   #1
ManU
Пользователь Подтвердите свой е-майл
 
Аватар для ManU
 
Регистрация: 30.04.2008
Сообщений: 78
По умолчанию Преобразование строки(ASM)

Задача по ассемблеру.
Нужно ввести с клавиатуры строку со держащую точки. После каждой точки

поставить пробел и сделать букву заглавной.

Ввести с клавиатуры строку я могу. Но я не пойму как её преобразовывать дальше.
И ещё вопрос: Как в ассемблере выводить системное время?
ManU вне форума Ответить с цитированием
Старый 31.05.2008, 21:51   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Это просто
Код:
	mov si, offset oldString	//загружаем в регистр адрес строки-источника	
	mov di, offset newString	//загружаем в регистр адрес строки-приемника
	mov cx, oldString+1		//загружаем в регистр длину строки-источника

isLoop:					//начинаем цикл проверки
	lodsb				//загружаем в аккумулятор первый символ строки
	mov bl, flag			//загружаем состояние флага
	cmp bl, 1			//сравниваем значение флага с сигнальным значением
	je m2				//если флаг в сигнальном состоянии, то переходим к метке m2	
	cmp al, '.'			//иначе проверяем, не является текущий символ точкой	
	je m1				//если точка, переходим к метке m1
  	stosb				//иначе просто записываем текущий символ в строку-приемник
	loop isLoop			//след. итерация цикла
m1:					
	stosb				//записываем текущий символ
	mov al, ' '			//после него записываем пробел(после точки ставим пробел)
	stosb				//
	mov al, 1			//устанавливаем флаг в сигнальное состояние (чтобы изменить следующую букву на заглавную)
	mov flag, al			//

	jmp isLoop			//след. итерация цикла
m2:
	sub al, 20h			//отнимаем от ASCII-кода буквы 20, тоесть превращаем ее в закглавную
	stosb				//записываем в строку-приемник
	mov al, 0			//сбрасываем флаг
	mov flag, al		
	loop isLoop			//след. итерация цикла

	mov al, '$'			//в конце записываем в строку символ окончания строки
	stosb				//
Не факт, что работает, но алгоритм такой.
MaTBeu вне форума Ответить с цитированием
Старый 09.06.2008, 16:31   #3
ManU
Пользователь Подтвердите свой е-майл
 
Аватар для ManU
 
Регистрация: 30.04.2008
Сообщений: 78
По умолчанию

Что-то не так я делаю.

Код HTML:
data segment
IN_STR db 30, ?, 32 dup (?) 	; буфер ввода
iSTR    db 30, ?, 32 dup (?) 	; измененная строка
data ends
code segment
 assume cs:code,ds:data
 start:mov ax,data
 mov ds,ax
 lea dx,IN_STR
 mov ah,0ah
 int 21h 
 xor cx,cx
 mov dl, 0Dh ;перевод курсора в начало текущей строки 
 mov ah, 02h
 int 21h
 mov dl, 0Ah ;перевод курсора вниз на 1 строку
 mov ah, 02h
 int 21h ;20
 lea si,in_str+2   ; установка адреса начала строки 1й
 lea di,iSTR+1     ; установка адреса начала строки 2й
 xor cx,cx         ; очистка регистра сх 
Zicl:
mov al,[si] ;25
  cmp al,'.'  ;сравнение числа и длины строки
  je no
mov [di],al

loop Zicl 
no: mov [di],al 
mov al,' '     
inc di
mov [di],al
inc di
sub al,20h
mov [di],al
jmp Zicl
mov al,'$'
inc di
mov [di],al   
 lea bx,istr+2 
 xor cx,cx
 FC2:
    mov dx,[bx];
    mov ah,02h;
    int 21h;
    inc bx;
loop FC2;
 
 quit: mov ax,4c00h   
 int 21h               
code ends
end start

Последний раз редактировалось ManU; 09.06.2008 в 16:31. Причина: Помогите исправить
ManU вне форума Ответить с цитированием
Старый 09.06.2008, 16:43   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как в ассемблере выводить системное время?
Код:
INT 21 - DOS - GET CURRENT TIME
	AH = 2Ch
Return: CH = hours
	CL = minutes
	DH = seconds
	DL = hundredths of seconds
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2008, 17:20   #5
ManU
Пользователь Подтвердите свой е-майл
 
Аватар для ManU
 
Регистрация: 30.04.2008
Сообщений: 78
По умолчанию Мне удалось

Обе задачи были успешно сделаны
1
PHP код:
[CODE]data segment
IN_STR db 40
,42 dup (?)
OUT_STR db 0Dh,0Ah,80 dup (?)
data ends
code segment
assume cs
:code,ds:data
start
:  mov ax,data
          mov ds
,ax
Ввод строки
           lea dx
,IN_STR
           mov ah
,0Ah
           int 21h
Обработка строки
           lea bx
,IN_STR+2    ;  адрес начала введённой строки
           lea si
,OUT_STR+2  ;  адрес начала строки для вывода
           mov cl
,IN_STR+1   ;  кол-во введённых символов
BEG
:    mov al,[bx]             ;  очередной символ строки
           cmp al
,'.'                ;  очередной символ точка ?
           
jnz M1                   ;  переход в М1если не точка
           mov 
[si],'.'              ;  даточка
           inc si                      
;  запись точки в выхстроку
           mov 
[si],' '               ;  запись точки в выхстроку
           inc si
           inc bx                    
переход к следсимволу вх.строки
           dec cx                    
уменьшение повторений цикла на 1
           mov al
,[bx]             ;  очередной символ строки
           sub al
,32                ;  преобразуем в строчную букву
M1
:     mov [si],al              ;  запись буквы в выхстроку
           inc si
           inc bx                    
переход к следсимволу вх.строки
           loop BEG
           mov 
[si],'$'             ;  запись конца строки для вывода
Вывод строки
           lea dx
,OUT_STR
           mov ah
,09h
           int 21h
QUIT
:  mov ax,4c00h   ;  код завершения 0
           int 21h              
;  выход в DOS
code ends
end start
[/CODE
2
PHP код:
[CODE]data segment
BUF db 6 dup 
(?)
OLD_CS dw ?                 ;  адрес сегмента старого вектора 1Ch
OLD_IP dw 
?                  ;  адрес смещения старого вектора 1Ch
data ends
code segment
assume cs
:code,ds:data
   
;  Программа обработки прерывания 1Ch
New_1C  proc  far
          inc di                  
;  увеличение счётчика тиков
          cmp di
,18
          jb END_Proc        
;  если счётчик<18выход из подпрограммы
          mov ah
,2Ch         ;  вызов функции 2Ch прерывания int 21h
          int 21h                
;  Сh<-часы,  Cl<-мин,  Dh<-сек
          mov ah
,0
          mov al
,dh  
          lea bx
,BUF+
          call far ptr Perevod
          mov al
,cl  
          call far ptr Perevod
          mov al
,ch  
          call far ptr Perevod
          call far ptr Vyvod
          
xor di,di             ;  обнуление счётчика тиков
END_Proc
:     iret
New_1C endp
   
;  Подпрограмма перевода времени в десятичный формат
Perevod  proc  far   
          mov dl
,10             ;  инициализация делителя       
          div dl
          mov 
[bx],ah
          mov ah
,0
          dec bx
          div dl
          mov 
[bx],ah
          mov ah
,0
          dec bx
          ret
Perevod endp
  
;  Подпрограмма вывода времени 
Vyvod  proc  far
          mov ax
,0B800h
          mov es
,ax                ;  запись в es адрес начала видеопамяти
          mov si
,144             ;  смещение относительно начала видеопамяти
          mov dh
,00010100b   ;  атрибутыкрассимвол на голфоне
          mov cx
,3                  ;  кол-во повторений цикла
          lea bx
,BUF
Beg
:    mov ah,[bx]
           
inc bx
           add ah
,'0'
           
mov dl,ah
          mov word ptr es
:[si],dx
           add si
,2
          mov ah
,[bx]
            
inc bx             
           add ah
,'0'
           
mov dl,ah
          mov word ptr es
:[si],dx
          add si
,2
          cmp cx
,1                    ;  на третьем шаге не выводить ':'
          
je M2
          mov dl
,':'
          
mov word ptr es:[si],dx
           add si
,2
M2
:    loop Beg
          ret
Vyvod endp
  
;  Основная программа
START
:  mov ax,DATA
          mov ds
,ax
          mov di
,0         ;  обнуление счётчика тиков
  
Чтение вектора прерывания
          mov ah
35h
          mov al
1Ch
          int 21h
          mov OLD_IP
bx
          mov OLD_CS
es
  
;  Установка вектора прерывания
          push ds
          mov dx
offset New_1C
          mov ax
seg New_1C
          mov ds
ax
          mov ah
25h
          mov al
1Ch
          int    21h
  
;  Ожидание нажатия  клавишы '0' для выхода
M3
:     mov ah,0       ;  исп-е функции 0h прерывания 16h
          int 16h           
;  для опроса буфера клавиатуры
          cmp al
,'0'
          
jne M3
QUIT
mov dxOLD_IP
          mov ax
OLD_CS
          mov ds
ax
          mov ah
25h                       ;  восстановление вектора 1Ch
          mov al
1Ch
          int    21h
          mov ax
4c00h
          int    21h
CODE    ends
end        START
[/CODE]
Может кому пригодятся 
ManU вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование чисел artemavd Общие вопросы Delphi 15 30.07.2008 15:48
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Преобразование... prizrak1390 Общие вопросы Delphi 2 02.04.2008 11:24
Преобразование строки во время kayman Общие вопросы Delphi 7 02.10.2007 15:41