Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 4.2.2008
Репутация: нет Всего: нет
|
Здравствуйте! Возникла необходимость переделать файл.сom в файл.exe, знаю - .com меньше по размеру и наверно ещё чем-то лучше файла в .exe, но таковы требования препода... Копирайт проги не мой, в программировании плохо разбираюсь, поэтому прошу вашей помощи кто знает как преобразовать файл в нужный формат. Спасибо! | Код | .model tiny .code .386 org 100h start: ;выполнение происходит методом копирования в видеопамять cld ;сброс DF, для прямого хода по строкам mov ax,0B800h ;адрес видеопамяти в текстовом режиме mov es,ax mov ax,0003h ;перевод в видеорежим 80х25 int 10h ;---------------------- ;Блок команд вывода приглашения и проверки введеных символов ;Можно выйти, нажав Esc. ;---------------------- l9: mov dx,offset prigl ;адрес строки приглашения mov ah,09h ;функция вывода строки int 21h l10: mov ah,11h ;функция проверки нажатия символа int 16h jz l10 ;если нажатия не было - повтор cmp al,1Bh ;в противном случае al - код символа. Нажата Esc? je vse ;да - переход на завершение mov ah,0Ah ;нет - идем дальше. Функция считывания введеной с клавы строки в буфер mov dx,offset buf ;адрес буфера int 21h mov dx,offset crlf ;перевод курсора на следующую строку mov ah,9 int 21h cmp byte ptr buf[1],0 ;введена ли строка? jne l8 ;да - предложение нажать клавишу mov dx,offset no ;нет - вывод соответствующей строки mov ah,09h int 21h jmp l9 ;и снова вывод приглашения l8: mov dx,offset press mov ah,09h ;предложение нажать клавишу int 21h ;---------------------- ;Вывод строки первый раз ;---------------------- l3: mov ah,06h ;функция проверки нажатия любого символа mov dl,0FFh int 21h ;клавиша нажата? jz l3 ;нет - ждем
;необходимо очистить экран с той строки, с которой будут выводится символы. ;это необходимо, если пользователь несколько раз, не вводя строку, нажимал ;Enter. Тогда приглашение будет ниже координаты начала вывода - надо очистить mov cx,3F88h ;кол-во двойных слов для очистки экрана mov di,1E0h ;адрес видеопамяти, с которого надо очистить экран xor ax,ax ;цвет черный rep stosd ;очистка mov di,1E0h ;адрес начала ячейки выдеопамяти, с которой начинается вывод строки (взят произвольно) mov _di,di ;сохранение для дальнейшего использования mov si,offset buf ;адрес начала буфера add si,2 ;реально введеная строка находится с 3-го байта xor cx,cx mov cl,byte ptr buf[1] ;длина строки - второй байт буфера mov kol,cx ;сохранение для дальнейшего использования mov ah,00001111b ;цвет - белые буквы на черном фоне l2: lodsb ;считывание байта в al stosw ;вывод слова из ax в видеопамять loop l2 ;кол-во циклов по длине введеной строки ;тем самым значащие байты расширяются до слова для вывода с ;нужными атрибутами ;------------------------ ;Блок формирования задержки. ;Действует так: берется текущее время один раз, фиксируется, ;после - второй раз, сравнивается; меньше - повторить второе ;взятие, иначе - все сначала. Так 8 раз. ;------------------------ l5: mov bh,08h ;кол-во раз срабатывания zxc: mov ah,00h ;взятие значения счетчика времени int 1Ah mov word ptr sch[1],cx ;сохранение mov word ptr sch[0],dx asd: mov ah,00h ;еще раз int 1Ah mov word ptr schk[1],cx ;сохранение (в другую переменную) mov word ptr schk[0],dx mov esi,schk ;три последующие команды - сравнение sub esi,sch cmp esi,01h ;отличаются? jl asd ;нет - повторить второе взятие dec bh ;да - уменьшить счетчик циклов test bh,bh jnz zxc ;и - все сначала, если не ноль. ;------------------------ ;Блок команд движения строки с проверкой нажатия клавиш ;------------------------ mov ah,06h ;этот уже проходили :) mov dl,0FFh int 21h ;нажата клавиша? jz move ;нет - двигаем строку дальше cmp al,4Ch ;это L? je ll ;да - переход на соответст. кусок кода cmp al,1Bh ;это Esc? je vse ;да - переход на завершение jmp move ;нет - двигаем строку дальше ;-------------------------- ll: mov cx,kol ;кол-во символов в строке ;если остался один символ, то при следующем нажатии L буфер будет ;пуст, выводить нечего, вывод будет не определен cmp cl,1 je vse ;поэтому выход mov bx,2 l7: ;цикл удаления первого символа mov al,byte ptr buf[bx+1] mov byte ptr buf[bx],al inc bx loop l7 sub kol,1 ;уменьшаем длину строки mov cx,kol move: mov di,_di ;занесение сохраненного адреса видеопамяти mov word ptr es:[di],0 ;удаление первого символа при движении mov si,offset buf ;далее уже было выше add si,2 add _di,2 ;переход к следующей ячейки видеопамяти mov di,_di mov cx,kol mov ah,00001111b l6: lodsb stosw ;вывод loop l6 jmp l5 ;бесконечный цикл vse: mov ax,03h ;очистка экрана int 10h ret ;выход prigl db 'Enter symbols:' crlf db 0Dh,0Ah,'$' press db 'press any key...','$' no db 'There is no any simbols',0Dh,0Ah,'$' _di dw ? sch dd 0 schk dd 0 kol dw ? buf: end start
|
|