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.
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
Hi Michael:
I always say slow and right always beats Fast and wrong!
Thanks again Michael.
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
Gratsie,
Fixed for next beta. :bg
Hi Michael & Hutch-:
It works for me!
I think we can afford a single cycle
for accuracy.
Thanks.
Hi hutch- & Michael:
I think the latest MASM32 beta does
not have the updated ATOL.ASM
that works with negative numbers.
Regards herge.