Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pmode 
:(
    Опции темы
oleg1973
Дата 13.2.2004, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



запутался я господа с установкой ексцепшенов smile.gif
делаю
cli
xor eax,eax
mov ax,cs
shl eax,4
mov ebx,eax
add ebx,idt
add eax,gdt
mov [cs:gz],eax
mov [cs:iz],eax
lgdt [cs:metgdt]
lidt [cs:idtadr]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 8:code32

exhandler:
cli
hlt

metgdt:
dw gdt_end - gdt-1
gz:
dd 0
gdt:
gdt_null:
dd 0,0
gdt_code:
dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data:
dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:



idtadr:
dw idt_end-idt-1
iz:
dd 0
idt:
idt_null:
dd 0,0
// int 0 при делении на 0 вырабатывается

dw exphandler
dw 0х10
db 0
db 8Eh
dw 0
idt_end:



use32
code32:
mov ax,10h
mov ds,ax
mov ss,ax
mov es,ax
mov gs,ax
mov fs,ax
mov esp,090000h
xor edx,edx
div edx
по идеи после этого вырабатвается int 0 и управление должно перети на exhandler:
на практике нифига
кто знает в чем проблема?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 13.2.2004, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Ты бы хоть отладку какую подрубил... Попадаешь ли в use32 и т.п. Объяви дескриптор на video. Сто пудов у тебя сразу эксепшен какой-то возникает.

На всякий случай кидаю свой исходник - переделанный из книги Финогенова - работа с DRx:

Цитата

.386p
Port equ 170h ; Port to trap
;
; Common structures
;
descr struc
  lim    dw  0
  base_l dw  0
  base_m db  0
  attr_1 db  0
  attr_2 db  0
  base_h db  0
descr ends
trap  struc
  offs1  dw  0
  sel    dw  16
  rsrv  db  0
  attr_  db  8fh
  offs_h dw  0
trap  ends
intr struc
  ioffs_l  dw  0
  isel    dw  16
  irsrv    db  0
  iattr    db  8eh
  ioffs_h  dw  0
intr ends
data segment use16
gdt_0 label word
; GDT table
gdt_null  descr <0,0,0,0,0,0>
gdt_data  descr <data_size-1,0,0,92h,0,0>
gdt_code  descr <code_size-1,0,0,98h,0,0>
gdt_stack  descr <255,0,0,92h,0,0>
gdt_screen descr <4095,8000h,0bh,92h,0,0>
gdt_himem  descr <1023,0,10h,92h,80h>
gdt_tss_0  descr <103,0,0,89h>
gdt_tss_1  descr <103,0,0,89h>
gdt_size= $-gdt_null
idt    label  word
trap  <exc_0>
trap  <exc_1>
trap  <exc_2>
trap  <exc_3>
trap  <exc_4>
trap  <exc_5>
trap  <exc_6>
trap  <exc_7>
trap  <exc_8>
trap  <exc_9>
trap  <exc_10>
trap  <exc_11>
trap  <exc_12>
trap  <exc_13>
trap  <exc_14>
trap  <exc_15>
trap  16 dup(<exc_test>)
intr  <new_08>
intr  <new_09>
idt_size=$-idt
pdescr  dq  0
real_sp  dw  0
real_ss  dw  0
count    db  0
sec      dw  0
place    dw  0
sym      db  24
testt    db  0
kode    db  ?
attr    db  1eh
tabl    db  '0123456789'
TabHex  db '0123456789ABCDEF'
n1      dw  ?
mes      db  'We are in DOS',13,10
leng    equ $-mes
tss_0    db  104 dup(0)
tss_1    db  104 dup(0)
task1_offs dw  0
task1_sel  dw  56
Trap1Msg db 'I/O trap raising ! DX=confused.gif?',0
DebugDX  dw ?
data_size equ $-gdt_null
data ends
text segment 'code' use16
assume cs:text,ds:data
begin label word
exc_0 proc
  mov  bp,sp
  add  dword ptr [bp],2
  mov  ax,666h
  mov  es:[300],ax
  mov  bx,1
  db    66h
  iret
exc_0 endp
exc_1 proc
  pushad
  mov  DebugDX,dx
  mov  ax,DebugDX
  mov  di,offset Trap1Msg+22
  call HexWord_String
  push 10*160
  push offset Trap1Msg
  call Out_String
  popad
  db  66h
  iret
exc_1 endp
exc_2 proc
  mov ax,2
  mov gs:[0],ax
  mov place,800
  call dword ptr task1_offs
  db 66h
  iret
exc_2 endp
exc_3 proc
mov ax,3
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_3 endp
exc_4 proc
mov ax,4
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_4 endp
exc_5 proc
mov ax,5
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_5 endp
exc_6 proc
mov ax,6
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_6 endp
exc_7 proc
mov ax,7
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_7 endp
exc_8 proc
mov ax,8
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_8 endp
exc_9 proc
mov ax,9
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_9 endp
exc_10 proc
mov ax,10
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_10 endp
exc_11 proc
mov ax,11
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_11 endp
exc_12 proc
mov ax,12
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_12 endp
exc_13 proc
mov ax,13
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_13 endp
exc_14 proc
mov ax,14
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_14 endp
exc_15 proc
mov ax,15
mov gs:[0],ax
mov place,800
call dword ptr task1_offs
db 66h
iret
exc_15 endp
exc_test proc
mov ax,666
mov gs:[0],ax
mov place,800
db 66h
iret
exc_test endp
new_08 proc
  inc count
  cmp count,18
  jbe NO_time
  cli
  mov count,0
  inc sec
  mov ax,sec
  mov gs:[0],ax
  mov place,840
  call dword ptr task1_offs
  sti
NO_time:
  mov al,20h
  out 20h,al
  db 66h
  iret
new_08 endp
new_09 proc
  cli
  in  al,60h
  mov kode,al
  xor ah,ah
  mov gs:[0],ax
  mov place,860
  call dword ptr task1_offs
  sti
  in  al,61h
  or  al,80h
  out 61h,al
  and al,7fh
  out 61h,al
  mov al,20h
  out 20h,al
  db  66h
  iret
new_09 endp
main proc
    mov  ax,0003h
    int  10h
    xor  eax,eax
    mov  ax,data
    mov  ds,ax
; calculate liner address of data segment
    shl  eax,4
    mov  ebp,eax
    mov  bx,offset gdt_data
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
; and command segment
    xor  eax,eax
    mov  ax,cs
    shl  eax,4
    mov  bx,offset gdt_code
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
; and stack segment
    xor  eax,eax
    mov  ax,ss
    mov  real_ss,ax
    shl  eax,4
    mov  bx,offset gdt_stack
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
;  tss_0
    mov  eax,ebp
    add  ax,offset tss_0
    mov  bx,offset gdt_tss_0
    mov  [bx].base_l,ax 
    rol  eax,16
    mov  [bx].base_m,al
;  tss_1
    mov  eax,ebp
    add  ax,offset tss_1
    mov  bx,offset gdt_tss_1
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al     
; prepare psevdodescriptor
    mov  dword ptr pdescr+2,ebp
    mov  word ptr pdescr,gdt_size-1
    lgdt pdescr
    push ebp
; 
    cli
    mov  word ptr tss_1+4ch,16
    mov  word ptr tss_1+20h,offset himem
    mov  word ptr tss_1+50h,24
    mov  word ptr tss_1+38h,128
    mov  word ptr tss_1+54h,8
    mov  word ptr tss_1+48h,32   
;fuck off all interrupts   
    ;cli
    mov  al,8fh
    out  70h,al  ;NMI off
    jmp  $+2    ;stop little bit
    mov  al,05h
    out  71h,al
    mov  ax,40h
    mov  es,ax
    mov  word ptr es:[67h],offset return
    mov  word ptr es:[69h],cs
;change controller regim
    mov dx,20h
    mov al,11h
    out dx,al
    jmp $+2
    inc dx
    mov al,20h
    out dx,al
    jmp $+2
    mov al,4
    out dx,al
    jmp $+2
    mov al,1
    out dx,al
    mov al,0fch
    out dx,al
    mov dx,0a1h
    mov al,0ffh
    out dx,al   
;load idtr table
    pop  ebp
    mov  word ptr pdescr,idt_size-1
    xor  eax,eax
    mov  ax,offset idt
    add  eax,ebp
    mov  dword ptr pdescr+2,eax
    lidt pdescr   
    mov  al,0d1h
    out  64h,al
    mov  al,0deh
    out  60h,al
; set the processor regim
    mov  eax,cr0  ;get mashine word
    or  eax,1    ;set PE bit
    mov  cr0,eax  ;load mashine word
; load cs:ip
    db      0eah    ;jmp far
    dw      offset continue
    dw      16      ;command selector
continue:
    mov  ax,8
    mov  ds,ax
    mov  ax,24
    mov  ss,ax
    mov  ax,32
    mov  es,ax
    mov  ax,40 ;massive selector
    mov  gs,ax
; Interrupts
    mov  al,0dh
    out  70h,al
    sti
; Set trap to ports i/o
    mov  eax,cr4
    or  eax,01000b
    mov  cr4,eax
    ;        FEDCBA9876543210
    mov  eax,(0110011001100110b shl 16)+(07FFh) ; 0010001000100010b shl 16 ; 020703h ; 010000001100000010b
    mov  dr7,eax
; Ports set
    xor  ebx,ebx
    mov  bx,Port
    mov  dr0,ebx

    add  ebx,2
    mov  dr1,ebx
    add  ebx,2
    mov  dr2,ebx
    add  ebx,2
    mov  dr3,ebx
;
    mov  ax,48
    ltr  ax
;
; Waiting for filler
;
@@MainLoop:
    cmp  kode,130
    jb  @@NoNumKey
    cmp  kode,139
    ja  @@NoNumKey
; Try to make exception
    mov  dx,Port
    xor  ax,ax
    mov  al,kode
    sub  al,130
    add  dx,ax
    in  al,dx
@@NoNumKey:
    cmp  kode,57
    jnz  @@MainLoop
;
    mov  al,0d1h
    out  64h,al
    mov  al,0ddh
    out  60h,al
;
    mov  al,0feh
    out  64h,al
    hlt                   
; turn back DOS media
return: mov ax,data
    mov  ds,ax     
    mov  ax,stk
    mov  ss,ax
    mov  sp,256
    mov  ss,real_ss
;interrupt on
    mov al,184
    out 21h,al
    mov al,13
    out 0a1h,al
    sti
    mov  al,0
    out  70h,al  ;NMI on
    cmp  n1,666
    jne  No
    mov  cx,15
@2: push cx
    mov  ah,40h
    mov  bx,01
    mov  cx,leng
    mov  dx,offset mes
    int  21h
    pop  cx
    loop @2 
NO: mov  ax,4c00h
    int  21h   
main endp
himem proc
  pusha
  mov  ax,32
  mov  es,ax
  mov  ax,40
  mov  gs,ax
  xor  ebx,ebx
  mov  cx,gs:[ebx]
  mov  di,10000
  mov  bx,place
  mov  testt,0
@1:
  mov  ax,cx
  xor  dx,dx
  div  di
  mov  si,ax
  mov  dl,testt
  and  dx,1
  cmp  dx,1
  je  Good
  cmp  ax,0
  je  Ziro
Good:
  mov testt,1
  mov  al,tabl[si]
  mov  ah,13h
  mov  es:[bx],ax
Ziro:
  add  bx,2
  mov  ax,di
  mul  si
  sub  cx,ax
  mov  ax,di
  xor  dx,dx
  mov  si,10
  div  si
  mov  di,ax
  cmp  di,1
  jae  @1
  popa
  iret
  jmp  himem
himem endp
Out_String proc near
  push bp
  cli
  mov  bp,sp
  pushad
  push es
  mov  ax,32
  mov  es,ax
  mov  si,[bp+4]
  mov  di,[bp+6]
  mov  ah,14
  cld
@@OutString:
  lodsb
  test al,al
  jz  @@OutStringDone
  stosw
  jmp  @@OutString
@@OutStringDone:
  pop  es
  popad
  pop  bp
  sti
  retn 4
Out_String endp
HexWord_String proc near
  pusha
  push  es
  push  ds
  pop  es
  cld
  mov  bx,offset TabHex
  mov  cx,4
@@HexWordStr:
  rol  ax,4
  push  ax
  and  al,0Fh
  xlat
  stosb
  pop  ax
  loop  @@HexWordStr
  pop  es
  popa
  retn
HexWord_String endp
Hex_String proc near
  pusha
  push  es
  test  cx,cx
  jz    @@ExitHexStr
  cld
  mov  bx,offset TabHex
  push  ds
  pop  es
@@HexStr:
  lodsb
  mov  ah,al
  shr  al,4
  xlat
  stosb
  mov  al,ah
  and  al,0Fh
  xlat
  stosb
  loop  @@HexStr
@@ExitHexStr:
  pop  es
  popa
  retn
Hex_String endp
code_size= $-begin
    text ends
stk segment  stack 'stack'
    db 256 dup('~')
stk ends
end main


Это сообщение отредактировал(а) Chingachguk - 13.2.2004, 21:05


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
oleg1973
Дата 13.2.2004, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



в use 32 попадаю 100 процентно smile.gif
при записи в видео ехцепшинов нету smile.gif
mov [0b8000h],byte "A" работает спокойно
тоесть все работает до div edx
не переходит на мой хандл


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 13.2.2004, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Напиши, не поленись, обработку всех эксепшенов. С одним тока выводом - номером исключения. Я так загрузчик какой-то оси самопальной долго пытался исправить (админа codenet), пока не написал - не смог понять.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
oleg1973
Дата 13.2.2004, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



ты мне скажи idt правильное у меня?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 13.2.2004, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Ну арибуты у нас точно разные ;) (8E->8F) Я счас пиво пью, много сказать не могу smile.gif


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
oleg1973
Дата 13.2.2004, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



в оригинале у меня так вот

ACC_PRESENT EQU 10000000b ; сегмент есть в памяти
ACC_CSEG EQU 00011000b ; сегмент кода
ACC_DSEG EQU 00010000b ; сегмент данных
ACC_EXPDOWN EQU 00000100b ; сегмент расширяется вниз
ACC_CONFORM EQU 00000100b ; согласованный сегмент
ACC_DATAWR EQU 00000010b ; разрешена запись
ACC_INT_GATE EQU 00000110b ; вентиль прерывания
ACC_TRAP_GATE EQU 00000111b ; вентиль исключения

idtadr:
dw idt_end-idt-1
iz:
dd 0
idt:
dd 0,0

dw exphandler
dw 0х10
db 0
db ACC_PRESENT OR ACC_TRAP_GATE
dw 0
idt_end:



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 13.2.2004, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Хорошо, а стек как ? У тебя на все про все один дескриптор 0x10. А стек при исключении нужен. - ? Попробуй push. Перед div.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
oleg1973
Дата 13.2.2004, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



ну да один сегмент с 0 до 4гб
стек на mov esp,090000h
стек тут не причем я думаю


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 13.2.2004, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Стек же вниз растет. А у тебя где esp ?


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Chingachguk
Дата 14.2.2004, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Вот. Сделал код, переходящий в pmode (но как - то криво выходящий), ловит исключения (все), выводит номер исключения, при нажатии на клавишу показывает ее код, показывает время (таймер). При нажатии на "1" делает div 0 и показывает опкод команды, вызвавшей исключение.

Цитата

.386p
;
; Common structures
;
descr struc
  lim    dw  0
  base_l dw  0
  base_m db  0
  attr_1 db  0
  attr_2 db  0
  base_h db  0
descr ends
trap  struc
  offs1  dw  0
  sel    dw  16
  rsrv  db  0
  attr_  db  8fh
  offs_h dw  0
trap  ends
intr struc
  ioffs_l  dw  0
  isel    dw  16
  irsrv    db  0
  iattr    db  8eh
  ioffs_h  dw  0
intr ends
data segment use16
gdt_0 label word
; GDT table
code_alias_sel equ 64
gdt_null  descr <0,0,0,0,0,0> ; 0
gdt_data  descr <data_size-1,0,0,92h,0,0> ; 8
gdt_code  descr <code_size-1,0,0,98h,0,0> ; 16
gdt_stack  descr <255,0,0,92h,0,0>        ; 24
gdt_screen descr <4095,8000h,0bh,92h,0,0>  ; 32
gdt_himem  descr <1023,0,10h,92h,80h>      ; 40
gdt_tss_0  descr <103,0,0,89h>            ; 48
gdt_tss_1  descr <103,0,0,89h>            ; 56
gdt_code_alias descr <code_size-1,0,0,92h,0,0> ; 64
gdt_size= $-gdt_null
idt    label  word
trap  <exc_0>
trap  <exc_1>
trap  <exc_2>
trap  <exc_3>
trap  <exc_4>
trap  <exc_5>
trap  <exc_6>
trap  <exc_7>
trap  <exc_8>
trap  <exc_9>
trap  <exc_10>
trap  <exc_11>
trap  <exc_12>
trap  <exc_13>
trap  <exc_14>
trap  <exc_15>
trap  16 dup(<exc_test>)
intr  <new_08>
intr  <new_09>
idt_size=$-idt
pdescr  dq  0
save_sp  dw  0
save_ss  dw  0
save_ds  dw  0
save_es  dw  0
count    db  0
sec      dw  0
place    dw  0
sym      db  24
testt    db  0
kode    db  ?
attr    db  1eh
tabl    db  '0123456789'
TabHex  db '0123456789ABCDEF'
ExitMsg  db  'We are in DOS',13,10
ExitMsgLen equ $-ExitMsg
tss_0    db  104 dup(0)
tss_1    db  104 dup(0)
task1_offs dw  0
task1_sel  dw  56
TrapMsg    db 'trap (xxxx) raising !',0
TrapMsg0  db 'CS:IP-> xxxx bytes. Skip 2 bytes...',0
Trap1Msg  db '#1 trap raising !',0
KeyPressed db 'Key: xxxx',0
TimeMsg    db 'Time: xxxx',0
data_size equ $-gdt_null
data ends
text segment 'code' use16
assume cs:text,ds:data
begin label word
OutTrapMsg proc
  pushad
  ; ax= num trap
  mov  di,offset TrapMsg+6
  call HexWord_String
  push 10*160
  push offset TrapMsg
  call Out_String
  popad
  ret
OutTrapMsg endp
exc_0 proc
  push ebp
  mov  ebp,esp
  pushad
  push gs
  mov  ax,0
  call OutTrapMsg
  mov  ax,code_alias_sel
  mov  gs,ax
  mov  eax,[ebp+4]
  mov  ax,gs:[eax]
  ; ax= CS:EIP->
  mov  di,offset TrapMsg0+8
  call HexWord_String
  push 6*160
  push offset TrapMsg0
  call Out_String
@@Skip:
  add  dword ptr [ebp+4],2 ; change eip
  pop  gs
  popad
  pop  ebp
  db  66h
  iret
exc_0 endp
exc_1 proc
  mov  ax,1
  call OutTrapMsg
  db  66h
  iret
exc_1 endp
exc_2 proc
  mov ax,2
  call OutTrapMsg
  db 66h
  iret
exc_2 endp
exc_3 proc
  mov ax,3
  call OutTrapMsg
  db 66h
  iret
exc_3 endp
exc_4 proc
  mov  ax,4
  call OutTrapMsg
  db 66h
  iret
exc_4 endp
exc_5 proc
  mov ax,5
  call OutTrapMsg
  db 66h
  iret
exc_5 endp
exc_6 proc
  mov ax,6
  call OutTrapMsg
  db 66h
  iret
exc_6 endp
exc_7 proc
  mov ax,7
  call OutTrapMsg
  db 66h
  iret
exc_7 endp
exc_8 proc
  mov ax,8
  call OutTrapMsg
  db 66h
  iret
exc_8 endp
exc_9 proc
  mov ax,9
  call OutTrapMsg
  db 66h
  iret
exc_9 endp
exc_10 proc
  mov ax,10
  call OutTrapMsg
  db 66h
  iret
exc_10 endp
exc_11 proc
  mov ax,11
  call OutTrapMsg
  db 66h
  iret
exc_11 endp
exc_12 proc
  mov ax,12
  call OutTrapMsg
  db 66h
  iret
exc_12 endp
exc_13 proc
  mov ax,13
  call OutTrapMsg
  db 66h
  iret
exc_13 endp
exc_14 proc
  mov ax,14
  call OutTrapMsg
  db 66h
  iret
exc_14 endp
exc_15 proc
  mov ax,15
  call OutTrapMsg
  db 66h
  iret
exc_15 endp
exc_test proc
  mov ax,666
  mov gs:[0],ax
  mov place,800
  db 66h
  iret
exc_test endp
new_08 proc
  inc count
  cmp count,18
  jbe NO_time
  cli
  mov count,0
  inc sec
  mov ax,sec
  ; ax= time
  mov  di,offset TimeMsg+6
  call HexWord_String
  push 12*160
  push offset TimeMsg
  call Out_String
  sti
NO_time:
  mov al,20h
  out 20h,al
  db 66h
  iret
new_08 endp
new_09 proc
  cli
  in  al,60h
  mov kode,al
  xor ah,ah
  ; ax= key
  mov  di,offset KeyPressed+5
  call HexWord_String
  push 14*160
  push offset KeyPressed
  call Out_String
  sti
  in  al,61h
  or  al,80h
  out 61h,al
  and al,7fh
  out 61h,al
  mov al,20h
  out 20h,al
  db  66h
  iret
new_09 endp
main proc
    mov  ax,0003h
    int  10h
    xor  eax,eax
    mov  ax,data
    mov  ds,ax
; save critical registers
    mov  save_ds,ds
    mov  save_es,es
    mov  save_ss,ss
    mov  save_sp,sp

; calculate liner address of data segment
    shl  eax,4
    mov  ebp,eax
    mov  bx,offset gdt_data
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
; and command segment
    xor  eax,eax
    mov  ax,cs
    shl  eax,4
    mov  bx,offset gdt_code
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
; and alias for command segment
    xor  eax,eax
    mov  ax,cs
    shl  eax,4
    mov  bx,offset gdt_code_alias
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
; and stack segment
    xor  eax,eax
    mov  ax,ss
    shl  eax,4
    mov  bx,offset gdt_stack
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
;  tss_0
    mov  eax,ebp
    add  ax,offset tss_0
    mov  bx,offset gdt_tss_0
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
;  tss_1
    mov  eax,ebp
    add  ax,offset tss_1
    mov  bx,offset gdt_tss_1
    mov  [bx].base_l,ax
    rol  eax,16
    mov  [bx].base_m,al
; prepare psevdodescriptor
    mov  dword ptr pdescr+2,ebp
    mov  word ptr pdescr,gdt_size-1
    lgdt pdescr
    push ebp
;
    cli
    mov  word ptr tss_1+4ch,16
    mov  word ptr tss_1+20h,offset himem
    mov  word ptr tss_1+50h,24
    mov  word ptr tss_1+38h,128
    mov  word ptr tss_1+54h,8
    mov  word ptr tss_1+48h,32
;fuck off all interrupts
    cli
    mov  al,8fh
    out  70h,al  ;NMI off
    jmp  $+2    ;stop little bit
    mov  al,05h
    out  71h,al
    mov  ax,40h
    mov  es,ax
    mov  word ptr es:[67h],offset return
    mov  word ptr es:[69h],cs
;change controller regim
    mov dx,20h
    mov al,11h
    out dx,al
    jmp $+2
    inc dx
    mov al,20h
    out dx,al
    jmp $+2
    mov al,4
    out dx,al
    jmp $+2
    mov al,1
    out dx,al
    mov al,0fch
    out dx,al
    mov dx,0a1h
    mov al,0ffh
    out dx,al   
;load idtr table
    pop  ebp
    mov  word ptr pdescr,idt_size-1
    xor  eax,eax
    mov  ax,offset idt
    add  eax,ebp
    mov  dword ptr pdescr+2,eax
    lidt pdescr   
    mov  al,0d1h
    out  64h,al
    mov  al,0deh
    out  60h,al
; set the processor regim
    mov  eax,cr0  ;get mashine word
    or  eax,1    ;set PE bit
    mov  cr0,eax  ;load mashine word
; load cs:ip
    db      0eah    ;jmp far
    dw      offset continue
    dw      16      ;command selector
continue:
    mov  ax,8
    mov  ds,ax
    mov  ax,24
    mov  ss,ax
    mov  ax,32
    mov  es,ax
    mov  ax,40 ;massive selector
    mov  gs,ax
; Interrupts
    mov  al,0dh
    out  70h,al
    sti
;
    mov  ax,48
    ltr  ax
;
; Waiting for filler
;
@@MainLoop:
    cmp  kode,130
    jb  @@NoNumKey
    cmp  kode,139
    ja  @@NoNumKey
; Try to make exception #key
    mov  al,kode
    sub  al,130
    cmp  al,0
    jnz  @@NoExept0
    xor  bx,bx
    div  bx
    jmp  @@ExeptsDone
@@NoExept0:

@@ExeptsDone:

@@NoNumKey:
    cmp  kode,57
    jnz  @@MainLoop
; line A20 close
    mov  al,0d1h
    out  64h,al
    mov  al,0ddh
    out  60h,al
;
    mov  al,0feh
    out  64h,al
    hlt
; turn back DOS media
return:
    mov  ax,data
    mov  ds,ax
    mov  ax,stk
    mov  ss,ax
    mov  sp,save_sp
    mov  es,save_es
;interrupt on
    mov  al,0B8h
    out  21h,al
    mov  al,9Dh
    out  0a1h,al
    mov  al,0
    out  70h,al  ;NMI on
    sti
; dos message
    mov  ah,40h
    mov  bx,01
    mov  cx,ExitMsgLen
    mov  dx,offset ExitMsg
    int  21h
Exit:
    mov  ax,4c00h
    int  21h   
main endp
himem proc
  pusha
  mov  ax,32
  mov  es,ax
  mov  ax,40
  mov  gs,ax
  xor  ebx,ebx
  mov  cx,gs:[ebx]
  mov  di,10000
  mov  bx,place
  mov  testt,0
@1:
  mov  ax,cx
  xor  dx,dx
  div  di
  mov  si,ax
  mov  dl,testt
  and  dx,1
  cmp  dx,1
  je  Good
  cmp  ax,0
  je  Ziro
Good:
  mov testt,1
  mov  al,tabl[si]
  mov  ah,13h
  mov  es:[bx],ax
Ziro:
  add  bx,2
  mov  ax,di
  mul  si
  sub  cx,ax
  mov  ax,di
  xor  dx,dx
  mov  si,10
  div  si
  mov  di,ax
  cmp  di,1
  jae  @1
  popa
  iret
  jmp  himem
himem endp
Out_String proc near
  push bp
  cli
  mov  bp,sp
  pushad
  push es
  mov  ax,32
  mov  es,ax
  mov  si,[bp+4]
  mov  di,[bp+6]
  mov  ah,14
  cld
@@OutString:
  lodsb
  test al,al
  jz  @@OutStringDone
  stosw
  jmp  @@OutString
@@OutStringDone:
  pop  es
  popad
  pop  bp
  sti
  retn 4
Out_String endp
HexWord_String proc near
  pusha
  push  es
  push  ds
  pop  es
  cld
  mov  bx,offset TabHex
  mov  cx,4
@@HexWordStr:
  rol  ax,4
  push  ax
  and  al,0Fh
  xlat
  stosb
  pop  ax
  loop  @@HexWordStr
  pop  es
  popa
  retn
HexWord_String endp
Hex_String proc near
  pusha
  push  es
  test  cx,cx
  jz    @@ExitHexStr
  cld
  mov  bx,offset TabHex
  push  ds
  pop  es
@@HexStr:
  lodsb
  mov  ah,al
  shr  al,4
  xlat
  stosb
  mov  al,ah
  and  al,0Fh
  xlat
  stosb
  loop  @@HexStr
@@ExitHexStr:
  pop  es
  popa
  retn
Hex_String endp
code_size= $-begin
    text ends
stk segment  stack 'stack'
    db 256 dup('~')
stk ends
end main



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.