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

  • From: "Sina Bahram" <sbahram@xxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Mon, 17 Jan 2011 13:50:35 -0500

Feel free to do so. There is no reason you can't crack the encryption on that 
for accessibility reasons.

It's perfectly legal, perfectly doable, and completely above board.

If you like, I can try to convert some of those humungous PDFs into accessible 
html for you.

Take care,
Sina

-----Original Message-----
From: programmingblind-bounce@xxxxxxxxxxxxx 
[mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Littlefield, Tyler
Sent: Monday, January 17, 2011 11:51 AM
To: programmingblind@xxxxxxxxxxxxx
Subject: Re: code optomization:any way to do this better?

Thanks for the book. I've seen that before, just thought it was for the 
high-level assembly instead of... assembly. :) I guess my last question, 
though not so related to asm is this.
I'm able to navigate through the instruction reference (and something 
tells me that our processors would be so much faster without 500000 
instructions), but looking at the optomization manual I have problems 
because they aren't links, and I have like 3-8 (I assume chapter 3, page 
8). Is there a way to navigate by chapter with this mess? I'm able to 
click links (I just use u, as down arrow has problems reading contents), 
until I hit after M, where the first volume dead-ends. then I need to 
look at the page number, control+shift+n in volume 2 and go there. It's 
a bit off, but a control+page down 1-5 times does the trick. Slowish, 
but it works I suppose. To bad it's secure, I'd just start ripping all 
this out and making a nice table with all the pages.
On 1/17/2011 9:32 AM, Sina Bahram wrote:
> Also, I'd advise you to take a look at the following
>
> Note: all the following examples assume that es and ds are pointing at the 
> proper segments containing the destination and source
> strings.
>
> Comparing Str1 to Str2:
>
>                  lea     si, Str1
>                  lea     di, Str2
>
> ; Get the minimum length of the two strings.
>
>                  mov     al, Str1
>                  mov     cl, al
>                  cmp     al, Str2
>                  jb      CmpStrs
>                  mov     cl, Str2
>
> ; Compare the two strings.
>
> CmpStrs:        mov     ch, 0
>                  cld
>          repe    cmpsb
>                  jne     StrsNotEqual
>
> ; If CMPS thinks they're equal, compare their lengths
> ; just to be sure.
>
>                  cmp     al, Str2
> StrsNotEqual:
> At label StrsNotEqual, the flags will contain all the pertinent information 
> about the ranking of these two strings. You can use
the
> conditional jump instructions to test the result of this comparison.
>
>
> Art of assembly:
> http://webster.cs.ucr.edu/AoA/DOS/ch15/CH15-3.html
>
> take care,
> Sina
>
>
> -----Original Message-----
> From: programmingblind-bounce@xxxxxxxxxxxxx 
> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Littlefield, Tyler
> Sent: Monday, January 17, 2011 11:06 AM
> To: programmingblind@xxxxxxxxxxxxx
> Subject: Re: code optomization:any way to do this better?
>
> On a side note, here's my code cleaned up, for anyone who cares.
> 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
> 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.
> je .fail
> ;we check for equalness between the two bytes here.
> .check:
> cmp [EBX], EDX
> 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.
> .finish:
> leave
> ret
>
> On 1/17/2011 9:03 AM, Littlefield, Tyler wrote:
>> OK, a couple questions from your message. I can see letting things
>> fall through, and I actually got rid of a jmp before this. My question
>> is how I should handle this without those paths.
>> For example, I need to check the two strings, to make sure that there
>> is something there, or that one of the bytes is not null.
>> Last, what do you mean by promote the code up one level?
>> Thanks,
>> On 1/17/2011 8:48 AM, Sina Bahram wrote:
>>> 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: