?? acpi1.asm
字號:
PRINTSTR MACRO X
push dx
push ax
LEA DX,X
MOV AH,09H
INT 21H
pop ax
pop dx
ENDM
enableA20 macro
push ax
in al,92h
or al,2
out 92h,al
pop ax
endm
disableA20 macro
push ax
in al,92h
and al,0fdh
out 92h,al
pop ax
endm
.model small
.586
.stack 100
.stack
.data
buffer1 db 24 dup(?)
error1 db 'an error occured!$'
enters db 10,13,'$'
type1 db 'type: $'
baseadd db 'base address: $'
length1 db 'length: $'
space1 db ' $'
type4base dd 0
acpiaddr dd 0
RSDTAddr dd 0
XSDTAddr dd 0
FADTAddr dd 0
MADTAddr dd 0
OEMBAddr dd 0
MCFGAddr dd 0
FACSAddr dd 0
DSDTAddr dd 0
string0 db 'RSDT base address: $'
string1 db 'FADT base address: $'
string2 db 'FACS base address: $'
string3 db 'DSDT base address: $'
string4 db 'MADT base address: $'
string5 db 'OEMB base address: $'
string6 db 'MCFG base address: $'
string7 db 'XSDT base address: $'
addr1 db ' base address: $'
type3s db ' type 3$'
type4s db ' type 4$'
.code
.startup
push ds
pop es
lea di,buffer1
mov eax,0e820h
mov ebx,0
mov ecx,24
mov edx,'SMAP'
loop1: int 15h
jc error11
push ax
printstr type1
mov ax,[di+16]
call show_ax
cmp ax,04
jz keep4
jmp nexts
keep4: mov eax,[di]
mov type4base,eax
nexts:
printstr space1
printstr baseadd
mov ax,[di+2]
call show_ax
mov ax,[di+0]
call show_ax
printstr space1
printstr length1
mov ax,[di+10]
call show_ax
mov ax,[di+8]
call show_ax
printstr enters
cmp ebx,0
je exit1
mov eax,0e820h
mov ecx,24
mov edx,'SMAP'
jmp loop1
error11: printstr error1
jmp exit2
exit1:
enableA20 ;open a20
mov ax,0f000h
mov es,ax
mov si,0
check1: mov eax,es:[si]
cmp eax,' DSR'
jnz next1
add si,4
mov eax,es:[si]
cmp eax,' RTP'
jz next2
add si,4
jmp check1
next1: add si,8
jmp check1
next2: ;printstr find1
;printstr enters
sub si,4 ;offset of RSDP
mov ebx,es:[si+16] ;ebx = RSDT address
mov RSDTAddr,ebx
printstr string0
mov eax,ebx
call show_eax
cmp eax,type4base
jl print33
printstr type4s
jmp toXSDT
print33: printstr type3s
toXSDT:
printstr enters
printstr string7
mov eax,es:[si+24] ;XSDT address
call show_eax
cmp eax,type4base
jl print34
printstr type4s
jmp toF
print34: printstr type3s
toF:
printstr enters
xor ax,ax
mov es,ax
mov ebx,RSDTAddr ;rsdt addr
mov esi,36
recal11: mov eax,es:[ebx+esi] ;get address
cmp eax,0
je out1
mov ACPIaddr,eax
mov ecx,es:[eax] ;get signature
mov eax,ecx
cmp eax,'PCAF'
je keepFADT
prints: call show_eax_asc
printstr addr1
mov eax,acpiaddr
call show_eax
cmp eax,type4base
jl type3_show
printstr type4s
jmp space11
keepFADT: push eax
mov eax,acpiaddr
mov FADTAddr,eax
pop eax
jmp prints
type3_show: printstr type3s
space11: printstr enters
add esi,4
jmp recal11
out1:
;======= get FADT,FACS,DSDT address
;printstr find2
;printstr enters
mov eax,FADTAddr
mov esi,36
mov ebx,dword ptr es:[eax+esi]
mov FACSAddr,ebx
mov esi,40
mov ebx,dword ptr es:[eax+esi]
mov DSDTAddr,ebx
;======= show address info
printstr string2
mov eax,FACSAddr
call show_eax
cmp eax,type4base
jl print31
printstr type4s
jmp next6
print31: printstr type3s
next6: printstr enters
printstr string3
mov eax,DSDTAddr
call show_eax
cmp eax,type4base
jl print32
printstr type4s
jmp next7
print32: printstr type3s
next7: printstr enters
exit2:
.exit
show_eax_asc proc
push dx
push eax
mov dh,ah
mov dl,al
mov ah,2
int 21h ;show al
mov dl,dh
int 21h ;show ah
pop eax
shr eax,16
mov dh,ah
mov dl,al
mov ah,2
int 21h ;high
mov dl,dh
int 21h ;high
pop dx
ret
show_eax_asc endp
show_ax proc
push ax
mov al,ah
call show_al
pop ax
call show_al
ret
show_ax endp
show_eax proc
push eax
shr eax,16
call show_ax
pop eax
call show_ax
ret
show_eax endp
show_al proc
push ax
push dx
mov dh,al
and al,0f0h
shr al,4
add al,30h
cmp al,3ah
jb doing
add al,7
doing: mov dl,al
mov ah,2
int 21h
mov al,dh
and al,0fh
add al,30h
cmp al,3ah
jb doing1
add al,7
doing1: mov dl,al
mov ah,2
int 21h
pop dx
pop ax
ret
show_al endp
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -