Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

How to read real numbers

samejosamejo Member Posts: 3
Hi there,
I am trying to write an assembly module that reads real numbers from keyboard and stores them in memor..
i have tried alots of tags but all in vain...
if anyone could please tell of some algorithm and some useful sites which have some source code and examples of this thing..........
any positive suggestions will be greatly apprecited.


if you are looking for trouble i can offer a wide range of variety!

Comments

  • emu8086emu8086 Member Posts: 125
    ; this procedure taken from emu8086.inc, you can download
    ; assembler for which it was originally designed from:
    ; http://www.geocities.com/emu8086/
    ; (it should be MASM/TASM compatible as well).

    [code]
    SCAN_NUM PROC NEAR
    PUSH DX
    PUSH AX
    PUSH SI

    MOV CX, 0

    ; reset flag:
    MOV CS:make_minus, 0

    next_digit:

    ; get char from keyboard
    ; into AL:
    MOV AH, 00h
    INT 16h
    ; and print it:
    MOV AH, 0Eh
    INT 10h

    ; check for MINUS:
    CMP AL, '-'
    JE set_minus

    ; check for ENTER key:
    CMP AL, 13 ; carriage return?
    JNE not_cr
    JMP stop_input
    not_cr:


    CMP AL, 8 ; 'BACKSPACE' pressed?
    JNE backspace_checked
    MOV DX, 0 ; remove last digit by
    MOV AX, CX ; division:
    DIV CS:ten ; AX = DX:AX / 10 (DX-rem).
    MOV CX, AX
    PUTC ' ' ; clear position.
    PUTC 8 ; backspace again.
    JMP next_digit
    backspace_checked:


    ; allow only digits:
    CMP AL, '0'
    JAE ok_AE_0
    JMP remove_not_digit
    ok_AE_0:
    CMP AL, '9'
    JBE ok_digit
    remove_not_digit:
    PUTC 8 ; backspace.
    PUTC ' ' ; clear last entered not digit.
    PUTC 8 ; backspace again.
    JMP next_digit ; wait for next input.
    ok_digit:


    ; multiply CX by 10 (first time the result is zero)
    PUSH AX
    MOV AX, CX
    MUL CS:ten ; DX:AX = AX*10
    MOV CX, AX
    POP AX

    ; check if the number is too big
    ; (result should be 16 bits)
    CMP DX, 0
    JNE too_big

    ; convert from ASCII code:
    SUB AL, 30h

    ; add AL to CX:
    MOV AH, 0
    MOV DX, CX ; backup, in case the result will be too big.
    ADD CX, AX
    JC too_big2 ; jump if the number is too big.

    JMP next_digit

    set_minus:
    MOV CS:make_minus, 1
    JMP next_digit

    too_big2:
    MOV CX, DX ; restore the backuped value before add.
    MOV DX, 0 ; DX was zero before backup!
    too_big:
    MOV AX, CX
    DIV CS:ten ; reverse last DX:AX = AX*10, make AX = DX:AX / 10
    MOV CX, AX
    PUTC 8 ; backspace.
    PUTC ' ' ; clear last entered digit.
    PUTC 8 ; backspace again.
    JMP next_digit ; wait for Enter/Backspace.


    stop_input:
    ; check flag:
    CMP CS:make_minus, 0
    JE not_minus
    NEG CX
    not_minus:

    POP SI
    POP AX
    POP DX
    RET
    make_minus DB ? ; used as a flag.
    ten DW 10 ; used as multiplier.
    SCAN_NUM ENDP
    [/code]

  • Chris BrownChris Brown USAMember Posts: 4,496 ✭✭

    || http://forcoder.org || free ebooks and video tutorials about { PHP MATLAB C Go Perl Objective-C Java PL/SQL C# JavaScript C++ Assembly Swift Ruby Scratch Python Visual Basic Visual Basic .NET Delphi R Julia Apex Clojure COBOL Scala Prolog VBScript Awk Lua F# Transact-SQL Bash Fortran SAS LabVIEW D Alice Ada Rust Lisp Kotlin Logo Dart Scheme Erlang Crystal ABAP ML Hack FoxPro } _____________

Sign In or Register to comment.