Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2758
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2624
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2150
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1479
Дата выхода:07.10.2011, 21:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:198 / 61
Вопросов / ответов:2 / 2

Консультация # 184129: Здравствуйте! У меня возникли сложности с таким вопросом: Необходимо написать программу которая будет заменять в конце слов 2 последние буквы на строчные. Кое-что у меня получается а кое-что нет) помогите пожалуйста. вот исходник. Программа написана на TASM.)

Код :
Консультация # 184130: Уважаемые эксперты! Помогите. Необходимо,используя TASM, модель памяти tiny , написать программу выполняющая следующие действие: Заменить в исходном файле предлоги "от" предлогами "до" и наоборот, последовательно заменяя частицы "не" союзами "но" и наоборот. переменные двойное слово (dw). ...

Консультация # 184129:

Здравствуйте! У меня возникли сложности с таким вопросом:
Необходимо написать программу которая будет заменять в конце слов 2 последние буквы на строчные.
Кое-что у меня получается а кое-что нет)
помогите пожалуйста.
вот исходник.
Программа написана на TASM.)

Код :
data segment     
handle dw ?      
path db 'primer.txt'
cx_ db ?         
dx_ db ?         
i dw 0
oError db "Cant open file for read",0dh,0ah
sError db "Cant to read of the end file ",0dh,0ah
wError db "Cant to write to file",0dh,0ah
rError db "Cant Read file",0dh,0ah
text db 0        
text_size = $ - offset text
buf db 0       
data ends        
sseg segment stack
       db 200 dup(?)
sseg ends            
code segment         
 assume cs:code, ds:data, ss:sseg
start:               
 mov ax,data  
 mov ds,ax    
;открываем файл для чтения и записи
 mov ah,3dh   
 mov al,2     
 lea dx,path  
 int 21h       
 jc PrevError
 mov handle,ax 
;читаем файл          
read:               
 inc i       
 mov ah,3fh  
 mov bx,handle
 lea dx,buf  
 mov cx,1    
 int 21h     
 jc PrevRError
 cmp buf,' ' 
 je read     
 cmp buf,13  
 je ToBack  ; переходим если конец, иначе читаем дальше 
 jmp read    
PrevError:
        jmp OpenError
PrevRError:
        jmp ReadError
ToBack:              
 mov ah,42h
 mov al,0
 xor dx,dx
 xor cx,cx
 int 21h
 jc ReadError
 sub i,4
 xor si,si
wRead:
 inc si
 mov ah,3fh
 mov bx,handle
 mov cx,1
 lea dx,buf
 int 21h
 jc ReadError
 cmp si,i
 jg mLit
 jmp wRead
mLit:   
    mov ah,3fh
    mov bx,handle
    mov cx,1
    lea dx,buf
    int 21h
    jc ReadError
 cmp buf,41h
 jb mLitN    
 cmp buf,5Ah
 ja mLit
 cmp buf,13h
 je close 
mLitN:           
 cmp buf,5Ah
 ja mLit  
 add buf,20h
 mov ah,40h
 mov bx,handle
 lea dx,buf
 mov cx,1
 int 21h
 jc WriteError
 jmp mLit
ReadError:
 lea dx,rError
 mov ah,9
 int 21h
 jmp close
OpenError:
 lea dx,oError
 mov ah,9
 int 21h
 mov ah,0
 int 16h
 jmp close
WriteError:
 lea dx,wError
 mov ah,9
 int 21h
 mov ah,0
 int 16h
 jmp close
close:
 mov ah,3eh
 int 21h
exit:
 mov ah,0
 int 16h
 mov ax,4ch
 int 21h
code ends
end start

Дата отправки: 02.10.2011, 18:49
Вопрос задал: Посетитель - 382089 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 382089!
Посмотрите, как я сделал.
Предполагается, что файл не больше 32к, иначе обработается только первые 32к
Особо не комментировал, думаю, разберетесь...

Код :
data segment     
path db 'primer.txt',0
oError db "Open file error",0dh,0ah,'$'
wError db "Write file error",0dh,0ah,'$'
rError db "Read file error",0dh,0ah,'$'
zError db "File lenght is 0",0dh,0ah,'$'
sOk db "Ok",0dh,0ah,'$'
sSep db ",.:;!?()"
lenSep equ $-sSep
buf db 8000h dup (?)       
data ends        

sseg segment stack
 dw 200 dup (?)
sseg ends            

code segment         
 assume cs:code, ds:data, ss:sseg
start:               
 mov ax, data  
 mov ds, ax    

;открываем файл для чтения и записи
 mov ax, 3d02h   
 lea dx, path  
 int 21h
 jc OpenError
 mov bx, ax 

 mov cx, 8000h
 lea dx, buf
 mov si, dx
 mov ah, 3fh
 int 21h
 jc ReadError

 mov cx, ax 
 jcxz ZeroError ;длина файла 0

 push cx
 xor dx, dx
main:
 lodsb

;Проверим на разделитель
 cmp al, ' '
 jbe SepFound
 push cx
 lea di, sSep
 mov cx, lenSep
 repne scasb
 pop cx

 jz SepFound ;разделитель

 inc dx  ;не разделитель считаем
 jmp next

SepFound:
 call ChangeWord ;меняем слово (для первого разделителя за словом)

next: 
 loop main
    ;учтем последнее слово
 inc si  ;для единообразия
 call ChangeWord
 
 xor cx, cx  ;указатель файла в начало
 xor dx, dx
 mov ax, 4200h
 int 21h

 pop cx  ;длина файла
 lea dx, buf
 mov ah, 40h
 int 21h

 lea dx, sOk
Print:
 mov ah, 9
 int 21h

 mov ah, 3eh
 int 21h
WaitKey:
 mov ah, 0
 int 16h

 mov ax, 4c00h
 int 21h

ReadError:
 lea dx,rError
 jmp Print
WriteError:
 lea dx,wError
 jmp Print
ZeroError:
 lea dx,zError
 jmp Print
OpenError:
 lea dx,oError
 mov ah,9
 int 21h
 jmp WaitKey

ChangeWord proc
 test dx, dx
 jz CW_ret
 cmp byte ptr [si-2], 'A'
 jb CW_NextLetter
 cmp byte ptr [si-2], 'Z'
 ja CW_NextLetter
 add byte ptr [si-2], 20h
CW_NextLetter:
 dec dx
 jz CW_ret
 cmp byte ptr [si-3], 'A'
 jb CW_ret
 cmp byte ptr [si-3], 'Z'
 ja CW_ret
 add byte ptr [si-3], 20h
CW_ret:
 xor dx, dx
 ret
ChangeWord endp

code ends
 end start

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 03.10.2011, 17:56
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 184130:

Уважаемые эксперты! Помогите.
Необходимо,используя TASM, модель памяти tiny , написать программу выполняющая следующие действие:
Заменить в исходном файле предлоги "от" предлогами "до" и наоборот, последовательно заменяя частицы "не" союзами "но" и наоборот.
переменные двойное слово (dw).

Дата отправки: 02.10.2011, 19:37
Вопрос задал: Посетитель - 382086 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 382086!
Вот такая программа:

Код :
;Заменить в исходном файле предлоги "от" предлогами "до" и наоборот, 
;последовательно заменяя частицы "не" союзами "но" и наоборот.

data segment     
path db 'primer.txt',0
oError db "Open file error",0dh,0ah,'$'
wError db "Write file error",0dh,0ah,'$'
rError db "Read file error",0dh,0ah,'$'
zError db "File lenght is 0",0dh,0ah,'$'
sOk db "Ok",0dh,0ah,'$'
sSep db ",.:;!?()"  ;разделители слов, <= 20h проверяются сравнением
lSep equ $-sSep   ;количество
sWords dw 'то','од','ен','он' ;требуемые слова, в "перевернутом" виде!
lWords equ ($-sWords)/2  ;количество
sNew dw 'од','то','он','ен' ;на эти меняем
buf db 8000h dup (?)       
data ends        

sseg segment stack
 dw 200 dup (?)
sseg ends            

code segment         
 assume cs:code, ds:data, ss:sseg
start:               
 mov ax, data  
 mov ds, ax    
 mov es, ax    

;открываем файл для чтения и записи
 mov ax, 3d02h   
 lea dx, path  
 int 21h
 jc OpenError
 mov bx, ax 

;читаем весь файл
 mov cx, 8000h
 lea dx, buf
 mov si, dx
 mov ah, 3fh
 int 21h
 jc ReadError

 mov cx, ax  ;длина файла
 jcxz ZeroError ;длина файла 0?

 push cx  ;сохраним для записи
 xor dx, dx  ;счнтчик букв слов
main:
 lodsb

;Проверим на разделитель
 cmp al, ' '
 jbe SepFound ;все, которые ' ',9,0dh,0ah,...
 push cx
 lea di, sSep ;точка, запятая и другие
 mov cx, lSep
 repne scasb
 pop cx

 jz SepFound ;разделитель?

 inc dx  ;не разделитель - считаем
 jmp next

SepFound:
 call ChangeWord ;проверяем и, если надо, меняем слово

next: 
 loop main
    ;учтем последнее слово
 inc si  ;для единообразия
 call ChangeWord
 
 xor cx, cx  ;указатель файла в начало
 xor dx, dx
 mov ax, 4200h
 int 21h

 pop cx  ;длина файла
 lea dx, buf
 mov ah, 40h
 int 21h

 lea dx, sOk
Print:
 mov ah, 9
 int 21h

 mov ah, 3eh
 int 21h
WaitKey:
 mov ah, 0
 int 16h

 mov ax, 4c00h
 int 21h

ReadError:
 lea dx,rError
 jmp Print
WriteError:
 lea dx,wError
 jmp Print
ZeroError:
 lea dx,zError
 jmp Print
OpenError:
 lea dx,oError
 mov ah,9
 int 21h
 jmp WaitKey

ChangeWord proc
 cmp dx, 2  ;проверяем только слова длины 2
 jne CW_ret
 push cx
 mov ax, [si-3] ;проверяемое слово
 lea di, sWords ;поищем среди требуемых
 mov cx, lWords
 repne scasw
 pop cx
 jne CW_ret  ;не равно - ничего не делаем
 sub di, offset sWords ;смещение от начала массива (на 2 дальше)
 mov ax, sNew[di-2] ;на это меняем
 mov [si-3], ax ;меняем
CW_ret:
 xor dx, dx  ;сбрасываем длину слова
 ret
ChangeWord endp

code ends
 end start

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 03.10.2011, 19:46
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное