24.08.2019, 04:23 [+3 UTC]
в нашей команде: 3 779 чел. | участники онлайн: 2 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.77 (31.05.2019)
JS-v.1.34 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
22.08.2019, 11:39

Последний вопрос:
23.08.2019, 10:58
Всего: 150135

Последний ответ:
23.08.2019, 21:59
Всего: 258866

Последняя рассылка:
24.08.2019, 01:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
22.08.2009, 23:26 »
Владимир Лазурко
Мне очень понравилась функция отправки СМС-сообщений - удобно!
23.08.2009, 09:05 »
Медведева Елена Владимировна
Молодцы! Так держать!!!

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

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

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 91
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 69
Kdsfofwe21
Статус: 2-й класс
Рейтинг: 0

Перейти к консультации №:
 

Консультация онлайн # 195835
Раздел: • Assembler
Автор вопроса: ndrozdov9 (Посетитель)
Отправлена: 12.06.2019, 17:37
Поступило ответов: 0

Уважаемые эксперты! Дали задание на ргр:
Создать метку тома дискеты, значение которой вводится с клавиатуры (ввод с клавиатуры средствами DOS, а также вывод на экран в текстовом режиме)
Не понимаю что это такое, подскажите, пожалуйста

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 195835

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

= общий = | 12.06.2019, 17:41 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ndrozdov9:

Здравствуйте! Вы еще работаете с дискетами? smile smile
У тома дискеты, как и у любого диска есть имя (метка). Вот и требуется присвоить новое имя дискете... Вот и все... smile
Пробуйте, пишите сюда, поможет, подправим... smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

ndrozdov9
Посетитель

ID: 403126

# 2

= общий = | 12.06.2019, 17:51 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:



Есть некоторые наброски, но это неправильный вариант решения вопроса

;---в сегменте данных
VOL_STRING   DB    'The volume label is $'
NO_LABEL     DB    'There is no volume label $'
DIR_AREA     DB    3584 DUP(?)
 
;---читаем 7 секторов каталога
         MOV  AX,SEG DIR_AREA         ;сегмент буфера
         MOV  ES,AX                   ;
         MOV  BX,OFFSET DIR_AREA      ;смещение буфера
         MOV  DL,0                    ;номер накопителя
         MOV  DH,0                    ;номер головки
         MOV  CH,0                    ;номер дорожки
         MOV  CL,6                    ;стартовый сектор
 
         MOV  AL,7                    ;число секторов каталога
         MOV  AH,2                    ;номер функции чтения
         INT  13H                     ;читаем каталог в память
;---ищем метку тома, сравнивая байт атрибутов с 8
         MOV  CX,112                  ;число элементов
         ADD  BX,11                   ;смещение для атрибутов
TRY_AGAIN:   MOV  AL,[BX]             ;берем 1-й элемент
         CMP  AL,8                    ;это метка тома?
         JE   GOT_IT                  ;если да, то уход
         ADD  BX,32                   ;иначе на след. элемент
         LOOP TRY_AGAIN               ;
;---выводим сообщение об отсутствии метки тома
         MOV  AH,9                    ;функция вывода строки
         LEA  DX,NO_LABEL             ;указываем на строку
         INT  21H                     ;выводим ее
         JMP  SHORT CONTINUE          ;на конец
;---выводим строку, дающую метку тома
GOT_IT:  MOV  AH,9                    ;функция вывода строки
         LEA  DX,VOL_STRING           ;указываем на строку
         INT  21H                     ;выводим ее
         SUB  BX,11                   ;указатель на метку
         MOV  CX,11                   ;пишем 11 символов
         MOV  AH,2                    ;функция вывода символов
NEXT_CHAR:   MOV  DL,[BX]             ;символ в DL
         INT  21H                     ;выводим символ
         INC  BX                      ;переходим к следующему
         LOOP NEXT_CHAR               ;

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 3

= общий = | 13.06.2019, 20:20 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ndrozdov9:

Читать при помощи 13h - плохая идея smile
Идея должна быть такая:
Volume label - метка тома, это обычный файл с атрибутом 8h.
Метку тома легко найти простым поиском файлов, по маске '*.*' с атрибутом 8h, функцией FindFirst, сервиса int 21h.
Если файл найден, то это и есть метка тома, только придется вручную вырезать из имени точку (если она есть).
Если не найден, то метка отсутствует (NO_NAME).
Установить метку, по идее, можно функцией 16h, сервиса int 21h - Create truncate file using FCB.
Последнее никогда не пробовал... smile
Дерзайте smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

ndrozdov9
Посетитель

ID: 403126

# 4

= общий = | 18.06.2019, 10:51 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

text segment 'code'     
 
assume CS:text, DS:text
org 100h
 
main:
    ; очистка экрана : начало
    mov AX, 0600h   ; AH=06 (прокрутка)
                ; AL=00 (весь экран)                    
    mov BH, 07      ;Нормальный атрибут (черно/белый)
    mov CX, 0000h   ;Верхняя левая позиция
    mov DX, 184fh   ;Нижняя правая позиция
    int 10h	    ;Передача управления в BIOS
    ; очистка экрана : конец
    
    mov  ah,09
    lea dx,msg_lb1
    int 21h
    
    mov  ah,09
    lea dx,msg_lb2
    int 21h
    
    mov  ah,09
    lea dx,msg_lb3
    int 21h
    
    mov  ah,09
    lea dx,msg_lb4
    int 21h
    
    mov  ah,09
    lea dx,msg_lb5
    int 21h
 
    ; перевод размера программы в символьный вид: начало    
    lea DI, msg_size[20]            
    mov AX, word ptr _size          
    call GET_CHAR               
    ; перевод размера программы в символьный вид : конец
    ; устанавливаем позицию курсора для вывода ФИО и группы
    mov AH, 02      ;Запрос на установку курсора 
    mov BH, 00      ;Экран 0   
    mov DH, 01      ;Строка 01  
    mov DL, 00      ;Столбец 00
    int 10h 	    ;Передача управления в BIOS
    ; выводим ФИО и группу  
    lea DX, m1
    call PRINT
    ; устанавливаем позицию курсора для приглашения ввести новую метку  
    mov AH, 02    ;Запрос на установку курсора    
    mov BH, 00    ;Экран 0   
    mov DH, 06    ;Строка 06   
    mov DL, 00    ;Столбец 00   
    int 10h       ;Передача управления в BIOS
    ; выводим приглашение ввести новую метку
    lea DX, msg_lb
    call PRINT
    ; считываем новую метку тома дискеты с клавиатуры   
    lea DX, sLabel+1 ;Загрузка адреса сообщ.      
    mov BX, DX       ;копируем смещение в рег. BX  
    mov AL, 12       ;заносим в AX  
    mov [BX], AL     ;пересылать содержимое регистра AL по адресу, лежащему в регистре DX 
    mov AH, 0Ah         
    int 21h         
    ; сохраняем количество реально введённых символов
    xor CX, CX       ;делим на 10         
    mov CL, byte ptr sLabel[2]  
    add CL, 3               
    mov DI, CX              
    ; дописывам префикс к метке тома, указав диск A:
    mov [sLabel+0], byte ptr 'C'
    mov [sLabel+1], byte ptr ':'
    mov [sLabel+2], byte ptr '\'
    mov [sLabel+DI], 00        
    ; устанавливаем позицию курсора для вывода сообщения о результате
    mov AH, 02      ;Запрос на установку курсора
    mov BH, 00      ;Экран 0 
    mov DH, 08      ;Строка 08
    mov DL, 00      ;Столбец 00
    int 10h         ;Передача управления в BIOS
    ; метка тома создаётся функцией создания файла
    mov AH, 3ch      ;АН = 3Ch (номер функции DOS)     
    mov CX, 08             
    lea DX, [sLabel]      
    int 21h         
    jc L_ERR            
          ; выводим сообщение об успешной смене метки тома
    lea DX, msg_ok
    call PRINT
        
L_EXIT:
    ; устанавливаем позицию курсора для вывода размера программы
    mov AH, 02  
    mov BH, 00      
    mov DH, 10      
    mov DL, 00  
    int 10h     
        
    ; выводим размер программы
    lea DX, msg_size
    call PRINT
    
    ; функция ожидания нажатия клавиши
    mov AH, 08h     
    int 21h
    ; выход из программы в DOS
    mov AX, 4C00h
    int 21h
 
L_ERR:  ; обработка ошибочной ситуации 
    lea DX, msg_err
    call PRINT
    jmp L_EXIT
 
PRINT proc  ; вывод сообщения
    push AX
    mov AH, 09h
    int 21h
    pop AX
    ret
PRINT endp
 
; функция перевода числового значения в строковой тип
GET_CHAR proc
    mov         CX,0010       
СA:
    cmp         AX,0010           
    jb          CB                
    xor         DX,DX             
    div         CX             
    or          DL,30H
    mov         [DI],DL            
    dec         DI
    jmp         СA
CB:
    or          AL,30H            
    mov         [DI],AL            
    ret
GET_CHAR endp
 
