News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Can you check my code ???

Started by chola, September 23, 2005, 02:59:45 AM

Previous topic - Next topic

chola

This program add two number of one digit each, but i have two problems:

1. This program show a notification when the number is bigger than 10 (two digits), but don't work when the numbers are negatives (ex. -6; -9; etc.).

2.When the number is bigger than one digit they show the notification but don't erase the last number, when the program ask for the new number the old shows next to the new one.


can you help me to solve this ?

Thanxxx   :U

:thumbu


  ; -----------------------------------------------------------------
    .486                                    ; create 32 bit code
    .model flat, stdcall                    ; 32 bit memory model
    option casemap :none                    ; case sensitive

    include \masm32\include\windows.inc     ; always first
    include \masm32\macros\macros.asm       ; MASM support macros

  ; -----------------------------------------------------------------
  ; include files that have MASM format prototypes for function calls
  ; -----------------------------------------------------------------
    include \masm32\include\masm32.inc
    include \masm32\include\gdi32.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc

    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

    .code                       ; Tell MASM where the code starts

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

start:                          ; The CODE entry point to the program

    call main                   ; branch to the "main" procedure

    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

main proc

    LOCAL var1:DWORD            ; space for a DWORD variable
    LOCAL str1:DWORD            ; a string handle for the input data
    LOCAL var2:DWORD            ; space for a DWORD variable
    LOCAL str2:DWORD
    LOCAL rslt:DWORD

    LOCAL buffer1[32]:BYTE
    LOCAL buffer2[32]:BYTE

    mov str1, ptr$(buffer1)
    mov str2, ptr$(buffer2)
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
CMP1:
   
    mov str1, input(13,10,"Number 1 : ")
    mov var1, sval(str1)       
         
    cmp var1, 10               
    je equal1                   
    jg bigger1                   
    jl smaller1                 

    equal1:
      print chr$("ONLY ONE DIGIT NUMBERS")
      mov str1,NULL
      mov var1,NULL
      jmp CMP1
       

    bigger1:
      print chr$("ONLY ONE DIGIT NUMBERS")
      mov str1,NULL
      mov var1,NULL
      jmp CMP1
     
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    smaller1:
CMP2:
     mov str2,NULL
     mov str2, input(13,10,"Number 2 : ")
     mov var2, sval(str2)
     cmp var2, 10               
      je equal2                   
      jg bigger2                   
      jl smaller2                 
 
     equal2:
      print chr$("ONLY ONE DIGIT NUMBERS",13,10)
      jmp CMP2

     bigger2:
      print chr$("ONLY ONE DIGIT NUMBERS",13,10)
      jmp CMP2

     smaller2:
      mov var2, sval(str2)
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

;add two numbers

    push esi
    mov esi, uval(str1)
    add esi, uval(str2)
    mov rslt, ustr$(esi)
    pop esi

;Prrint

    loc 10, 12
    print "Result = "
    print rslt

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
  over:
 
loc 10, 20
    mov str1, input(" - PRESS ENTER TO FINISH - ")

    ret

main endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start                       

gabor

Bienvenido amigo! :)


Well, this is a consol app, with many masm macros...

If I am right, and the sval(str) macro loads a signed number stored in str and the uval(str) load an unsigned number, then the addition is wrong.
You have to add signed values if you allow negative numbers too.

Quote
;add two numbers

    push esi
    mov esi, uval(str1)      ; should be sval(str1)
    add esi, uval(str2)      ; should be sval(str2)
    mov rslt, ustr$(esi)      ; should be sstr$(esi) or something...
    pop esi

You don't need to handle the bigger than 10 and equal to 10 cases separatedly. The point is to decide wheter the input was smaller or bigger than 10!
Like this:


CMP1:
   
    mov str1, input(13,10,"Number 1 : ")
    mov var1, sval(str1)       
         
    cmp var1, 10               
    jl CMP2        ; signed less than 10?

      print chr$("ONLY ONE DIGIT NUMBERS")
      mov str1,NULL
      mov var1,NULL
      jmp CMP1



I would say that's all.

Greets, Gábor


brixton

Yeah, same stuff here

    cmp var1, 10               
    je equal1                   
    jg bigger1   


You can use jge and have the 'Only use 1 digit numbers' message appear, instead of wasting time with 2 jumps.
If you love somebody, set them free.
If they return, they were always yours. If they don't, they never were..


chola

#4
Thanxxx to all the people who help me.  :clap:(farabi, gabor, brixton) :clap:

My code now works ok.

THANK YOU !!!


:clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap: :clap: