Исследование векторной таблицы связи MS-DOS, страница 2

T_LASTDRIV  db 0dh,0ah,'Lastdrive $'

data ends

stk segment  stack

db 256 dup(0)

stk ends

code segment  para public 'code'

outtitle macro Title  ;вывод на печать строки, оканчивающейся символом $

push ax

push dx

mov ah,9

lea dx,Title

int 21h

pop dx

pop ax

endm

outstring macro String,ilength

push ax

push cx

push dx

push bx    

mov ah,40h

mov bx,1

mov cx,ilength

mov dx,offset String

int 21h

pop bx

pop dx

pop cx

pop ax

endm

asciiz_input proc ; ввод строки ASCIIZ c клавиатуры

; входной параметр- адрес строки

push bp

mov bp,sp

push si

push bx

push dx

push ax

mov bx,[bp+4]

mov byte ptr [bx],0FEh

mov ah,0Ah

mov dx,bx

int 21h

inc bx

xor ax,ax

mov al,[bx]

inc bx

mov [bp+4],bx

add bx,ax

mov [bx],byte ptr 00h

pop ax

pop dx

pop bx

pop si

pop bp

ret

asciiz_input endp

asciiz_print proc   ; печать строки, оканчивающейся нулём или символом $

assume cs:code,ds:data,ss:stk,es:data

push bp

mov bp,sp

push ax

push cx

push dx

push di

xor cx,cx

mov di,[bp+4]

circ: cmp byte ptr [di],00h

je print

cmp byte ptr [di],'$'

je print

inc cx

inc di

jmp circ

print:

cmp cx,00h

je exit_p

mov ah,40h

mov bx,1

mov dx,[bp+4]

int 21h

exit_p: pop di

pop dx

pop cx

pop ax

pop bp

ret

asciiz_print endp

outnumber macro Title,Source,Buffer,ilength

local circle      ; печать числа Source, хранящегося в памяти, в 16-ричном виде

local continue1   ; длина исходного числа ilength байт

local continue2   ; Buffer - буферный массив длиной не менее ilength*2

push ax                 ; Title - заголовок

push cx

push dx

push bx

push si

push di    

mov ah,9

mov dx,offset Title

int 21h

mov cx,ilength

mov bx, offset Source

mov si,ilength

sub si,1

mov di, offset Buffer

circle :   

mov al,[bx][si]

mov dl,al

shr al,4

add al,30h

cmp al,39h

jle continue1

add al,7h

continue1: 

mov [di],al

inc di

mov al,dl

and al,0fh

add al,30h

cmp al,39h

jle continue2

add al,7h

continue2: 

mov [di],al

inc di

dec si

loop circle

mov byte ptr [di],26h

mov ah,40h

mov bx,1

mov cx,ilength*2

mov dx,offset Buffer

int 21h

pop di

pop si

pop bx

pop dx

pop cx

pop ax     

endm

hconvert proc     ; преобразование строки байт в символьный формат: 16-форму  с завершающим нулевым символом

; параметры в стеке:

; длина исходного массива, байт

; исполнительный адрес источника

; исполнительный адрес приёмника

push bp

mov bp,sp

push ax

push bx

push cx

push dx

push si

push di

mov cx,[bp+8]     ; длина исходного массива(в байтах)

mov bx,[bp+6]     ;исполнительный адрес источника

mov di,[bp+4]     ;приёмник(назначение)

xor si,si

lp :

mov al,[bx][si]

mov dl,al

shr al,4

add al,30h

cmp al,39h

jle continue1

add al,7h

continue1: 

mov [di],al

inc di

mov al,dl

and al,0fh

add al,30h

cmp al,39h

jle continue2

add al,7h

continue2: 

mov [di],al

inc di

inc si

loop lp

mov byte ptr [di],00h

pop di

pop si

pop dx

pop cx

pop bx

pop ax

pop bp

ret

hconvert endp

main proc

assume cs:code,ds:data,ss:stk,es:data

mov ax,data

mov ds,ax

circle:

outtitle M_CVT

outtitle M_MCB

outtitle M_QUIT

mov ah,00h

int 16h

cmp ah,01h

jne  L1    

jmp exit

L1:   cmp ah,02h  ; CVT

je  cvt

jmp L2

cvt:

mov ah,52h

int 21h

mov ax,es

mov TMP_WORD,ax

outnumber T_CVT_ADDRESS,TMP_WORD,BUFFER,2

mov ax,bx

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx-2]

mov MCB_SEG,ax

outnumber T_MCB_SEG,MCB_SEG,BUFFER,2

mov ax,ES:[bx+2]

mov TMP_WORD,ax

outnumber T_DEV_CB,TMP_WORD,BUFFER,2

mov ax,ES:[bx]

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx+6]

mov TMP_WORD,ax

outnumber T_FILE_TAB,TMP_WORD,BUFFER,2

mov ax,ES:[bx+4]

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx+10]

mov TMP_WORD,ax

outnumber T_CLOCK_DR,TMP_WORD,BUFFER,2

mov ax,ES:[bx+8]

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx+14]

mov TMP_WORD,ax

outnumber T_CON_DR,TMP_WORD,BUFFER,2

mov ax,ES:[bx+12]

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx+16]

mov TMP_WORD,ax

outnumber T_MAX_BTBL,TMP_WORD,BUFFER,2

mov ax,ES:[bx+20]

mov TMP_WORD,ax

outnumber T_DISK_BUF,TMP_WORD,BUFFER,2

mov ax,ES:[bx+18]

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx+24]

mov TMP_WORD,ax

outnumber T_DRV_INFO,TMP_WORD,BUFFER,2

mov ax,ES:[bx+22]

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx+28]

mov TMP_WORD,ax

outnumber T_FCB_TABL,TMP_WORD,BUFFER,2

mov ax,ES:[bx+26]

mov TMP_WORD,ax

outnumber SEP,TMP_WORD,BUFFER,2

mov ax,ES:[bx+30]

mov TMP_WORD,ax

outnumber T_FCB_SIZE,TMP_WORD,BUFFER,2

mov al,ES:[bx+32]

mov TMP_BYTE,al

outnumber T_NUM_BDEV,TMP_BYTE,BUFFER,1

mov al,ES:[bx+33]

mov TMP_BYTE,al

outnumber T_LASTDRIV,TMP_BYTE,BUFFER,1

jmp circle

L2: cmp ah,03h    ;

je MCB

jmp circle

MCB: mov es,MCB_SEG

MCB_circle:

xor  bx,bx

mov al,ES:[bx]

mov TMP_BYTE,al

outtitle NL

outstring TMP_BYTE,1

outtitle SPC   ; владелец

mov ax,ES:[bx+1]

mov TMP_WORD,ax

outnumber SPC,TMP_WORD,BUFFER,2

mov bx,8

lea si,FILENAME

mov cx,8

copy:

mov al,es:[bx]

mov [si],al

inc bx

inc si

loop copy

xor bx,bx

outtitle SPC   ; длина блока в параграфах

mov ax,ES:[bx+3]

mov TMP_WORD,ax

outnumber SPC,TMP_WORD,BUFFER,2

outtitle SPC

outstring FILENAME,8

mov bx,es

add ax,bx

inc ax

mov es,ax

mov al,TMP_BYTE

cmp al,'Z'

je break

jmp MCB_circle

break: jmp circle

exit:

mov ax,4c00h

int 21h

main endp

code ends

end main