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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2009, 15:43   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Перевод слов

Необходимо написать переводчик. я написала обработку прер
ывания по нажатию ctrl+a вылезает окошко в котором пишется enter word, но заместо надписи просто черные квадраты, и ничего больше нельзя написать, вернее когда пишешь ничего не видно. Вот мой код:
Код:
..model tiny
.code
org 100h
main:
;==================================================================================
;		поиск таблицы прерываний
;==================================================================================
	push es
	xor ax,ax
	mov es,ax

;==================================================================================
;	запись в old_handler вектора 9 прерывания
;==================================================================================	
	mov ax,word ptr es:[09h*4]
	mov word ptr old_handler,ax
	mov ax,word ptr es:[09h*4+2]
	mov word ptr old_handler+2,ax
	
;==================================================================================
;	запись в old_handler вектора 9 прерывания
;==================================================================================	
	mov ax,cs
      mov word ptr es:[09h*4+2],ax
      mov ax,offset handler
      mov word ptr es:[09h*4],ax

;==================================================================================
; оставление программы резедентно в памяти
;==================================================================================
        pop es
        mov bx,offset last_byte
        int 27h
        
;==================================================================================
;		собственный обработчик
;==================================================================================
handler:
      push es ds si di cx bx dx ax
      xor ax,ax
      
      mov ah,02h	;функция получения регистра клавиатуры
      int 16h
      test al,00000100b	;если нажат ctrl то проверяем нажатие a
      jz standart_handler	;иначе переходим в стандартный обработчик	
	in al,60h	      
      cmp al,1eh	;проверка сочитание ctrl+a если нажата переходим в ядро переводчика
	je start_trans	
	cmp al,1fh	;иначе проверяем нажатие ctrl+s
	je exit_trans	;если ctrl+s перейти на 
	jmp standart_handler	;если не нажата то переходим на стандартный обработчик
	
;==================================================================================
;	завершение работы переводчика
;==================================================================================
exit_trans:
	mov ah,05h	;функция изменения текущей страницы 
	mov al,0
	int 10h
	jmp end_handler	

start_trans:
;==================================================================================
;			начало работы переводчика
;==================================================================================
	mov ah,05h 
	mov al,1
	int 10h
	mov ah,06h	;функция инициализации окна
	mov al,0	;окно без прокрутки
	mov bh,31h	;бирюзовый фон, синие симоволы
	mov ch,0	;y левый верхний
	mov cl,0	;x левый верхний
	mov dh,10 	;y правый нижний
	mov dl,60	;y правый нижний
	int 10h
;==================================================================================
;		вывод собщения
;==================================================================================
	push es
    	mov ax, 0B800h
     	mov es, ax
	push cs
	pop ds
     	mov di,1000h
	mov si, offset first
	mov cx, 10
	rep movsw
	
	
	mov ah,02h	;функцифя позиционирования курсора
	mov bh,1	;страница 1
	mov dh,1	;сторка
	mov dl,0	;столбец
	int 10h 
	pop es
	
	
;===================================================================================
;		завершение собственного переводчика
;===================================================================================
end_handler:
        mov al,20h      
        out 20h,al 
        pop ax dx bx cx di si ds es
        iret


;===================================================================================
;		возвращение стандартного обработчика
;===================================================================================
standart_handler:
        pop ax dx bx cx di si ds es
        jmp dword ptr cs:old_handler
	  iret

;===================================================================================
;	описание данных
;===================================================================================
	first db 'E',0Ch,'n',0Ch,'t',0Ch,'e',0Ch,'r',0Ch,' ',0Ch,'w',0Ch,'o',0Ch,'r',0Ch,'d',0Ch
	old_handler dd ?
last_byte:
end main
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 25.12.2009 в 15:57.
Sparky вне форума Ответить с цитированием
Старый 25.12.2009, 17:28   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Как считать содержимое файла в массив? У меня получилось вот это
Код:
mov ax,3d00h	; открываем для чтения
	lea dx,path		; DS:dx указатель на имя файла
	int 21h		; в ax деcкриптор файла
	jc exit		; если поднят флаг С, то ошибка открытия
	
	mov bx,ax		; копируем в bx указатель файла
	xor cx,cx
	xor dx,dx
	mov ax,4200h
	int 21h		; идем к началу файла
	
	mov bx,offset buf
	xor si,si
	
out_str:
	mov ah,3fh		; будем читать из файла
	mov cx,1		; 1 байт
	lea dx,buf[si]		; в память buf
	int 21h	
			
	cmp ax,cx		; если достигнуть EoF или ошибка чтения
	jnz close		; то закрываем файл закрываем файл
	
	add si,2
	jmp out_str
	
close:			; закрываем файл, после чтения
    	mov ah,3eh
	int 21h
exit:			; завершаем программу
	int 21h
	
	
	
	path db "D:\DOSBox\TASM\BIN\slovar.txt",0 ; имя файла для октрытия
	buf db 255 dup (?)
Скажите правильно или нет помойму нет
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 25.12.2009, 17:57   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Вообщем опишу всю задачу, если кто-то может чем-то помочь пишите. Буду ждать. необходимо написать переводчик, который будет находиться резедентно в памяти. При нажатии ctrl+a появляется окшко в котором есть приглашении на ввод, пользователь вводит слово, оно должно быть найдено в текствовом файле и должен быть выдан его перевод. После окно должно быть закрыто. Так же оно закрывается при нажатии ctrl+s. Все что есть выложенно в первом посте. Жду помощи...
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 25.12.2009, 18:57   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Вот что есть:
Код:
.model tiny
.code
org 100h
main:
;==================================================================================
;		загрузка файла
;==================================================================================
	mov ah,3dh	;открытие файла
	mov al,2	;доступ чтение/запись
	mov dx,offset path	;адрес имени файла
	int 21h
	
	mov handle,ax	;получение дескриптора
	mov ah,3fh
	mov bx,handle
	mov cx,100	;сколько считать
	mov dx,offset buf ;куда считать

	int 21h
	mov cx,ax	;сколько реально прочитали
;==================================================================================
;		поиск таблицы прерываний
;==================================================================================
	push es
	xor ax,ax
	mov es,ax

;==================================================================================
;	запись в old_handler вектора 9 прерывания
;==================================================================================	
	mov ax,word ptr es:[09h*4]
	mov word ptr old_handler,ax
	mov ax,word ptr es:[09h*4+2]
	mov word ptr old_handler+2,ax
	
;==================================================================================
;	запись в old_handler вектора 9 прерывания
;==================================================================================	
	mov ax,cs
      mov word ptr es:[09h*4+2],ax
      mov ax,offset handler
      mov word ptr es:[09h*4],ax

;==================================================================================
; оставление программы резедентно в памяти
;==================================================================================
        pop es
        mov bx,offset last_byte
        int 27h
        
;==================================================================================
;		собственный обработчик
;==================================================================================
handler:
      push es ds si di cx bx dx ax
      xor ax,ax
      
      mov ah,02h	;функция получения регистра клавиатуры
      int 16h
      test al,00000100b	;если нажат ctrl то проверяем нажатие a
      jz standart_handler	;иначе переходим в стандартный обработчик	
	in al,60h	      
      cmp al,1eh	;проверка сочитание ctrl+a если нажата переходим в ядро переводчика
	je start_trans	
	cmp al,1fh	;иначе проверяем нажатие ctrl+s
	je exit_trans	;если ctrl+s перейти на 
	jmp standart_handler	;если не нажата то переходим на стандартный обработчик
	
;==================================================================================
;	завершение работы переводчика
;==================================================================================
exit_trans:
	mov ah,05h	;функция изменения текущей страницы 
	mov al,0
	int 10h
	jmp end_handler	

start_trans:
;==================================================================================
;			начало работы переводчика
;==================================================================================
	mov ah,05h 
	mov al,1
	int 10h
	mov ah,06h	;функция инициализации окна
	mov al,0	;окно без прокрутки
	mov bh,31h	;бирюзовый фон, синие симоволы
	mov ch,0	;y левый верхний
	mov cl,0	;x левый верхний
	mov dh,10 	;y правый нижний
	mov dl,60	;y правый нижний
	int 10h
;==================================================================================
;		вывод собщения
;==================================================================================
	push es
    	mov ax, 0B800h
     	mov es, ax
	push cs
	pop ds
     	mov di,1000h
	mov si, offset first
	mov cx, 10
	rep movsw
	
	
	mov ah,02h	;функцифя позиционирования курсора
	mov bh,1	;страница 1
	mov dh,1	;сторка
	mov dl,0	;столбец
	int 10h 
	pop es
	
	
;===================================================================================
;		завершение собственного переводчика
;===================================================================================
end_handler:
        mov al,20h      
        out 20h,al 
        pop ax dx bx cx di si ds es
        iret


;===================================================================================
;		возвращение стандартного обработчика
;===================================================================================
standart_handler:
        pop ax dx bx cx di si ds es
        jmp dword ptr cs:old_handler
	  iret

;===================================================================================
;	описание данных
;===================================================================================
	first db 'E',0Ch,'n',0Ch,'t',0Ch,'e',0Ch,'r',0Ch,' ',0Ch,'w',0Ch,'o',0Ch,'r',0Ch,'d',0Ch
	old_handler dd ?
	handle dw ? ;ячейка для дескриптора
	path db "D:\DOSBox\TASM\BIN\slovar.txt",0 ; имя файла для октрытия
	buf db 80 dup(' ')
last_byte:
end main
Единственное, что ограничивает полет мысли программиста-компилятор

Последний раз редактировалось Sparky; 25.12.2009 в 19:10.
Sparky вне форума Ответить с цитированием
Старый 27.12.2009, 19:36   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

как модернизировать этот кусок, чтобы массив mass брался из файла
Код:
model tiny
.code
org     100h
main:
	mov ah,05h 
	mov al,1
	int 10h
	mov ah,06h	;функция инициализации окна
	mov al,0	;окно без прокрутки
	mov bh,31h	;бирюзовый фон, синие симоволы
	mov ch,0	;y левый верхний
	mov cl,0	;x левый верхний
	mov dh,10 	;y правый нижний
	mov dl,60	;y правый нижний
	int 10h


	mov dx, offset message1	
	mov ah,09h
     	int 21h


 	mov ah,02h	;функцифя позиционирования курсора
	mov bh,1	;страница 1
	mov dh,1	;сторка
	mov dl,0	;столбец
	int 10h  
     
	mov dx,offset buff
     	mov ah,0ah
     	int 21h
     	
	mov si, offset mass
find:
     mov di, offset buff+2
 
compare:
     cmp byte ptr[di],' '
     jz end_slovo
     cmpsb
     jz compare
 
next_line:
     inc si
     cmp [si],0
     jz not_found
     cmp [si],0a0dh
     jnz next_line
     inc si
     inc si
     jmp find

end_slovo:
	 mov ah,02h	;функцифя позиционирования курсора
	mov bh,1	;страница 1
	mov dh,2	;сторка
	mov dl,0	;столбец
	int 10h  
     inc si
     mov dx,si
     mov ah,09
     int 21h
     ret
 
not_found:
	mov ah,02h	;функцифя позиционирования курсора
	mov bh,1	;страница 1
	mov dh,2	;сторка
	mov dl,0	;столбец
	int 10h  
     mov dx, offset message2
     mov ah,09h
     int 21h
     ret

mass db "hi привет$",0dh,0ah
	db "sun солнце$",0dh,0ah
	db "work работа$",0
message1 db 'enter word:$'
message2 db 'not found$'
buff	db 10,10 dup(?)
end main
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 27.12.2009, 19:51   #6
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

тупо загрузить его до резидентного завершения в память:
Код:
	mov ax,3d00h	;Открываем найденный файл на чтение
        lea dx,filename ;slovar.txt
	int 21h
	mov bx,ax	;сохраняем хэндл найденного файла
	mov ah,3fh	;Читаем сколько можно
	mov cx,65535
	mov dx,offset mass
	int 21h
	mov ah,3eh	;Закрываем файл, поскольку он уже не нужен
	int 21h
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 27.12.2009, 19:59   #7
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
model tiny
.code
org     100h
main:

;=======================================================================
;		инициализация окна
;=======================================================================
	mov ah,05h 
	mov al,1
	int 10h
	mov ah,06h	;функция инициализации окна
	mov al,0	;окно без прокрутки
	mov bh,31h	;бирюзовый фон, синие симоволы
	mov ch,0	;y левый верхний
	mov cl,0	;x левый верхний
	mov dh,10 	;y правый нижний
	mov dl,60	;y правый нижний
	int 10h

	mov si, offset mass
	mov dx, offset message1	
	mov ah,09h
     	int 21h


 	mov ah,02h	;функцифя позиционирования курсора
	mov bh,1	;страница 1
	mov dh,1	;сторка
	mov dl,0	;столбец
	int 10h  
     
	mov dx,offset buff
     	mov ah,0ah
     	int 21h
     
     	mov dl,0ah
	mov ah,02h
     	int 21h
     	
     	
;=======================================================================
;		файл
;=======================================================================
	mov ax,3d00h	;Открываем найденный файл на чтение
      lea dx,path ;slovar.txt
	int 21h
	mov bx,ax	;сохраняем хэндл найденного файла
	mov ah,3fh	;Читаем сколько можно
	mov cx,65535
	mov dx,offset mass
	int 21h
	mov ah,3eh	;Закрываем файл, поскольку он уже не нужен
	int 21h
;==============================================================
;	поиск слова
;==============================================================    	
find:
     mov di, offset buff+2
 
compare:
     cmp byte ptr[di],'\'
     jz end_slovo
     cmpsb
     jz compare
 
next_line:
     inc si
     cmp [si],0
     jz not_found
     cmp [si],0a0dh
     jnz next_line
     inc si
     inc si
     jmp find

end_slovo:
     inc si
     mov dx,si
     mov ah,09
     int 21h
	jmp close
 
not_found:
     mov dx, offset message2
     mov ah,09h
     int 21h
     jmp close
     
close:
	;mov ah,05h 
	;mov al,0
	;int 10h
	ret
;==============================================================
;	описание данных
;==============================================================
mass db 500 dup(?)
message1 db 'enter word:$'
message2 db 'not found$'
buff     db ""
path db 'slovar.txt'
end main
после ввода слова ругается что система не может открыть com1
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 27.12.2009, 21:38   #8
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Сходу скажу, что buff db "" нужно заменить
buff db 20,20 dup(0)
иначе slovar.txt затрется и в переменной path будет введенное слово
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 28.12.2009, 15:32   #9
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

ошибки нет но вот теперь все равно не находит слово... Помогите исправить
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вырезание слов KoBRaAndrey Общие вопросы Delphi 5 24.12.2009 20:49
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28
по вводу слов в массив и подсчёт введённых слов -ushёl- Общие вопросы C/C++ 4 16.11.2009 00:45
Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов. KAPAHDAW Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2009 01:19
Вставка слов )Игнат( Общие вопросы Delphi 1 16.03.2008 21:58