Изменение исходного кода для процессора 8086 - Assembler
Формулировка задачи:
Кто может пожалуйста немного нужно изменить код чтобы отличался от данного
Листинг программы
- ;ASGN: N1
- ;Buff - строка с паролем
- ;MaxLen - Максимальная длина строки
- MaxLen equ 100
- .286
- .model small
- .stack 100h
- .data
- buff db 101 dup(?)
- pass db 101 dup(?)
- PathtoFile db '1.txt',0
- Msg1 db 13,10,'Input password: $'
- Msg2 db 13,10,'The password is incorrect$'
- Msg_error db 'Error$'
- Month db 'January$ '
- db 'February$ '
- db 'March$ '
- db 'April$ '
- db 'May$ '
- db 'June$ '
- db 'July$ '
- db 'August$ '
- db 'September$'
- db 'October$ '
- db 'November$ '
- db 'December$ '
- ln_pass dw 0
- handle dw 0
- cnt dw 3
- s db ":$"
- .code
- startupcode
- Open:
- mov ah, 3dh
- mov al, 00
- lea dx, PathtoFile
- int 21h
- jc Error
- mov handle,ax
- jmp Readfile
- Error:
- mov ah,9
- mov dx,offset Msg_error; ссылка на сообщение
- int 21h
- jmp exit
- Readfile:
- mov ah, 3fh
- mov bx, handle
- mov cx, 512
- lea dx, pass
- int 21h
- jc Error
- mov ln_pass, ax
- PassAttempt:
- mov di,offset buff ;Указатель на строку
- xor cx,cx ;Счетчик введенных символов обнуляем
- ;вывод сообщения
- mov ah,9
- lea dx, Msg1
- int 21h
- PassLoop: ;Начало цикла ввода
- mov ah,08h
- int 21h ;Ждем нажатия клавиши
- cmp al,0dh
- je EndLoop ;Если Enter то закончить цикл
- cmp cx,MaxLen
- je PassLoop ;Если конец буфера строки то ждем Enter
- mov [di],al ;Помещаем нажатую клавишу в буфер
- inc di ;Увеличиваем адрес
- inc cx ;Увеличиваем счетчик
- mov ah,02h
- mov dl,"*"
- int 21h ;Выводим звездочку
- jmp PassLoop ;На начало цикла
- EndLoop:
- xor al,al ;Обнуляем al
- mov [di],al ;В конец нашей строки 0
- push cx
- push ds
- pop es
- lea si, buff
- lea di, pass
- mov cx, ln_pass
- repe cmpsb
- pop cx
- je PrintDate
- ;вывод сообщения
- mov ah,9
- lea dx, Msg2
- int 21h
- dec cnt
- cmp cnt,0
- jne PassAttempt
- jmp exit
- PrintDate:
- ;перевод в начало следущей строки
- mov ah,2
- mov dl,0dh
- int 21h
- mov dl,0ah
- int 21h
- ;получаем дату
- mov ah,2ah
- int 21h
- ;вывод дня
- push cx
- push dx
- xor ax, ax
- mov al, dl
- call PrintNum
- mov ah, 02h
- mov dl, " "
- int 21h
- pop dx
- ;вывод месяца
- mov ah,10
- mov al, dh
- dec dh
- mov al,dh
- mul ah
- lea dx, Month
- add dx, ax
- mov ah, 9
- int 21h
- mov ah, 02h
- mov dl, " "
- int 21h
- ;вывод года
- pop cx
- mov ax, cx
- call PrintNum
- ;перевод в начало следущей строки
- mov ah,2
- mov dl,0dh
- int 21h
- mov dl,0ah
- int 21h
- ;Получаем время
- mov ah,2ch
- int 21h
- ;Вывод часа
- push dx
- push cx
- xor ax,ax
- mov al,ch
- Call PrintNum
- mov ah,9
- lea dx,s
- int 21h
- ;вывод минут
- pop cx
- xor ax,ax
- mov al,cl
- Call PrintNum
- mov ah,9
- lea dx,s
- int 21h
- ;Вывод секунд
- pop dx
- xor ax,ax
- mov al,dh
- Call PrintNum
- exit: ; Выход из программы
- mov ah, 3eh ;закрытие файла
- mov bx, handle
- int 21h
- mov ah,4ch
- int 21h
- ;Макрос переводящий число в строку (не более 65535)
- ;num - число
- ;на выходе, в стеке хранится размер и число по разрядам
- dectoascii macro num
- mov cx,num
- xor di,di
- mov bx,10
- @@1:
- inc di
- xor dx,dx
- mov ax,cx
- div bx
- push dx
- mov cx,ax
- cmp cx,0
- je @@2
- jmp @@1
- @@2:
- push di
- endm
- printnum proc
- dectoascii ax
- ;Вывод на экран
- pop cx ;длина числа в cx
- @@3:
- mov ah,02h
- pop dx ;восстанавливаем из стека очередной разряд
- add dl,"0"
- int 21h
- loop @@3
- ret
- printnum endp
- END
Решение задачи: «Изменение исходного кода для процессора 8086»
textual
Листинг программы
- .286
- .model small
- .stack 100h ; размер стека
- ;ASGN: N1
- ;Buff - строка с паролем
- ;MaxLen - Максимальная длина строки
- .data
- MaxLen equ 512
- buff db MaxLen+1 dup(0)
- pass db MaxLen+1 dup(0)
- PathtoFile db '1.txt',0
- Msg1 db 13,10,'Input password: $'
- Msg2 db 13,10,'The password is incorrect$'
- Msg_error db 'Error$'
- Month db 'January$ ' ; по 16 символов, чтоб пользоваться сдвигом на 4
- db 'February$ '
- db 'March$ '
- db 'April$ '
- db 'May$ '
- db 'June$ '
- db 'July$ '
- db 'August$ '
- db 'September$ '
- db 'October$ '
- db 'November$ '
- db 'December$ '
- ln_pass dw 0
- handle dw 0
- cnt dw 3 ; количество попыток ввода пароля
- .code
- startupcode
- ; Открываем файл на чтение
- Open:
- mov ah, 3dh ; открыть описатель файла
- mov al, 00 ; для чтения
- lea dx, PathtoFile ; ds:dx адрес строки ASCIIZ с именем файла
- int 21h
- jc Error
- mov handle,ax
- jmp Readfile
- Error:
- mov ah,9 ; Выдать строку на дисплей
- lea dx, Msg_error ; дрес строки, заканчивающейся символом '$'
- int 21h
- jmp quit
- ; Читаем из файла MaxLen байт в буфер pass
- Readfile:
- mov ah, 3fh ; читать файл через описатель
- mov bx, handle ; описатель файла
- lea dx, pass ; DS:DX = адрес буфера для чтения данных
- mov cx, MaxLen ; число считываемых байт
- int 21h
- jc Error
- mov ln_pass, ax
- ; читаем с консоли символы в buff (пароль)
- PassAttempt:
- mov ah, 09h ; Выдать строку на дисплей
- lea dx, Msg1 ; дрес строки, заканчивающейся символом '$'
- int 21h
- lea di, buff ; Указатель на строку
- xor cx, cx ; Счетчик символов
- PassLoop:
- cmp cx, MaxLen
- je EndLoop
- mov ah, 08h ; Консольный ввод без эха
- int 21h
- cmp al, 0dh ; Клавиша Enter
- je EndLoop
- mov [di],al ; Пишем в буфер
- inc di ; Сдвигаемся по буферу
- inc cx ; Увеличиваем счетчик
- mov ah, 02h ; вывод на дисплей
- mov dl, '*'
- int 21h
- jmp PassLoop
- EndLoop:
- xor al, al
- mov [di],0 ; Ставим 0 в конец buff
- ; сравниваем buff и pass (проверяем пароль) [cx уже содержит количество байт в buff]
- lea si, buff
- lea di, pass
- cld
- repe cmpsb
- je PrintDate
- ; проверка не удалась
- mov ah, 09h ; Выдать строку на дисплей
- lea dx, Msg2 ; дрес строки, заканчивающейся символом '$'
- int 21h
- dec cnt ; уменьшаем количество попыток
- cmp cnt, 0
- jne PassAttempt ; отправляем вводить пароль снова
- jmp exit
- PrintDate:
- ; это перевод в начало следущей строки
- mov ah, 02h ; вывод на дисплей
- mov dl, 0dh ; 13
- int 21h
- mov dl, 0ah ; 10
- int 21h
- mov ah, 2ah ; дать системную дату
- int 21h
- ; AL = день недели (0=Вск, 1=Пнд,...6=Суб) DOS 3.0+
- ; CX = год (1980 до 2099)
- ; DH = месяц (1 до 12)
- ; DL = день (1 до 31)
- push cx ; прячем в стеке год
- push dx ; потом месяц и день
- ;вывод дня
- movzx ax, dl
- call PrintNum
- mov ah, 02h ; вывод на дисплей (разделитель в дате)
- mov dl, ' '
- int 21h
- pop dx
- ;вывод месяца (буквами)
- dec dh
- movzx ax, dh
- mov ah, 09h ; Выдать строку на дисплей
- lea dx, [Month+4*ax] ; DS:DX = адрес строки, заканчивающейся символом '$'
- int 21h
- mov ah, 02h ; вывод на дисплей (разделитель в дате)
- mov dl, ' '
- int 21h
- pop cx
- ;вывод года
- mov ax, cx
- call PrintNum
- ; это перевод в начало следущей строки
- mov ah, 02h ; вывод на дисплей
- mov dl, 0dh ; 13
- int 21h
- mov dl, 0ah ; 10
- int 21h
- mov ah, 2ch ; дать время DOS
- int 21h
- ; CH = часы (0 до 23)
- ; CL = минуты (0 до 59)
- ; DH = секунды (0 до 59)
- ; DL = сотые доли секунды (0 до 99)
- push dx ; пишем в стек секунды и доли
- push cx ; потом часы и минуты
- ;Вывод часа
- movzx ax,ch
- Call PrintNum
- mov ah, 02h ; вывод на дисплей
- mov dl, ':' ; разделитель чисел
- int 21h
- ;вывод минут
- pop cx
- movzx ax,cl
- Call PrintNum
- mov ah, 02h ; вывод на дисплей
- mov dl, ':' ; разделитель чисел
- int 21h
- ;Вывод секунд
- pop dx
- movzx ax,dh
- Call PrintNum
- exit:
- mov ah, 3eh ; Закрыть описатель файла
- mov bx, handle ; описатель файла
- int 21h
- quit:
- mov ah, 4ch ; завершить программу -- EXIT
- int 21h ; al - код выхода
- ;Макрос переводящий число в строку (не более 65535)
- ;num - число
- ;на выходе, в стеке хранится размер и число по разрядам
- dectoascii macro num
- mov ax, num ; кладем число в ax
- mov bx, 10 ; будем делить его на 10
- xor di, di ; количество цифр
- @@1:
- inc di
- xor dx, dx ; (ax:dx = num)
- div bx
- push dx ; последняя цифра уходит в стек
- test ax, ax
- jnz @@1
- push di ; всего цифр тоже отправляем в стек
- endm
- printnum proc
- dectoascii ax
- pop cx ; количество цифр (счетчик цикла)
- @@3:
- mov ah, 02h ; вывод на дисплей
- pop dx ; вынимаем цифру из стека
- add dl, '0'
- int 21h
- loop @@3
- ret
- printnum endp
- END
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д