Mov WantContinue, sval(input("Enter -1 to quit program : "))

Started by herge, May 27, 2008, 06:10:06 PM

Previous topic - Next topic

herge

 Hi All:

Mov WantContinue, sval(input("Enter -1 to quit program : "))


This is not working right!
Whan I enter -1 we get fffffff5 which is not -1
instead of fffffff

What am I forgetting?

Thanks.
// Herge born  Brussels, Belgium May 22, 1907
// Died March 3, 1983
// Cartoonist of Tintin and Snowy

MichaelW

The atol procedure that sval calls appears to be broken for negative values. I can fix it easily enough, but at this point I have no idea how to fix it without slowing it down.

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE

align 4

_atol proc lpSrc:DWORD

    xor eax, eax                ; zero EAX
    mov edx, [esp+4]
    movzx ecx, BYTE PTR [edx]
    add edx, 1

    cmp ecx, "-"                ; test for sign
    jne lbl0
    add eax, 1                  ; set EAX if sign
    movzx ecx, BYTE PTR [edx]
    add edx, 1

  lbl0:
    push eax                    ; store sign on stack

XOR EAX, EAX

  lbl1:
    sub ecx, 48
    jc  lbl2
    ;lea eax, [eax+eax*4]        ; mul by 5
    ;lea eax, [ecx+eax*2]        ; MUL BY 2 AND ADD ECX

TEST EAX, EAX
JZ @F         ; ***SKIP MULTIPLY BY 10 FOR FIRST DIGIT***
IMUL EAX, 10
@@:
ADD EAX, ECX

    movzx ecx, BYTE PTR [edx]
    add edx, 1
    jmp lbl1

  lbl2:
    pop ecx                     ; retrieve sign
    test ecx, ecx
    jnz lbl3
    ret 4

  lbl3:
    neg eax                     ; negative return value is sign set
    ret 4

_atol endp

OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef

start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    FOR arg, <100,10,3,2,1,0,-1,-2,-3,-10,-100>

      print uhex$(arg),9

      invoke atol,chr$("&arg")
      print uhex$(eax),9

      invoke _atol,chr$("&arg")
      print uhex$(eax),13,10

    ENDM

    print chr$(13,10)

    inkey "Press any key to exit..."
    exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start


00000064        00000064        00000064
0000000A        0000000A        0000000A
00000003        00000003        00000003
00000002        00000002        00000002
00000001        00000001        00000001
00000000        00000000        00000000
FFFFFFFF        FFFFFFF5        FFFFFFFF
FFFFFFFE        FFFFFFF4        FFFFFFFE
FFFFFFFD        FFFFFFF3        FFFFFFFD
FFFFFFF6        FFFFFF92        FFFFFFF6
FFFFFF9C        FFFFFBB4        FFFFFF9C

eschew obfuscation

herge


Hi Michael:

I always say slow and right always beats Fast and wrong!

Thanks again Michael.
// Herge born  Brussels, Belgium May 22, 1907
// Died March 3, 1983
// Cartoonist of Tintin and Snowy

MichaelW

The problem was simply a missing xor eax, eax.

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
    .686
    include \masm32\macros\timers.asm
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE

align 4

_atol proc lpSrc:DWORD
    xor eax, eax                ; zero EAX
    mov edx, [esp+4]
    movzx ecx, BYTE PTR [edx]
    add edx, 1
    cmp ecx, "-"                ; test for sign
    jne lbl0
    add eax, 1                  ; set EAX if sign
    movzx ecx, BYTE PTR [edx]
    add edx, 1
  lbl0:
    push eax                    ; store sign on stack
    xor eax, eax                ; so eax*10 will be 0 for first digit
  lbl1:
    sub ecx, 48
    jc  lbl2
    lea eax, [eax+eax*4]        ; mul eax by 5
    lea eax, [ecx+eax*2]        ; mul eax by 2 and add digit value
    movzx ecx, BYTE PTR [edx]   ; get next digit
    add edx, 1
    jmp lbl1
  lbl2:
    pop ecx                     ; retrieve sign
    test ecx, ecx
    jnz lbl3
    ret 4
  lbl3:
    neg eax                     ; negative return value is sign set
    ret 4
_atol endp

OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef

start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    invoke Sleep, 3000

    print "correct ",9," atol     ",9," _atol",13,10
    print "----------------------------------------",13,10

    FOR arg, <100,10,3,2,1,0,-1,-2,-3,-10,-100>

      print uhex$(arg),9

      invoke atol,chr$("&arg")
      print uhex$(eax),9

      invoke _atol,chr$("&arg")
      print uhex$(eax),13,10

    ENDM

    print chr$(13,10)

    counter_begin 1000, HIGH_PRIORITY_CLASS
      invoke atol, chr$("12345678")
    counter_end
    print ustr$(eax)," cycles, atol",13,10

    counter_begin 1000, HIGH_PRIORITY_CLASS
      invoke _atol, chr$("12345678")
    counter_end
    print ustr$(eax)," cycles, _atol",13,10,13,10

    inkey "Press any key to exit..."
    exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start


correct          atol            _atol
----------------------------------------
00000064        00000064        00000064
0000000A        0000000A        0000000A
00000003        00000003        00000003
00000002        00000002        00000002
00000001        00000001        00000001
00000000        00000000        00000000
FFFFFFFF        FFFFFFF5        FFFFFFFF
FFFFFFFE        FFFFFFF4        FFFFFFFE
FFFFFFFD        FFFFFFF3        FFFFFFFD
FFFFFFF6        FFFFFF92        FFFFFFF6
FFFFFF9C        FFFFFBB4        FFFFFF9C

49 cycles, atol
48 cycles, _atol

eschew obfuscation

hutch--

Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

herge


Hi Michael & Hutch-:

It works for me!
I think we can afford a single cycle
for accuracy.

Thanks.

// Herge born  Brussels, Belgium May 22, 1907
// Died March 3, 1983
// Cartoonist of Tintin and Snowy

herge


Hi hutch- & Michael:

I think the latest MASM32 beta does
not have the updated ATOL.ASM
that works with negative numbers.

Regards herge.
// Herge born  Brussels, Belgium May 22, 1907
// Died March 3, 1983
// Cartoonist of Tintin and Snowy