News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Really Simple question

Started by Maeser, February 26, 2006, 09:09:26 AM

Previous topic - Next topic

Maeser

Hey guys

I've been trying to figure this out for a couple of hours

I've started converting my projects to using String tables, just to simplify changing of dialog strings, etc. But I just need to know how to do one thing..make a variable to hold the address of the string in memory...like

.data?
var [either db ? or handle ? I'm not sure]

.code
...
invoke LoadString, hInst, MB_FULLSCREENQUESTION, Addr buffer, 256


Now buffer gets filled up with the data...which is fine...but ECX gets the address of the string in the resource table. I need to assign the address to the handle. It should be ok since its 0 terminated, right? If not...how would I allocate a buffer to said handle...

I know this is really easy...but I'm tired and can't seem to wrap my head around it..

hutch--

Maeser,

As long as you only need the data within the scope of a procedure, you create a LOCAL buffer.


LOCAL buffer[128]:BYTE


You address it either with the ADDR operator in MASM or you can load the address by its name into a register with LEA.


lea eax, buffer


If you need GLOBAL scope, you create the data space in either the initialised data section if its static text or in the uninitialised data section if you just want space.


.data
  mytxt db "This is my text", 0

  ; or

.data?
  mybuffer db 128 dup (?)


You directly address a buffer of this type using OFFSET in code like,


mov eax, OFFSET mybuffer
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

ThoughtCriminal



stringptr dd string1

string1 db "Hello whirled",0

or  for a table:

stringptr:
dd string1
dd string2
dd string3
etc.

stringptr equals the staing at offset 0, the naxt string is at stringptr+4, stringptr+8, etc.

Maeser

Heh. Thanks guys. But uhh...one small problem.

I kind of want it like this..

nameofpointer dd ? (or whatever)

so when I call LoadString (Ecx gets filled with a nice addresse)

I can just go

mov nameofpointer, Ecx

and nameofpointer will hold the resource String's addresse. However, when I try it in my code...nameofpoiner still points to the same place in memory and it now contains a few characters of garbage

PBrennick

.data
  mytxt db "This is my text", 0   ;  This is all that is necessary

  ; and

.data?
  nameofpointer  dd  ?  ;  This is really unnecessary as you can use eax in your function callls such as LoadString


.code
;... some code probably
mov eax, offset mytext
mov nameofpointer, eax    ;  This is really unnecessary as you can use eax in your function callls such as LoadString


Paul

The GeneSys Project is available from:
The Repository or My crappy website

Maeser

That isn't quite what I meant...there isn't any
.data
  mytxt db "This is my text", 0   ;  This is all that is necessary


It's a string from the string table resource.
I'm looking for some like this:
.data?
  nameofpointer  dd  ?  ;

Just the pointer. nothing else.

then when I call LoadString, how would I go about moving the address in ECX into the pointer?

Maeser

I'm looking for something similar to the C++:
char *var = null;

... //code

var = Ecx; //Mix of asm and C++, but whatever. basically re-assigning the pointer to whatever was in ECX

Maeser

Ok Nevermind. I'm just an idiot. My debugger was displaying the pointer's content as ASCII, rather than hex.

Sorry to all

Mincho Georgiev

char *c it means piointer to that char , and logically , the c+1 is pointer to the next char ,e.t.c. In other words, you need a pointer to an array with a fixed(known) size. If the size is bigger than 64 KB, you need a dinamically reserved memory (reserved ,depending of the free memory on that time).
What i'm trying to say is that you need to allocate a part of memory to get a pointer to that part and fill it with some bytes. In 'C' that is malloc function.
Here we use mutch more often API functions for that, by example GlobalAlloc   respectiveli  LocalAlloc to get that esteemed pointer.
Then you get a pointer to the first byte of the allocated memory.
Excuse me if you didn't get what i mean ,but i had visit a birthday tonight and drink a couple of vodka's  :bg

PBrennick

Maeser,
Don't worry about it.  We are all an idiot every now and then.  It keeps us sane.  Heck, I was an idiot just yesterday.

Shaka, go to bed, you are drunk. :toothy

Paul
The GeneSys Project is available from:
The Repository or My crappy website

Maeser

#10
Okay so it seems my problem isn't quite solved. But I have frakked around with it some more, to no avail. Here's what I have (Header excluded because IDE sticks it in for me):
GetString Proto :UINT
.Const

.Data?
hInstance   HANDLE ?
Testc DD ?
buffer DB 256 Dup (?)

.Data

.Code

start:
Invoke GetModuleHandle, NULL
Mov hInstance, Eax
Invoke GetString, MB_FULLSCREENQUESTION
Invoke ExitProcess, 0
Ret

GetString Proc uId:UINT
.If hInstance == NULL
Ret
.Else
Invoke LoadString, hInstance, uId, Addr buffer, SizeOf buffer
Invoke GlobalAlloc, GPTR, Eax
Mov Testc, Eax
.EndIf
Ret
GetString EndP

End start


So. Here it is. What I would like, is that instead of filling Testc with the address from EAX, I want it to start pointing at the newly allocated memory. Or am I just thinking too high level?

PBrennick

For a 256 byte string this is overkill, why not tell us what you are actually trying to do because you are (kindly said) shooting in the dark.

Paul

The GeneSys Project is available from:
The Repository or My crappy website

Maeser


PBrennick

For a 256 byte string this is overkill, why not tell us what you are actually trying to do because you are (kindly said) shooting in the dark.

EDIT: you saw me change my thoughts, sorry, this is correct and so is the above.

Paul
The GeneSys Project is available from:
The Repository or My crappy website

Maeser

256 is just a buffer because each string in the String table is a different size. what I do is load the string, allocate a space with the exact number of bytes, then I want the pointer to point to the newly allocated space, which I will fill with my string