;============================================================================= ; Cubes.asm ; This program shows all the possible a,b,c sum of cubes of which give cubes ; of integers up to 100 ; Algorithm ; C1: Overall loop ; C2: ; C3: ; C4: ;(C)I don't take any responsibility for the use of this program ; Zedr0n -- connection closed ;============================================================================= ;============================================================================= ; .Com declaration ;============================================================================= .MODEL TINY ;============================================================================= ; Data definition/declaration ;============================================================================= .DATA ;----------------------------------------------------------------------------- ; Equals ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ; Constants ;----------------------------------------------------------------------------- SUCCESS DB "Results found!",0DH,0AH,'$' A_MES DB "A - ",'$' ; CRLF DB 0DH,0AH,'$' RES_MES DB "Result - ",'$' ;----------------------------------------------------------------------------- ; File variables ;----------------------------------------------------------------------------- A DD ? ; B DD ? ; C DD ? ; RES DD ? ; numbuff db 34 dup(?) ;number buffer OFF DW OFFSET C,OFFSET B,OFFSET A divtab: ;subractor values dd 1000000000 dd 100000000 dd 10000000 dd 1000000 dd 100000 dd 10000 dd 1000 dd 100 dd 10 dd 1 ;----------------------------------------------------------------------------- ; Stack variables ;----------------------------------------------------------------------------- .CODE .386 ORG 100H ;============================================================================= ; Code segment ;============================================================================= START: MOV RES,0 ; C1: MOV A_MES[0],'A' INC RES CMP RES,100 ; JZ EXIT C2: ; MOV A,0 ; C3: ; INC A ; CMP A,100 ; JZ C1 MOV B,0 ; C4: ; INC B ; CMP B,100 ; JZ C3 MOV C,0 ; C5: ; INC C ; CMP C,100 ; JZ C4 ; XOR DI,DI ; XOR ECX,ECX C6: PUSH DI ; SHL DI,1 MOV BX,OFF[DI] POP DI MOV AX,[BX] MOV BX,AX MUL BX MUL BX MOVZX EBX,DX ; SHL EBX,16 ; ADD EBX,EAX ADD ECX,EBX INC DI ; CMP DI,3 ; JL C6 MOV EAX,RES MOV BX,AX ; MUL BX ; MUL BX ; MOVZX EBX,DX ; SHL EBX,16 ; ADD EBX,EAX CMP EBX,ECX; JZ C7 ; JL C4 JMP C5 C7: MOV AH,09H ; MOV DX,OFFSET SUCCESS ; INT 21H ; XOR DI,DI DEC A_MES[0] C8: ; INC A_MES[0] MOV AH,09H MOV DX,OFFSET A_MES ; INT 21H ; PUSH DI ; SHL DI,1 MOV BX,OFF[DI] MOV EAX,[BX] CALL HEXDEC ; CALL OUTPUT MOV AH,09H ; MOV DX,OFFSET CRLF ; INT 21H POP DI ; INC DI CMP DI,3 ; JNZ C8 MOV AH,09H ; MOV DX,OFFSET RES_MES ; INT 21H ; MOV EAX,RES ; CALL HEXDEC ; CALL OUTPUT MOV AH,09H ; MOV DX,OFFSET CRLF INT 21H JMP C1 EXIT: RET ;============================================================================================================================================= ; Convert hexadecimal in eax to decimal in edx ;============================================================================================================================================= hexdec proc mov edx,eax mov esi,offset divtab ;pointer subtract values mov edi,offset numbuff ;output buffer mov cx,10 ;5 digits sublop: xor al,al ;clear counter sblop: cmp edx,[esi] ;number < subractor ? jb tolow ;yeah sub edx,[esi] ;noo, subtract add al,1 ;incrase times subtracted jmp sblop ;subtract again tolow: add al,30h ;make ascii stosb ;store in buffer add esi,4 ;next subtractor loop sublop ;do it mov al,0 ;null terminate buffer stosb mov esi,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 esi ;adjust that back one byte lodsb out: mov dl,al mov ah,02h int 21h lodsb cmp al,0 jnz out ret output endp END START