Удомельский форум   ◊
www.udomlya.ru | Медиа-Центр | Удомля КТВ | Старый форум

Вернуться   Удомельский форум > Hard&Soft > Программирование
Справка Пользователи Календарь Сообщения за день
 
 
Опции темы Опции просмотра
Старый 23.06.2006, 13:44   #1
Malenya
Новичок
 
Аватар для Malenya
 
Регистрация: 26.04.2006
Сообщений: 10
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию Может кто подскажет

У меня возникла такая проблема, мне прислали незачет по трем программам, а в рецензии не написали почему. Можек кто свежим взглядом посмотрит и подскажет что не так в листинге программ.
1.comment #

assume cs:code
code segment public 'code'
org 100h

; ----------------------------------------------------------------------------
; Основная процедура
; ----------------------------------------------------------------------------
main proc near

; освобождаем память. надо то всего немного

mov bh,10h
mov ah,4ah
int 21h

; начало цикла и вывод сообщения о вводе имени
floop: mov ah,9
lea dx,fnter
int 21h

; ввод имени файла
mov ah,0ah
mov dx,offset bfile
int 21h

; если длина введеного имени 0, то выход
cmp cs:lfile,0
jz exit


push ds
push es
mov word ptr csld_ss,ss
mov word ptr csld_sp,sp
lea si,lfile
int 2eh
mov ss,csld_ss
mov sp,csld_sp
pop es
pop ds

mov ah,9
lea dx,fdone
int 21h

; заворачиваем на начало цикла
jmp floop

; выход
exit: mov ax,4c00h
int 21h

; переменные
bfile db 81
lfile db 0
nfile db 81 dup (0)
blocp db 14 dup (0)
old_ss dw ?
old_sp dw ?
fnter db 'Enter the name file (*.bat):', 0ah, 0dh, 24h
fdone db 'All done..', 0ah, 0dh, 24h

main endp
code ends
end main

2.
code segment public
assume cs:code

; обьявление процедур
public set_init, set_simbol, set_msg, set_cursor

; ----------------------------------------------------------------------------
; Процедура инициализации
; в bh установка цвета фона
; в bl установка цвета символов
; ----------------------------------------------------------------------------
set_init proc

push ax bx cx dx

jmp start_init
atribut db 0
position dw 0
start_init:

cmp bh,7
ja init_error
cmp bl,7
ja init_error

shl bh,4
add bl,bh
xor bl,00001000b
mov atribut,bl

mov al,3
int 10h
call set_cl
mov position,0

init_error:
pop dx cx bx ax
ret

set_init endp

; ----------------------------------------------------------------------------
; Процедура очистки экрана
; ----------------------------------------------------------------------------
set_cl proc

mov ax,0b800h
mov es,ax

mov cx,2000
mov bx,1
mov al,atribut
attr: mov es:[bx],al
inc bx
inc bx
loop attr
mov cx,2000
xor bx,bx
mov al,32
asc: mov es:[bx],al
inc bx
inc bx
loop asc

ret

set_cl endp

; ----------------------------------------------------------------------------
; Процедура вывода символа
; Входные данные al - символ
; ----------------------------------------------------------------------------
set_simbol proc

push ax bx cx dx

push 0b800h
pop es

cmp al,24h
je set_simbol_24

cmp al,0ah
je set_simbol_0a

cmp al,0dh
je set_simbol_0d

jmp set_simbol_next

set_simbol_0a:
add position,160
jmp set_simbol_ret

set_simbol_24:
stc
jmp set_simbol_ret

set_simbol_0d:
push ax bx dx
xor dx,dx
mov ax,position
mov bx,80
div bx
xor ah,ah
mul bx
mov position,ax
pop dx bx ax
jmp set_simbol_ret

set_simbol_next:
mov bx,position
mov es:[bx],al
inc position
inc position

set_simbol_ret:
pop dx cx bx ax
ret

set_simbol endp
; ----------------------------------------------------------------------------
; Процедура вывода строки
; Входные данные bx - смещение текста
; ----------------------------------------------------------------------------
set_msg proc

@msg: mov al,[bx]
call set_simbol
jc @mret
inc bx
jmp @msg
@mret: ret

set_msg endp
; ----------------------------------------------------------------------------
; Процедура установки курсора
; Входные данные ax - курсор
; ----------------------------------------------------------------------------
set_cursor proc
mov position,ax
ret
set_cursor endp

;set_cursor proc
; ; получаем доступ к регистру младшего байта
; mov dx,3b4h
; mov al,15
; out dx,al
; ; посылаем младший байт результата
; mov ax,position
; inc dx
; out dx,al
; ; получаем доступ к регистру старшего байта
; mov al,14
; dec dx
; out dx,al
; ; посылаем старший байт результата
; inc dx
; mov al,ah
; out dx,al
; ret
;set_cursor endp

code ends
end



code segment public
assume cs:code
org 100h
; процедуры из proc.asm
extrn set_init:near ; инициализация
extrn set_simbol:near ; вывод символа
extrn set_msg:near ; вывод сообщения
extrn set_cursor:near ; установка курсора
; ---------------------------------------------------------------------------- ; Основная процедура
; ---------------------------------------------------------------------------- main proc near
mov bh,0 ; цвет фона
mov bl,1 ; цвет символов
call set_init ; инициализация
; уберем курсор
mov dh,25
mov ah,2
int 10h
; покажем 'init device'
mov ax,1828 ; назначаем позицию курсора
call set_cursor ; устанавливаем свой курсор
lea bx,pre1 ; загружаем в bx смещение..
call set_msg ; выводим строку символов..
mov cx,7
@pre: push cx
lea bx,pre
mov ax,1674
call set_cursor
@mes: mov al,[bx]
cmp al,'^'
je @pos
call set_simbol
jc @mess
inc bx
jmp @mes
@pos: mov ax,1674
call set_cursor
mov sec,2
call set_wait
inc bx
jmp @mes
@mess: pop cx
loop @pre
mov bh,0 ; цвет фона
mov bl,1 ; цвет символов
call set_init ; инициализация
; покажем ' all done '
mov ax,1828
call set_cursor
lea bx,pre2
call set_msg
; задерка в 2 секунды
mov sec,36
call set_wait
; инициируем (по заданию)
mov bh,4
mov bl,5
call set_init
; покажем строку 'msg' (по заданию)
lea bx,msg
call set_msg
; покажем 'msg1'
mov ax,2620
call set_cursor
lea bx,msg1
call set_msg
; ждать нажатия любой клавиши, можно было бы сделать задерку.
mov ah,0
int 16h
; вернем курсор
mov bh,0
mov dh,0
mov dl,0
mov ah,2
int 10h
mov ax,4c00h ; возврат в дос с кодом
int 21h ; завершения програмы 0
set_wait proc
Malenya вне форума  
Старый 23.06.2006, 13:52   #2
Malenya
Новичок
 
Аватар для Malenya
 
Регистрация: 26.04.2006
Сообщений: 10
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

3.
;
; Proc.asm
; Author: Barnaeva Natasha
;

code segment public
assume cs:code

; обьявление процедур
public key, set_init, set_simbol, set_msg, set_cursor, set_wait

;================================================= =============================
; Инициализация клавиатуры
;================================================= =============================
key proc near

jmp kstart

exit_pressed db 0
cps_pressed db 0

old9 dd 0

buf_s dw 0
buf db 50 dup (?)
end_buf db 24h

att dw 0

TABm db ' 1234567890-= qwertyuiop[] asdfghjkl;''\ zxcvbnm,./ '
TABb db ' !@#$%^&*()_+ QWERTYUIOP{} ASDFGHJKL:" ZXCVBNM<>? '

klava db ' '
db ' г===============================================¬ '
db ' ¦ --¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬ ¦ '
db ' ¦ ¦e¦¦1¦¦2¦¦3¦¦4¦¦5¦¦6¦¦7¦¦8¦¦9¦¦0¦¦-¦¦=¦¦\¦¦-¦ ¦ '
db ' ¦ L--L--L--L--L--L--L--L--L--L--L--L--L--L--L-- ¦ '
db ' ¦ ----¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬---¬ ¦ '
db ' ¦ ¦ # ¦¦q¦¦w¦¦e¦¦r¦¦t¦¦y¦¦u¦¦i¦¦o¦¦p¦¦[¦¦]¦¦ ¦ ¦ '
db ' ¦ L----L--L--L--L--L--L--L--L--L--L--L--L--¦ ¦ ¦ '
db ' ¦ -----¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--- ¦ ¦ '
db ' ¦ ¦ # ¦¦a¦¦s¦¦d¦¦f¦¦g¦¦h¦¦j¦¦k¦¦l¦¦;¦¦"¦¦ < ¦ ¦ '
db ' ¦ L-----L--L--L--L--L--L--L--L--L--L--L--L----- ¦ '
db ' ¦ ------¬--¬--¬--¬--¬--¬--¬--¬--¬--¬--¬-------¬ ¦ '
db ' ¦ ¦ # ¦¦z¦¦x¦¦c¦¦v¦¦b¦¦n¦¦m¦¦,¦¦.¦¦/¦¦ # ¦ ¦ '
db ' ¦ L------L--L--L--L--L--L--L--L--L--L--L------- ¦ '
db ' ¦ ---¬---¬----------------------------¬---¬---¬ ¦ '
db ' ¦ ¦ #¦¦ #¦¦ # ¦¦# ¦¦# ¦ ¦ '
db ' ¦ L---L---L----------------------------L---L--- ¦ '
db ' L===============================================- '
db ' ',24h

exits db 'Выход по нажатию 24h, т.е. при включеном caps lock нажав 4', 0dh, 0ah, 24h

kstart:

; инициируем или закрываем?
cmp bp,1
jne uninstall

; установка своего int9
call Install_Int

; покажем ascii рисунок
mov csosition,0
lea bx,klava
call set_msg

mov csosition,3054
lea bx,exits
call set_msg

mov csosition,3360

; цикл ввода - пока не будет нажат caps locc а после 4
vvod: cmp exit_pressed,0
jne done
jmp vvod

; покажем программе где буфер символов и возвратимся
done: lea bx,buf
ret

uninstall:
; восстановление вектора
call uninstall_int
jmp done

key endp
Malenya вне форума  
Старый 23.06.2006, 13:53   #3
Malenya
Новичок
 
Аватар для Malenya
 
Регистрация: 26.04.2006
Сообщений: 10
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

;================================================= =============================
; Новый вектор прерывания int9
;================================================= =============================
proc int_09

push ax bx cx

jmp key_begin

klav: and al,01111111b
push ax bx
mov al,00011111b
push 0b800h
pop es
mov bx,cs:att
mov es:[bx],al
pop bx ax
jmp quit

key_begin:
cli
in al,60h
sti

and al,11111111b
out 61h,al

test al,10000000b
jnz klav

push bx ax

cmp al,13
ja @dva
xor ah,ah
mov bl,6
mul bl
mov bx,503
add bx,ax
call set_image
jmp @konec

; второй ряд
@dva: cmp al,16
jb @tri
cmp al,27
ja @tri
mov bl,6
mul bl
mov bx,903
add bx,ax
call set_image
jmp @konec

; третий ряд
@tri: cmp al,30
jb @chetire
cmp al,40
ja @chetire
mov bl,6
mul bl
mov bx,1301
add bx,ax
call set_image
jmp @konec

; четвертый ряд
@chetire: cmp al,44
jb @func
cmp al,53
ja @func
mov bl,6
mul bl
mov bx,1699
add bx,ax
call set_image
jmp @konec

; обрабатываем функ. клавиши

; \
@func: cmp al,43
jne @d1
mov bx,587
call set_image
jmp @konec

; backspace
@d1: cmp al,14
jne @d2
mov bx,593
call set_image
jmp @konec

; tab
@d2: cmp al,15
jne @d3
mov bx,991
call set_image
jmp @konec

; enter
@d3: cmp al,28
jne @d4
mov bx,1549
call set_image
jmp @konec

; caps lock
@d4: cmp al,58
jne @d5
mov bx,1471
call set_image
jmp @konec

; lshift
@d5: cmp al,42
jne @d6
mov bx,1951
call set_image
jmp @konec

; lcrtl
@d6: cmp al,29
jne @d7
mov bx,2431
call set_image
jmp @konec

; lalt
@d7: cmp al,56
jne @d8
mov bx,2439
call set_image
jmp @konec

; probel
@d8: cmp al,57
jne @d9
mov bx,2471
call set_image
jmp @konec

; rshift
@d9: cmp al,54
jne @d10
mov bx,2029
call set_image
jmp @konec

@d10:

@konec:
pop ax bx

; если это 24h
cmp cps_pressed,0
je noexit
cmp al,5h
jne noexit
mov bx,buf_s
mov buf[bx],24h
inc buf_s
mov exit_pressed,1
jmp quit

; если это caps lock
noexit: cmp al,3ah
jne nocps
not cps_pressed
jmp quit

; если это enter
nocps: cmp al,1ch
jne noent
mov bx,buf_s
mov buf[bx],0ah
inc bx
mov buf[bx],0dh
add buf_s,2
call set_position
jmp quit

; выбор регистра
noent: cmp cps_pressed,0
jne @1
mov bx,offset tabm
xlat tabm
jmp @2
@1: mov bx,offset tabb
xlat tabb

@2: mov bx,buf_s
mov buf[bx],al
inc buf_s
call set_simbol

quit: mov al,20h
out 20h,al

pop cx bx ax
iret

endp

;================================================= =============================
; Процедура установки 9 прерывания
;================================================= =============================
Install_Int proc

mov ax,3509
int 21h
mov word ptr old9,bx
mov word ptr old9+2,es

mov ax,2509h
mov dx,offset int_09
int 21h
ret

Install_Int endp

;================================================= =============================
; Процедура восстановления 9 прерывания
;================================================= =============================
uninstall_Int proc

push ds
cli
mov ax,2509h
mov si,offset old9
mov dx,word ptr [si]
mov ds,word ptr [si+2]
int 21h
sti
pop ds
ret

uninstall_Int endp
;================================================= =============================
; Процедура установки курсора
;================================================= =============================
set_position proc

add csosition,160
push ax bx dx
xor dx,dx
mov ax,csosition
mov bx,80
div bx
xor ah,ah
mul bx
mov csosition,ax
pop dx bx ax
ret

set_position endp

; ----------------------------------------------------------------------------
; Процедура инициализации
; в bh установка цвета фона
; в bl установка цвета символов
; ----------------------------------------------------------------------------
set_init proc
push ax bx cx dx
jmp start_init
atribut db 0
position dw 0
start_init:

shl bh,4
add bl,bh
xor bl,00001000b
mov atribut,bl

mov al,3
int 10h

call set_cl

mov position,0
init_error:
pop dx cx bx ax
ret
set_init endp

; ----------------------------------------------------------------------------
; Процедура очистки экрана
; ----------------------------------------------------------------------------
set_cl proc

mov ax,0b800h
mov es,ax
mov cx,2000
mov bx,1
mov al,atribut
attr: mov es:[bx],al
inc bx
inc bx
loop attr
mov cx,2000
xor bx,bx
mov al,32
asc: mov es:[bx],al
inc bx
inc bx
loop asc
ret

set_cl endp

; ----------------------------------------------------------------------------
; Процедура вывода символа
; Входные данные al - символ
; ----------------------------------------------------------------------------
set_simbol proc

push ax bx cx dx

push 0b800h
pop es

cmp al,24h
je set_simbol_24

cmp al,0ah
je set_simbol_0a

cmp al,0dh
je set_simbol_0d

jmp set_simbol_next

set_simbol_0a:
add position,160
jmp set_simbol_ret

set_simbol_24:
stc
jmp set_simbol_ret
set_simbol_0d:
push ax bx dx
xor dx,dx
mov ax,position
mov bx,80
div bx
xor ah,ah
mul bx
mov position,ax
pop dx bx ax
jmp set_simbol_ret

set_simbol_next:
mov bx,position
mov es:[bx],al
inc position
inc position

set_simbol_ret:
pop dx cx bx ax
ret

set_simbol endp

; ----------------------------------------------------------------------------
; Процедура вывода строки
; Входные данные bx - смещение текста
; ----------------------------------------------------------------------------
set_msg proc

@msg: mov al,[bx]
call set_simbol
jc @msg_ret
inc bx
jmp @msg
@msg_ret: ret

set_msg endp

; ----------------------------------------------------------------------------
; Процедура установки курсора
; Входные данные ax - курсор
; ----------------------------------------------------------------------------
set_cursor proc
mov position,ax
ret
set_cursor endp

; ----------------------------------------------------------------------------
; Процедура задержки программы
; Входные данные ax - сколько секунд
; ----------------------------------------------------------------------------
set_wait proc
push bx dx ax cx
mov ax,0
int 1ah
mov cx,ax
add dx,cx
mov bx,dx
@wait: int 1ah
cmp dx,bx
jne @wait
pop cx ax dx bx
ret
set_wait endp

set_image proc
mov al,00011100b
push 0b800h
pop es
mov es:[bx],al
mov cs:att,bx
ret
set_image endp

code ends
end
Malenya вне форума  
Старый 23.06.2006, 13:54   #4
Malenya
Новичок
 
Аватар для Malenya
 
Регистрация: 26.04.2006
Сообщений: 10
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

code segment public
assume cs:code
org 100h

; процедуры из proc.asm
extrn key:near
extrn set_init:near ; процедура инициализации
extrn set_simbol:near ; процедура вывода символа
extrn set_msg:near ; вывод сообщения
extrn set_cursor:near ; установка курсора
extrn set_wait:near ; установка курсора

; ----------------------------------------------------------------------------
; Основная процедура
; ----------------------------------------------------------------------------
main proc near

; инициируем видео драйвер
mov bh,1
mov bl,7
call set_init

; запустим драйвер клавиатуры, подав на вход bp=1
mov bp,1
call key

; key вернул смещение строки, вот её и покажем
call set_msg

; завершим работу драйвера клавиатуры, подав на вход bp=0
mov bp,0
call key

; возврат в дос с кодом завершения програмы 0
mov ax,4c00h
int 21h

main endp
code ends
end main
Malenya вне форума  
Старый 23.06.2006, 17:41   #5
Troll
Супер-Модератор
 
Аватар для Troll
 
Регистрация: 26.04.2006
Адрес: Удомля
Сообщений: 1,454
Вы сказали Спасибо: 70
Поблагодарили 536 раз(а) в 332 сообщениях
Отправить сообщение для Troll с помощью ICQ
По умолчанию

Если честно, то лень разбираться, но на первый взгляд программа через чур усложнена! Проще всего отправить письмо преподавателю и узнать причины отклонения.
Из практики: преподаватель отклонил мою работу с 2-мя совершенно незначительными поправка, я удивился, но переделал и отправил обратно, после чего преподаватель долго извинялся и говорил, что на самом деле он работу принял и у себя так и пометил, а то что отправил мне - ошибка. Т.е. преподаватели тоже люди и могут ошибаться! Надо точно узнать причину отклонения.
Troll вне форума  
Старый 23.06.2006, 18:41   #6
Troll
Супер-Модератор
 
Аватар для Troll
 
Регистрация: 26.04.2006
Адрес: Удомля
Сообщений: 1,454
Вы сказали Спасибо: 70
Поблагодарили 536 раз(а) в 332 сообщениях
Отправить сообщение для Troll с помощью ICQ
По умолчанию

Ещё одна из наиболее вероятных причин отклонения: насколько мне известно преподаватели требуют построчно прокомментированных исходников. Здесь же комментарии наблюдаются чрезвычайно редко.
Troll вне форума  
Старый 23.06.2006, 23:57   #7
Crash
Новичок
 
Регистрация: 27.04.2006
Сообщений: 28
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

Цитата:
Сообщение от Troll
Ещё одна из наиболее вероятных причин отклонения: насколько мне известно преподаватели требуют построчно прокомментированных исходников. Здесь же комментарии наблюдаются чрезвычайно редко.
Ага.
А еще мне кажется, что тем, кто все-таки возьмется за героический труд разобраться в чужом коде на ассемблере нехило бы помогло описание задания ...
Crash вне форума  
Старый 30.06.2006, 16:52   #8
George
Местный
 
Регистрация: 26.04.2006
Сообщений: 413
Вы сказали Спасибо: 113
Поблагодарили 153 раз(а) в 70 сообщениях
Отправить сообщение для George с помощью ICQ
По умолчанию

Цитата:
Сообщение от Malenya
mov csosition,ax
А меня вот это улыбнуло...
__________________
С наилучшими пожеланиями
George
George вне форума  
Старый 03.07.2006, 21:45   #9
Crash
Новичок
 
Регистрация: 27.04.2006
Сообщений: 28
Вы сказали Спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
По умолчанию

Цитата:
Сообщение от George
А меня вот это улыбнуло...
Даешь язык программирования, доступный простому пользователью!
Со смайлами и понтами!
Crash вне форума  
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
А может в Лондон? anya Основной 167 01.11.2007 18:53
Может кто в курсе... @&@ Автоклуб 7 04.09.2006 08:11


Текущее время: 14:17. Часовой пояс GMT +3.


Для улучшения работы сайта и его взаимодействия с пользователями мы используем файлы cookie. Продолжая работу с сайтом, Вы разрешаете использование cookie-файлов. Вы всегда можете отключить файлы cookie в настройках Вашего браузера.
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot