Re: Searching for string problems

Randy.Dunlap (rddunlap@osdl.org)
Wed, 23 Apr 2003 11:59:52 -0700


On Wed, 23 Apr 2003 21:25:22 +0300 Andrew Kirilenko <icedank@gmx.net> wrote:

| Hello!
|
| > > > scan: movw %cs, %ax
| > > > movw %ax, %ds
| > > > movw %ax, %es
| > > > movw $where_in_BIOS_to_start, %bx
| > > > cld
| > > > 1: movw $cl_id_str, %si # Offset of search string
| > > > movw $cl_id_end, %cx # Offset of string end + 1
| > > > subw %si, %cx # String length
| > > > decw %cx # Don't look for the \0
| > > > movw %bx, %di # ES:DI = where to look
| > > > repz cmpsb # Loop while the same
| > > > jz found # Found the string
| > > > incb %bx # Next starting offset
| > > > cmpb $_BIOS_END, %bx # Check for limit
| > > > jb 1b # Continue
| > > > never_found_anywhere:
| > > >
| > > > found:
| > >
| > > I've written something similar to this before - and it wont' work, so
| > > I've reimplemented it. The problem is, that I don't know how to set ES
| > > properly. I only know, that BIOS data (and code) is located in
| > > 0xe000..0xf000 (real address).
| >
| > Yeah. So. I set ES and DS to be exactly where CS is. This means that
| > if your &!)(^$&_ code executes it will work. So, instead of trying
| > it, you just blindly ignore it and state that it won't work.
| >
| > Bullshit. I do this for a living and I gave you some valuable time
| > which you rejected out-of-hand. Have fun.
|
| Of course, I've tried your code as well - the same result! Sorry, if you
| haven't understand me.
|
| The problem is, that I don't know where this BIOS code is relative to current
| code segment (CS). I only know (hope), that it should be in
| 0x0:0xe000...0x0:0xf000. I have tried to set ES to 0 (xor %ax, %ax; mov %ax,
| %es) - no luck as well. BTW, `strings /dev/mem | grep "REQUESTED STRING"`
| founds it perfectly...

You shouldn't need to know where the BIOS code is "relative to
current code segment." It "should be" in hex 0:e000-ffff.
You should be able to use some segment reg. = 0 to search.

I see that Dick just corrected this, just as I was about to do:
Typical PC BIOSen are at segment 0xe000:0 thru 0xf000:ffff,
not segment 0 and offsets as you have them listed.
Are you using a typical PC BIOS or something else?

--
~Randy
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/