Perche un .exe in asm con questo sorgente:
codice:
;Beep.asm - by b0nu$, 1997
.286c
.MODEL SMALL
INTERRUPT_NUM EQU 9 ;Interrupt da intercettare
.CODE
ORG 100H
FIRST: JMP LOAD_PROG ;Carico in memoria il prg.
OLD_KEYBOARD_INT DD ? ;Memorizza l'indirizzo al
;vecchio vettore di int.
PROG PROC
pusha ;salvo i registri
pushf
call OLD_KEYBOARD_INT ;chiamo la vecchia routine di int.
;QUI CI VA IL PROGRAMMA: In questo esempio ho deciso di emettere un BEEP ma
;si puņ fare qualunque cosa. Tranne che chiamare un interrupt del DOS!!
;--------------------------------------------------------------------------
in al,61h ;Per il BEEP programmo il Timer
test al,3
jne skippa
or al,3
out 61h,al
mov al,0B6h
out 43h,al
skippa: mov al,06h ;frequenza LSB
out 42h,al
mov al,01h ;frequenza MSB
out 42h,al
mov cx,0FFFFh
wait_loop:
loop wait_loop ;ciclo di attesa
in al,61h ;silenzio
and al,0FCh
out 061h,al
;--------------------------------------------------------------------------
EXIT:
popa
iret
PROG ENDP
LOAD_PROG PROC ;Procedura che carica in memoria il prg.
mov ah,35h
mov al,INTERRUPT_NUM
int 21h ;Prelevo il vecchio vettore
mov WORD PTR OLD_KEYBOARD_INT,bx
mov WORD PTR OLD_KEYBOARD_INT[2],es
mov al,INTERRUPT_NUM
mov ah,25h
lea dx,PROG
int 21h ;Imposto quello nuovo
mov dx,OFFSET LOAD_PROG ;in DX ci va l'ultimo byte del
;prg. + 1
int 27h ;Termina ma rimani in memoria
LOAD_PROG ENDP
END FIRST
viene disassemblato cosi:
codice:
seg000:0100 ;
seg000:0100 ; +-------------------------------------------------------------------------+
seg000:0100 ; ¦ This file is generated by The Interactive Disassembler (IDA) ¦
seg000:0100 ; ¦ Copyright (c) 2001 by DataRescue sa/nv, <ida@datarescue.com> ¦
seg000:0100 ; ¦ Licensed to: Roger Cross, 1 user, std, 7/2000 ¦
seg000:0100 ; +-------------------------------------------------------------------------+
seg000:0100 ;
seg000:0100 ; File Name : C:\Documents and Settings\Luca\Desktop\Nuova cartella\BEEP.COM
seg000:0100 ; Format : MS-DOS COM-file
seg000:0100 ; Base Address: 1000h Range: 10100h-1014Fh Loaded length: 4Fh
seg000:0100
seg000:0100
seg000:0100 ; ---------------------------------------------------------------------------
seg000:0100
seg000:0100 seg000 segment byte public 'CODE'
seg000:0100 assume cs:seg000
seg000:0100 org 100h
seg000:0100 assume es:nothing, ss:nothing, ds:seg000
seg000:0100
seg000:0100 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
seg000:0100
seg000:0100
seg000:0100 public start
seg000:0100 start proc near
seg000:0100 jmp short loc_0_131
seg000:0100 ; ---------------------------------------------------------------------------
seg000:0102 db 90h ; É
seg000:0103 word_0_103 dw 0 ; DATA XREF: start+37.w
seg000:0105 word_0_105 dw 0 ; DATA XREF: start+3C.w
seg000:0107 db 60h ; `
seg000:0108 db 9Ch ; £
seg000:0109 db 2Eh ; .
seg000:010A db 0FFh ;
seg000:010B db 1Eh ;
seg000:010C db 3 ;
seg000:010D db 1 ;
seg000:010E db 0E4h ; õ
seg000:010F db 61h ; a
seg000:0110 db 0A8h ; æ
seg000:0111 db 3 ;
seg000:0112 db 75h ; u
seg000:0113 db 8 ;
seg000:0114 db 0Ch ;
seg000:0115 db 3 ;
seg000:0116 db 0E6h ; µ
seg000:0117 db 61h ; a
seg000:0118 db 0B0h ; ¦
seg000:0119 db 0B6h ; Ā
seg000:011A db 0E6h ; µ
seg000:011B db 43h ; C
seg000:011C db 0B0h ; ¦
seg000:011D db 6 ;
seg000:011E db 0E6h ; µ
seg000:011F db 42h ; B
seg000:0120 db 0B0h ; ¦
seg000:0121 db 1 ;
seg000:0122 db 0E6h ; µ
seg000:0123 db 42h ; B
seg000:0124 db 0B9h ; ¦
seg000:0125 db 0FFh ;
seg000:0126 db 0FFh ;
seg000:0127 db 0E2h ; Ō
seg000:0128 db 0FEh ; ¦
seg000:0129 db 0E4h ; õ
seg000:012A db 61h ; a
seg000:012B db 24h ; $
seg000:012C db 0FCh ; ³
seg000:012D db 0E6h ; µ
seg000:012E db 61h ; a
seg000:012F db 61h ; a
seg000:0130 db 0CFh ; ¤
seg000:0131 ; ---------------------------------------------------------------------------
seg000:0131
seg000:0131 loc_0_131: ; CODE XREF: start.j
seg000:0131 mov ah, 35h
seg000:0133 mov al, 9
seg000:0135 int 21h ; DOS - 2+ - GET INTERRUPT VECTOR
seg000:0135 ; AL = interrupt number
seg000:0135 ; Return: ES:BX = value of interrupt vector
seg000:0137 mov cs:word_0_103, bx
seg000:013C mov cs:word_0_105, es
seg000:0141 mov al, 9
seg000:0143 mov ah, 25h
seg000:0145 mov dx, 107h
seg000:0148 int 21h ; DOS - SET INTERRUPT VECTOR
seg000:0148 ; AL = interrupt number
seg000:0148 ; DS:DX = new vector to be used for specified interrupt
seg000:014A mov dx, 131h
seg000:014D int 27h ; DOS - TERMINATE BUT STAY RESIDENT
seg000:014D start endp ; CS = current program segment
seg000:014D ; DX = last program byte + 1
seg000:014D seg000 ends
seg000:014D
seg000:014D
seg000:014D end start
Non vedo alcune parti del cod ...
P.S: ma Ida aggiunge i commenti da solo?