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

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


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

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

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

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

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

Номер выпуска:1455
Дата выхода:31.05.2011, 03:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:215 / 64
Вопросов / ответов:4 / 4

Вопрос № 183340: Здравствуйте! Прошу помощи в следующем вопросе: создать и переименовать файл. С созданием файла справился, а вот с переименованием не получается. Условия: DOS, TASM, COM-программа. В чем ошибся? Текст программы прилагаю.

Вопрос № 183347: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: помогите ,пожалуйста , написать программу, считающую количество запятых в файле. Имя файла ввести с клавиатуры или передать как параметр командной строки. Чтение из файла орга...
Вопрос № 183348: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: требуется написать 3 варианта заданной подпрограммы ( на встроенном ассемблере, с использованием модели памяти PASCAL (листинг) и без использования директивы MODEL (листинг...
Вопрос № 183357: Уважаемые эксперты! У меня приближается сессия . Из-за своего курсовика по тоэ, который я решил делать сам, у меня появились проблемы с другими предметами, в том числе предмет "Органи...

Вопрос № 183340:

Здравствуйте! Прошу помощи в следующем вопросе: создать и переименовать файл.

С созданием файла справился, а вот с переименованием не получается. Условия: DOS, TASM, COM-программа. В чем ошибся?
Текст программы прилагаю.

Код :
CSEG segment
ASSUME CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
org 100h

begin:
 mov ah,3Ch    ;функция создания файла
 mov cx,00000000b  ;указываем аттрибуты создаваемого файла: обычный файл
 mov dx,offset filename
 int 21h
 ;jc Error_create   ;если файл не создан - сразу завершение программы
 ;call Ok_msg_create
 ;mov handle,ax
 
 xor ax,ax    ;пауза
 int 16h
 
 mov ah,56h
 mov dx,offset filename
 mov ax,offset new_filename
 mov di,ax
 int 21h
 jc Error_rename
 call Ok_msg_rename
 jmp Quit_prog
 
Error_rename:
 mov ah,09h
 mov dx,offset msg_error_rename
 int 21h
 jmp Quit_prog

Ok_msg_rename proc
 mov ah,09h
 mov dx,offset msg_ok_rename
 int 21h
 ret
Ok_msg_rename endp

Quit_prog:
 ;mov al,32
 mov ah,04ch
 int 21h
 ;int 20h

filename db '_file.txt',0
new_filename db '_file1.txt',0
handle dw 0
msg_error_rename db 'Error! File not renamed.',0ah,0dh,'$'
msg_error_create db 'Error! File not created.',0ah,0dh,'$'
msg_ok_create db 'File created.',0ah,0dh,'$'
msg_ok_rename db 'File renamed.',0ah,0dh,'$'
 
CSEG ends
end begin

Отправлен: 25.05.2011, 10:32
Вопрос задал: Ханинёв Пётр Валерьевич (1-й класс)
Всего ответов: 1
Страница вопроса »


Отвечает Павел Юрьевич (10-й класс) :
Здравствуйте, Ханинёв Пётр Валерьевич!

В коде переименования файла Вы затираете AH. Вот так должно быть:

Код :
mov dx,offset filename
mov ax,offset new_filename
mov di,ax
mov ah,56h
int 21h


Хоть автор ответа и дал ответ на непосредственный вопрос,
но он не указал на существенную ошибку в программе, а именно,
файл после создания/открытия необходимо закрывать.
Привожу фрагмент кода, предоставленный в мини-форуме экспертом
Зенченко Константином Николаевичем

Код :
mov ah,3Ch;функция создания файла
 xor cx,cx;указываем аттрибуты создаваемого файла: обычный файл
 mov dx,offset filename
 int 21h

mov handle,ax
mov dx,offset msg_error_create

 jc Error_create;если файл не создан - сразу завершение программы

mov dx,offset msg_ok_create
Error_Create: call msg

mov bx,handle
mov ah,3eh
int 21h
 xor ax,ax;пауза
 int 16h

Редактирование ответа
-----
∙ Отредактировал: Лысков Игорь Витальевич (Старший модератор)
∙ Дата редактирования: 25.05.2011, 12:10 (время московское)

Ответ отправил: Павел Юрьевич (10-й класс)
Ответ отправлен: 25.05.2011, 10:40
Номер ответа: 267361
Россия, Челябинск
ICQ # 197232777

Оценка ответа: 4

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267361 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183347:

    Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: помогите ,пожалуйста , написать программу, считающую количество запятых в файле. Имя файла ввести с клавиатуры или передать как параметр командной строки. Чтение из файла организовать блоком. Размер блока- по усмотрению. Желательны подробные комментарии. АСС-TASM. Заранее спасибо, с уважением Canijke.

    Отправлен: 25.05.2011, 14:22
    Вопрос задал: Canijke
    Всего ответов: 1
    Страница вопроса »


    Отвечает Зенченко Константин Николаевич (Модератор) :
    Здравствуйте, Canijke!

    Смотрите приложение.
    Имя файла можно ввести как в командной строке, так и в самой программе.
    вопросы задавайте в мини-форум.
    Удачи!

    Приложение:

    -----
    Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

    Ответ отправил: Зенченко Константин Николаевич (Модератор)
    Ответ отправлен: 26.05.2011, 17:54
    Номер ответа: 267400
    Украина, Киев
    Тел.: +38-097-238-60-03
    Адрес: Украина, Киев

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267400 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183348:

    Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: требуется написать 3 варианта заданной подпрограммы ( на встроенном ассемблере, с использованием модели памяти PASCAL
    (листинг) и без использования директивы MODEL (листинг)). Программу, вызывающую эти подпрограммы с указанием автора и варианта задания (5-ый). Задание- копирование строк. АСС- TASM. Очень рассчитываю на Вашу помощь ...

    Отправлен: 25.05.2011, 14:31
    Вопрос задал: Canijke
    Всего ответов: 1
    Страница вопроса »


    Отвечает Зенченко Константин Николаевич (Модератор) :
    Здравствуйте, Canijke!

    Программа на паскале(ТР7):
    Код :
    var
      a,b,c,d:string;
    procedure CopyStrA(var x,y:string);external;
    {$L q183348a}
    procedure CopyStrB(var x,y:string);external;
    {$L q183348b}
    procedure CopyStrC(var x,y:string);
      begin
        asm
          cld
          lds  si,dword ptr x
          les  di,dword ptr y
          lodsb
          stosb
          mov  cl,al
          xor  ch,ch
          rep  movsb
        end
      end;
    begin
      Writeln('Canijke');
      repeat
        write('Enter string:');
        readln(d)
      until length(d)>0;
      CopyStrA(d,a);
      writeln('Result A:',a);
      CopyStrB(d,b);
      Writeln('Result B:',b);
      CopyStrC(d,c);
      writeln('Result C:',c);
      readln;
    end.


    С директивой MODEL и упрощенным описанием сегментов:
    Код :
    model small,pascal
    code
    public CopyStrA
    proc CopyStrA
     push bp
     mov bp,sp
     cld
     mov di,[bp+04]
     mov es,[bp+06]
     mov si,[bp+08]
     mov ds,[bp+10]
     lodsb
     stosb
     mov cl,al
     xor ch,ch
     rep movsb
     pop bp
     ret 8
    endp
    end


    Полное описание сегмента:
    Код :
    _TEXT segment word public 'CODE'
    public CopyStrB
    assume cs:_TEXT
    proc CopyStrB
     push bp
     mov bp,sp
     cld
     mov di,[bp+04]
     mov es,[bp+06]
     mov si,[bp+08]
     mov ds,[bp+10]
     lodsb
     stosb
     mov cl,al
     xor ch,ch
     rep movsb
     pop bp
     ret 8
    endp
    _TEXT ends
    end


    Компилятор TASM 2.0.
    вопросы задавайте в минифорум
    Удачи!
    -----
    Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

    Ответ отправил: Зенченко Константин Николаевич (Модератор)
    Ответ отправлен: 26.05.2011, 14:16
    Номер ответа: 267396
    Украина, Киев
    Тел.: +38-097-238-60-03
    Адрес: Украина, Киев

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267396 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183357:

    Уважаемые эксперты!
    У меня приближается сессия . Из-за своего курсовика по тоэ, который я решил делать сам, у меня появились проблемы с другими предметами, в том числе предмет "Организация ЭВМ" . Поэтому очень прошу вас помочь с программой...
    Задание такое:
    Нужно написать собственное прерывание.
    05h - прерывание, генерируемое при нажатии клавиш Shift+PrintScr;

    действия, реализуемые программой обработки
    прерываний:
    Выдача звукового сигнала(печать символа с кодом 07h);
    Заранее огромное спасибо!

    Отправлен: 26.05.2011, 02:17
    Вопрос задал: Митиоглов Борис (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Митиоглов Борис !
    Вот Вам программа, которая устанавливает на время своей работы свой обработчик вектора 5

    Обратите внимание, что если ее просто так запустить под ХР, то программа не будет работать, как надо!!!
    Это связано с тем, что система некоторые комбинации клавиш и просто клавиши, в том числе PrintScreen,
    считает служебными и не желает отдавать их программам.
    Но клавишу PrintScreen можно попросить у системы, если создать PIF-файл для EXE-программы.
    И там, в свойствах, на вкладке "Разное" выключить checkbox "PrtSc".
    Запускать программу надо будет с помощью PIF-файла.

    Код :
     .model small
    
    assume cs:code, ds:data, ss:AStack
    
    AStack segment stack
     dw 1024 dup (?)
    AStack ends
    
    data segment
    sPress db 0dh,0ah,'Press ESC for exit...$'
    Off_05 dw ?  ;указатель на старый обработчик вектора 1ch
    Seg_05 dw ?
    data ends
    
    code segment
    main proc
     mov ax, data
     mov ds, ax  ;ds = data
    
     mov ax, 3505h
     int 21h  ;узнаем вектор 05h в es:bx
    
     mov Off_05, bx ;сохраним старый адрес в сегменте данных
     mov Seg_05, es
    
     push ds
     lea dx, new_05 ;установим новый адрес
     push cs  ;обработчика прерывания 05h
     pop ds  ;ds:dx
     mov ax, 2505h
     int 21h
     pop ds
    
     lea dx, sPress ;выведем приглашение нажать ESC
     mov ah, 9
     int 21h
    
    wait_ESC:
     mov ah, 0  ;ждем
     int 16h
     cmp al, 1bh  ;выходим по ESC
     jne wait_ESC
    
        ;воcстановим старый обработчик вектора 05h
     push ds  ;ds
     lds dx, dword ptr Off_05 ;ds:dx - адрес старого вектора
     mov ax, 2505h
     int 21h  ;восстановим!
     pop ds   ;ds = data
     sti
    
     mov ax, 4c00h
     int 21h  ;выход в ДОС
    main endp
    
    new_05 proc far  ;подпрограмма отработки 05h
     push ax
     push dx
     mov dl, 7  ;код 7 "пищит" на спикере"
     mov ah, 2
     int 21h
     pop dx
     pop ax  ;восстановим регистры
     iret   ;возврат из прерывания
    new_05 endp
    
    code ends
    
     end main

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 26.05.2011, 10:30
    Номер ответа: 267388
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267388 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное