RE: code optomization:any way to do this better?

  • From: "Sina Bahram" <sbahram@xxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Mon, 17 Jan 2011 10:48:21 -0500

You have to do the same thing that I suggested in my last mail with your fail 
and success jumps.

Here is a rule. Never, ever, ever, never, ever have two orthogonal jumps beside 
one another. You will never have a situation where
you need more than one jump, because mathematically, this is equivalent to this:

If(true)
Do stuff
Else if(false)
Do stuff

That's redundant, right? Because of course the else is false, there's no need 
to check it.


Also, you need to promote code up a level, if you'd like less code space bloat.

You compare the byte stored at ECX to 0 in both branches of your jump, then you 
jump based on that result. Get rid of it from both
branches. In fact, just get rid of those branches all together. There is no 
point ot them, since  they contain the same code, before
they each individually jump to fail, success, notnull, and null, or whatever 
the heck the four paths are.

So just collapse all these jumps down.


Take care,
Sina

-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx 
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Littlefield, Tyler
Sent: Sunday, January 16, 2011 9:56 PM
To: programmingblind@xxxxxxxxxxxxx
Subject: code optomization:any way to do this better?

So I've been playing with assembly a lot lately, and was curious if 
there was a better way to do this. most importantly, the whole three 
branched if check (null, not null).
section .text
global _strcmp
_strcmp:
enter 0,0
;we copy our arguments to EBX and ECX
mov EBX, [EBP+8]
mov ECX, [EBP+12]
.loop:
;we need one value in a register
mov EDX, [ECX]
;check for null termination
cmp byte [EBX], 0
je .null
jne .notnull
;we have a null termination.
;if the other string is null terminated, we jump to success. otherwise 
it fails because they obviously aren't equal.
.null:
cmp byte [ECX], 0
je .success
jne .fail
;byte wasn't null, now we check for null on the other byte.
;if one is null, it's a fail because again they aren't equal. If it is 
not null, we do another check.
.notnull:
cmp byte [ECX], 0
;not equal, we check for equalness between the two now.
jne .check
je .fail
;we check for equalness between the two bytes here.
.check:
cmp [EBX], EDX
je .next
jne .fail
;here we increase pointers and jump back up to the top of the loop.
.next:
inc EBX
inc ECX
jmp .loop
;strings compared fully
.success:
mov EAX,1
jmp .finish
;strings did not compare fully.
.fail:
mov EAX, 0
;code cleanup.
;no need for a jmp, it just falls through.
.finish:
leave
ret

-- 

Thanks,
Ty

__________
View the list's information and change your settings at 
//www.freelists.org/list/programmingblind

__________
View the list's information and change your settings at 
//www.freelists.org/list/programmingblind

Other related posts: