📄 adsintr.asm
字号:
mov cl,&num ; ...
int 21h ; ...
pop ds ; ...
endm
allexceptions setvect
mov eax,1 ; return true
pop ds ; restore registers
pop es ; ...
pop edx ; ...
pop ebx ; ...
pop ecx ; ...
ret ; return to caller
GrabVects endp
public ReleVects
ReleVects proc near
push ecx ; save registers
push edx ; ...
push ebx ; ...
push ds ; ...
push es ; ...
oldvect macro name,num
mov ds,cs:dataseg ; get addressability
mov edx,i&num&off ; restore old int3 handler
mov ds,i&num&seg ; ...
mov ax,2533h ; ...
mov cl,&num ; ...
int 21h ; ...
endm
allexceptions oldvect
pop es ; restore registers
pop ds ; ...
pop ebx ; ...
pop edx ; ...
pop ecx ; ...
ret ; return to caller
ReleVects endp
public GetDosLong
GetDosLong proc near
mov eax,4[esp]
push fs
mov fs,Meg1
mov eax,dword ptr fs:[eax]
pop fs
ret
GetDosLong endp
public GetDosByte
GetDosByte proc near
mov eax,4[esp]
push fs
mov fs,Meg1
movzx eax,byte ptr fs:[eax]
pop fs
ret
GetDosByte endp
public PutDosByte
PutDosByte proc near
push edx
mov eax,8[esp]
mov edx,12[esp]
push fs
mov fs,Meg1
mov byte ptr fs:[eax],dl
pop fs
pop edx
ret
PutDosByte endp
public PutDosLong
PutDosLong proc near
push edx
mov eax,8[esp]
mov edx,12[esp]
push fs
mov fs,Meg1
mov fs:[eax],edx
pop fs
pop edx
ret
PutDosLong endp
public CallRealMode
CallRealMode proc near
mov eax,4[esp]
push ebx
push ecx
push edx
push esi
push edi
push ebp
mov ebx,eax
xor ecx,ecx
mov ax,250eH
int 21H
pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
ret
CallRealMode endp
public GetDS
GetDS proc near
xor eax,eax
mov ax,ds
ret
GetDS endp
public GetSS
GetSS proc near
xor eax,eax
mov ax,ss
ret
GetSS endp
public GetCS
GetCS proc near
xor eax,eax
mov ax,cs
ret
GetCS endp
public GetFL
GetFL proc near
pushfd
pop eax
ret
GetFL endp
public GetLinear
GetLinear proc near
push ebx ; save regs
push ecx ; ...
mov ebx,12[esp] ; load selector
mov ax,2508H ; get segment linear base address
int 21h ; ...
add ecx,16[esp] ; add offset to base address
mov eax,ecx ; return it
pop ecx
pop ebx
ret
GetLinear endp
public SegLimit
SegLimit proc near
lsl eax,word ptr 4[esp]; get segment limit of selector
jne nogood ; if good selector
ret ; - return segment limit
nogood: xor eax,eax ; else
ret ; - return( 0 )
SegLimit endp
public DoReadMem
DoReadMem proc near
mov ax,4[esp] ; load segment
verr ax ; if not ok for read
je readok ; - then
xor eax,eax ; - return( 0 )
ret ; - ...
readok: push ebx ; save regs
push edx ; ...
push ds ; ...
mov ds,16[esp] ; load seg
mov edx,20[esp] ; load offset
mov ebx,24[esp] ; address of buffer
mov al,[edx] ; get byte at seg:offset
pop ds ; restore reg
mov [ebx],al ; save byte in buffer
pop edx ; restore regs
pop ebx ; ...
mov eax,1 ; return( 1 )
ret ; ...
DoReadMem endp
public WriteOk
WriteOk proc near
mov ax,4[esp] ; load segment
verw ax ; if ok for write
sete al ; return TRUE
movzx eax,al ; ...
ret ; ...
WriteOk endp
public DoWriteMem
DoWriteMem proc near
mov ax,4[esp] ; load segment
verw ax ; if not ok for read
je writeisok ; - then
xor eax,eax ; - return( 0 )
ret ; - ...
writeisok: push edx ; save regs
push ds ; ...
mov edx,20[esp] ; get address of buffer
mov al,[edx] ; load byte from buffer
mov ds,12[esp] ; get seg
mov edx,16[esp] ; load offset
mov [edx],al ; store byte at seg:offset
pop ds ; restore regs
pop edx ; ...
mov eax,1 ; return( 1 )
ret ; ...
DoWriteMem endp
sysregs macro write
push ebx ; save regs
push edx ; ...
mov edx,12[esp] ; get buffer address
mov ax,02535h ; system call
mov ebx,&write ; read/write
int 21h ; ...
pop edx ; restore regs
pop ebx ; ...
ret ; return to caller
endm
public GetSysRegs
GetSysRegs proc near
sysregs 0
GetSysRegs endp
public SetSysRegs
SetSysRegs proc near
sysregs 1
SetSysRegs endp
_text ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -