⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acpi1.asm

📁 bios开发培训涉及例子。可以给大家参考。请在dos下运行。用masm6.0编译。
💻 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 + -