; Поля данных
    m1          db "",'$'
    msg_size    db "Razmer programmy:     $"
 
    msg_lb      db "Vvedite novuyu metku: $"
    msg_lb1     db "Raschetno-graficheskaya rabota",0ah,0dh,'$'
    msg_lb2     db "Po discipline Sistemnoe programmnoe obespechenie",0ah,0dh,'$'
    msg_lb3     db "Vipolnil: Student",0ah,0dh,'$'
    msg_lb4     db "FIO ",0ah,0dh,'$'
    msg_lb5     db "Variant :",0ah,0dh,'$'
    msg_ok      db "Metka diska C izmenena.",0ah,0dh,"$"
    msg_err     db "Oshibka! Metka ne smenena!",0ah,0dh,"$"
    sLabel      db 16 dup (00h)
 
    ; вычисляем размер программы
    _size = $-main
text ends
    end main

-----
Последнее редактирование 19.06.2019, 10:58 ndrozdov9 (Посетитель)

ndrozdov9
Посетитель

ID: 403126

# 5

= общий = | 19.06.2019, 10:59 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Извините, существует ли способ упростить этот код?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 6

= общий = | 19.06.2019, 11:38 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ndrozdov9:

Я бы делал так...

Код (Assembler) :: выделить код
text segment 'code'     
 
assume CS:text, DS:text
org 100h
 
main:
    ; очистка экрана : начало
    mov ax, 0003h
    int 10h
    
    mov  ah,09
    lea dx,msg_lb1
    int 21h
 
    ; выводим приглашение ввести новую метку
    lea DX, msg_lb
    call PRINT

    ; считываем новую метку тома дискеты с клавиатуры   
    lea DX, sLabel   ;Загрузка адреса сообщ.      
    mov AH, 0Ah         
    int 21h         

    xor BX, BX
    mov BL, cnt  
    mov byte ptr [sName+1], ':'
    mov byte ptr [sName+2], '\'
    mov byte ptr [data+BX], 0        

    ; метка тома создаётся функцией создания файла
    mov AH, 3ch      ;АН = 3Ch (номер функции DOS)     
    mov CX, 08             
    lea DX, [sName]      
    int 21h         
    jc L_ERR            
          ; выводим сообщение об успешной смене метки тома
    lea DX, msg_ok
    call PRINT
        
L_EXIT:
        
    ; выводим размер программы
    lea DX, msg_size
    call PRINT

    mov AX, word ptr _size          
    call PRINT_AX

    lea DX, msg_lf
    call PRINT
    
    ; функция ожидания нажатия клавиши
    mov AH, 08h     
    int 21h
    ; выход из программы в DOS
    mov AX, 4C00h
    int 21h
 
L_ERR:  ; обработка ошибочной ситуации 
    lea DX, msg_err
    call PRINT
    jmp L_EXIT
 
PRINT proc  ; вывод сообщения
    push AX
    mov AH, 09h
    int 21h
    pop AX
    ret
PRINT endp
 
; функция перевода числового значения в строковой тип
PRINT_AX proc
    mov bx, 10
    xor cx, cx
PRINT_AX_div_loop:
    xor dx, dx
    div bx
    inc cx
    push dx
    test ax, ax
    jne PRINT_AX_div_loop
    mov ah, 2
PRINT_AX_out_loop:
    pop dx
    or dl, '0'
    int 21h
    loop PRINT_AX_out_loop
    ret
PRINT_AX endp
 
; Поля данных
    msg_size    db "Razmer programmy: $"
 
    msg_lb      db "Vvedite novuyu metku: $"
    msg_lb1     db "Raschetno-graficheskaya rabota",0ah,0dh
                db "Po discipline Sistemnoe programmnoe obespechenie",0ah,0dh
                db "Vipolnil: Student",0ah,0dh
                db "FIO Drozdov",0ah,0dh
                db "Variant : 1 (for example  smile  )",0ah
    msg_lf      db 0dh,0ah,'$'

    msg_ok      db 0ah,0ah,0dh,"Metka diska C izmenena.",0ah,0dh,0ah,"$"
    msg_err     db 0ah,0ah,0dh,"Oshibka! Metka ne smenena!",0ah,0dh,0ah,"$"

    sName       db 'C'
    sLabel      db 12
    cnt		db 0
    data        db 13 dup (00h)
 
    ; вычисляем размер программы
    _size = $-main
text ends
    end main
Только я не уверен, что функция 3ch поменяет имя тома smile smile

=====
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15394 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.77 от 31.05.2019
Версия JS: 1.34 | Версия CSS: 3.35