;============================================================================= ; Bases.asm ; Calculate the bases in which input numbers are equal! ; B1: Get numbers ; B2: Get minimum base for current number ; B3: Get the decimal value of the number in all bases ; B4: Do just the same for second number => B2 ; B5: Compare ;(C)I don't take any responsibility for the use of this program ; Zedr0n -- connection closed ;============================================================================= ;============================================================================= ; .Com declaration ;============================================================================= .MODEL TINY ; LOCALS @@ ;============================================================================= ; Data definition/declaration ;============================================================================= .DATA ; EQUAL STRUC ; F_IND DW 0 S_IND DW 0 EQUAL ENDS ;----------------------------------------------------------------------------- ; Equals ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ; Constants ;----------------------------------------------------------------------------- CRLF DB 0DH,0AH,'$' BASE DB "Base is ",'$' RESULT EQUAL <> ; NONE DB "No such bases",'$' DIVTAB DW 10000 DW 1000 DW 100 DW 10 DW 1 ;----------------------------------------------------------------------------- ; File variables ;----------------------------------------------------------------------------- BUFFER DB 0AH ; DB ? ; DB 10 DUP(?) ; NUMBUFF DB 34 DUP(?) ;number buffer NUM_1 DB 10 DUP(?) ; NUM_2 DB 10 DUP(?) NUM_1_BAS DD 37 DUP(?) ; NUM_2_BAS DD 37 DUP(?) ; MAX_1 DW ? ; MAX_2 DW ? ; ;----------------------------------------------------------------------------- ; Stack variables ;----------------------------------------------------------------------------- .CODE .386 ORG 100H ;============================================================================= ; Code segment ;============================================================================= START: ; B1: MOV DI,OFFSET NUM_1 ; CALL GET_NUMBER ; MOV AH,09H ; MOV DX,OFFSET CRLF ; INT 21H MOV DI,OFFSET NUM_2 CALL GET_NUMBER MOV SI,OFFSET NUM_1 B2: ; CALL GET_MINBASE MOV MAX_1,BX B3: LEA DI,NUM_1_BAS CALL CALC_BASES B4: ; MOV SI,OFFSET NUM_2 CALL GET_MINBASE ; MOV MAX_2,BX LEA DI,NUM_2_BAS CALL CALC_BASES B5: CALL COMPARE B6: MOV AX,RESULT.F_IND ; OR AX,AX ; JZ B7 MOV AH,09H ; MOV DX,OFFSET CRLF ; INT 21H ; MOV DX,OFFSET BASE ; INT 21H ; MOV AX,RESULT.F_IND ; CALL HEXDEC CALL OUTPUT MOV AH,09H ; MOV DX,OFFSET CRLF; INT 21H ; MOV DX,OFFSET BASE ; INT 21H MOV AX,RESULT.S_IND ; CALL HEXDEC CALL OUTPUT RET ; B7: ; MOV AH,09H ; MOV DX,OFFSET NONE ; INT 21H ;============================================================================= ; Procedures ;============================================================================= ;----------------------------------------------------------------------------- ; Get_Number ; Read the number and put the digits into buffer(non-digits are treated as ; double digit) ; Algorithm ; G1: Get the ascii representation of the number ; G2: Conversion loop ; G3: Non-digit. Supposedly, that errorenous input is impossible => Get ; G4: Put back into buffer ;----------------------------------------------------------------------------- GET_NUMBER PROC ; @@G1: MOV AH,0AH MOV DX,OFFSET BUFFER INT 21H MOV SI,OFFSET BUFFER ; ADD SI,2 @@G2: ; LODSB ; CMP AL,0DH JZ @@EXIT SUB AL,30H ; CMP AL,9 ; JLE @@G4 @@G3: DEC AL @@G4: ; STOSB ; JMP @@G2 @@EXIT: MOV AL,0FFH; STOSB RET GET_NUMBER ENDP ;----------------------------------------------------------------------------- ; Get_MinBase ; Get the minimum base for which this number can exist ; Algorithm ; M1: Load digit ; M2: If greater then set NewMax ;----------------------------------------------------------------------------- GET_MINBASE PROC ; @@MAX EQU [BP-1] ; ENTER 1,0 ; PUSH SI MOV @@MAX,0 @@M1: LODSB ; CMP AL,0FFH JZ @@EXIT MOV AH,@@MAX CMP AL,AH JL @@M1 @@M2: MOV @@MAX,AL JMP @@M1 @@EXIT: MOVZX BX,@@MAX INC BX POP SI ; LEAVE RET GET_MINBASE ENDP ;----------------------------------------------------------------------------- ; Calc_Bases ; Calculate decimal value for number in all bases ; Algorithm ; C1: ;----------------------------------------------------------------------------- CALC_BASES PROC ; MOV CL,BL ; XOR EAX,EAX XOR EDX,EDX PUSH SI @@C1: ; LODSB PUSH AX ; LODSB ; DEC SI CMP AL,0FFH ; JZ @@C2 POP AX ADD EDX,EAX MOV EAX,EDX MUL CX ; MOV EDX,EAX JMP @@C1 @@C2: POP AX ADD EDX,EAX ; MOVZX BX,CL SHL BX,2 MOV [DI][BX],EDX POP SI ; PUSH SI XOR EDX,EDX XOR EAX,EAX INC CL ; CMP CL,36 ; JLE @@C1 ; POP SI RET CALC_BASES ENDP ;----------------------------------------------------------------------------- ; Compare ; Compare to check if any are equal ;----------------------------------------------------------------------------- COMPARE PROC ; @@CUR_IND_1 EQU [BP-2] ; @@CUR_IND_2 EQU [BP-4] ENTER 4,0 ; MOV AX,MAX_1 MOV @@CUR_IND_1,AX ; @@C1: ; MOV BX,@@CUR_IND_1 ; CMP BX,37 ; JZ @@EXIT SHL BX,2 MOV EAX,NUM_1_BAS[BX] ; MOV BX,MAX_2 MOV @@CUR_IND_2,BX @@C2: ; MOV BX,@@CUR_IND_2 ; CMP BX,37 ; JZ @@C3 SHL BX,2 MOV EDX,NUM_2_BAS[BX] ; CMP EAX,EDX ; JZ @@C4 INC @@CUR_IND_2 ; JMP @@C2 @@C3: ; INC @@CUR_IND_1 ; JMP @@C1 @@C4: ; MOV AX,@@CUR_IND_1 MOV RESULT.F_IND,AX ; MOV AX,@@CUR_IND_2 MOV RESULT.S_IND,AX @@EXIT: LEAVE RET COMPARE ENDP ;============================================================================================================================================= ; Convert hexadecimal in ax to decimal in dx ;============================================================================================================================================= hexdec proc mov dx,ax mov si,offset divtab ;pointer subtract values mov di,offset numbuff ;output buffer mov cx,5 ;5 digits sublop: xor al,al ;clear counter sblop: cmp dx,[si] ;number < subractor ? jb tolow ;yeah sub dx,[si] ;noo, subtract add al,1 ;incrase times subtracted jmp sblop ;subtract again tolow: add al,30h ;make ascii stosb ;store in buffer add si,2 ;next subtractor loop sublop ;do it mov al,0 ;null terminate buffer stosb mov si,offset numbuff ret hexdec endp ;============================================================================================================================================= ; Outputs buffer with ascii, where si points to buffer ;============================================================================================================================================= output proc strip: lodsb ;load byte cmp al,'0' ;any leading zeroes ? jne nozero ;noo jmp strip ;yeahh, check next nozero: dec si ;adjust that back one byte lodsb out: mov dl,al mov ah,02h int 21h lodsb cmp al,0 jnz out xor ah,ah int 16h ret output endp END START ;