# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  نحوه خالی کردن Cmos یا باطری سیستم

## Morteza Manafpour

با سلام
اگر کسی سورسی در مورد خالی کردن باطری Cmos پیدا کرد ممنون می‌شیم.

----------


## Best Programmer

بیشتر توضیح بدهبد : اگر سخت افزاری می خواهیا که در دفترچه مادربورد نوشته شده ولی اگر نرم افزاری می خواهید 




CSEG        SEGMENT PARA PUBLIC 'CODE'               ;Start CODE segment
            ASSUME  CS&#58;CSEG,DS&#58;CSEG,ES&#58;CSEG,SS&#58;CSEG
                    ORG     100H                     ;COM file format


CMOS_ADR            EQU     70H                      ;Address port of CMOS
CMOS_DATA           EQU     71H                      ;Data port of CMOS
NUM_BYTES           EQU     64                       ;Number of bytes in CMOS

MAIN     PROC       NEAR

                    MOV     CX,NUM_BYTES             ;Number of CMOS bytes
GET_NEXT_BYTE&#58;
                    MOV     AH,7                     ;Keyboard input W/O echo
                    INT     21H                      ;Thru DOS
                    MOV     AH,AL                    ;Save byte in AH

                    MOV     AL,NUM_BYTES             ;Calculate
                    SUB     AL,CL                    ;Byte to restore
                    CLI                              ;No interrupts
                    OUT     CMOS_ADR,AL              ;Say this byte is coming
                    JMP     SHORT $+2                ;Delay for slow I/O ports
                    MOV     AL,AH                    ;Get saved byte
                    OUT     CMOS_DATA,AL             ;Write byte
                    STI                              ;Allow interrupts
                    LOOP    GET_NEXT_BYTE            ;Repeat until done

                    MOV     AH,2CH                   ;Get time Fn
                    INT     21H                      ;Thru DOS
                                                     ;CH=HH,CL=MM,DH=SS,DL=ss
                    CALL    HEX2BCD                  ;Convert CH,CL,DH,DL, to BCD
                    MOV     AH,3                     ;Set realtime clock Fn
                    MOV     DL,0                     ;0 = normal time
                    INT     1AH                      ;Thru AT BIOS

                    MOV     AH,2AH                   ;Get date Fn
                    INT     21H                      ;Thru DOS
                                                     ;CX=year, DH=month, DL=day
                    MOV     AX,CX                    ;Convert year to
                    MOV     CL,100                   ;Century&#58;year format
                    DIV     CL                       ;AH=year, AL=century
                    XCHG    AH,AL                    ;Fix order

                    MOV     CX,AX                    ;Prepare for conversion

                    CALL    HEX2BCD                  ;Transform CX,DX to BCD

                    MOV     AH,5                     ;Set realtime date Fn
                    INT     1AH                      ;Thru AT BIOS

                    RET                              ;Near return to DOS

MAIN     ENDP

HEX2BCD             PROC    NEAR

                    PUSH    CX                       ;Save register on stack
                    MOV     AX,DX                    ;Convert DX first
                    CALL    HB_1                     ;Perform first conversion
                    MOV     DX,AX                    ;Return to DX
                    POP     AX                       ;Get second arg from stack
HB_1&#58;                                                ;&#40;Fall thru&#41;
                    MOV     CX,0AH                   ;Set CH=0, CL=A &#40;ten&#41;
                    XCHG    AH,CH                    ;Set AH=0, save high byte
                    DIV     CL                       ;Quotient in AL, rem in AH
                    MOV     CL,4
                    SHL     AL,CL                    ;Convert to BCD

                    OR      AL,AH                    ;And combine
                    XCHG    AL,CH                    ;Save

                    XOR     AH,AH                    ;Zero numerator high byte
                    MOV     CL,0AH
                    DIV     CL                       ;Divide by ten
                    MOV     CL,4                     ;Convert to BCD
                    SHL     AL,CL

                    OR      AH,AL
                    MOV     AL,CH                    ;Full result in AX
                    MOV     CX,AX                    ;And CX

                    RET
HEX2BCD             ENDP

CSEG     ENDS
         END        MAIN

اینم کدش.

----------


## Morteza Manafpour

با تشکر از شما
ولی منظور من تو قسمت Debug بود.

----------


## حمیدرضاصادقیان

-o 70 10
-o 71 10
-q

----------


## Mohsen Yasini

تو Debug  بنویسید.

O 70,64
O 71,64

----------

