Удомельский форум

Удомельский форум (http://second.udomlya.ru/uf/index.php)
-   Программирование (http://second.udomlya.ru/uf/forumdisplay.php?f=26)
-   -   Может кто подскажет (http://second.udomlya.ru/uf/showthread.php?t=1303)

Malenya 23.06.2006 13:44

Может кто подскажет
 
У меня возникла такая проблема, мне прислали незачет по трем программам, а в рецензии не написали почему. Можек кто свежим взглядом посмотрит и подскажет что не так в листинге программ.
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 cs:old_ss,ss
mov word ptr cs:old_sp,sp
lea si,lfile
int 2eh
mov ss,cs:old_ss
mov sp,cs:old_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

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 cs:position,0
lea bx,klava
call set_msg

mov cs:position,3054
lea bx,exits
call set_msg

mov cs:position,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

;================================================= =============================
; Новый вектор прерывания 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 cs:position,160
push ax bx dx
xor dx,dx
mov ax,cs:position
mov bx,80
div bx
xor ah,ah
mul bx
mov cs:position,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

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

Troll 23.06.2006 17:41

Если честно, то лень разбираться, но на первый взгляд программа через чур усложнена! Проще всего отправить письмо преподавателю и узнать причины отклонения.
Из практики: преподаватель отклонил мою работу с 2-мя совершенно незначительными поправка, я удивился, но переделал и отправил обратно, после чего преподаватель долго извинялся и говорил, что на самом деле он работу принял и у себя так и пометил, а то что отправил мне - ошибка. Т.е. преподаватели тоже люди и могут ошибаться! Надо точно узнать причину отклонения.

Troll 23.06.2006 18:41

Ещё одна из наиболее вероятных причин отклонения: насколько мне известно преподаватели требуют построчно прокомментированных исходников. Здесь же комментарии наблюдаются чрезвычайно редко.

Crash 23.06.2006 23:57

Цитата:

Сообщение от Troll
Ещё одна из наиболее вероятных причин отклонения: насколько мне известно преподаватели требуют построчно прокомментированных исходников. Здесь же комментарии наблюдаются чрезвычайно редко.

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

George 30.06.2006 16:52

Цитата:

Сообщение от Malenya
mov cs:position,ax

А меня вот это улыбнуло...

Crash 03.07.2006 21:45

Цитата:

Сообщение от George
А меня вот это улыбнуло...

Даешь язык программирования, доступный простому пользователью!
Со смайлами и понтами!:thumbsup:


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

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot