This has probably been covered before, so ... sorry
In my implementation a string is a DWORD count, followed by a bunch of BYTEs.
How would I define a variable like that?
Right now, I have it like this, but I don't like it ...
cmdBye BYTE 3, 0, 0, 0, "bye", 0
essentially, i'm looking for a way to have it more like this ...
cmdBye DWORD 3, BYTE "bye", 0
thanks
Hi,
Well, you could try the following:
String DD 3
DB 0, 0, 0, "bye", 0
HTH,
Steve
cmdBye DD 3
DB "bye", 0
Quote from: CCurl on October 16, 2015, 03:00:51 AM
In my implementation a string is a DWORD count, followed by a bunch of BYTEs.
Are you looking for BSTR?
Quote from: CCurl on October 16, 2015, 03:00:51 AMRight now, I have it like this, but I don't like it ...
cmdBye BYTE 3, 0, 0, 0, "bye", 0
essentially, i'm looking for a way to have it more like this ...
cmdBye DWORD 3, BYTE "bye", 0
FORTRAN showed a solution. But you probably want a more flexible way to define strings:
include \masm32\include\masm32rt.inc
CCurl$ STRUCT
ccPtr dd ? ; first dword holds the pointer
ccLen dd ? ; second one takes the length
CCurl$ ENDS
.data ; define a string table using this structure
MyStrings CCurl$ <String1, sizeof String1>,
<String2, sizeof String2>,
<String3, sizeof String3>,
<0, 0>
String1 db "This is the first string", 0
String2 db "String #2", 0
String3 db "String Nr. three is a bit longer than the others", 0
.code
start:
xor ebx, ebx ; index
mov esi, offset MyStrings ; start of string table
cc$ equ [8*ebx+esi.CCurl$] ; we use an equate to make the following more readable
print "len", 9, "string", 13, 10 ; print the header
.While 1 ; endless loop
mov eax, cc$.ccLen
dec eax
.Break .if Sign? ; if it was a string with zero len, the sign flag is now set
print str$(eax), 9
print cc$.ccPtr, 13, 10
inc ebx
.Endw
inkey chr$(13,10, "--- hit any key ---")
exit
end start
Output:
len string
24 This is the first string
9 String #2
48 String Nr. three is a bit longer than the others
And mabdelouahab is right: this resembles very much a BSTR.
The above code is plain assembler with a handful of Masm32 macros (print, inkey). The following snippet does BASICally the same, it creates a stringtable with pointers and lengths from a file:
include \masm32\MasmBasic\MasmBasic.inc ; download (http://masm32.com/board/index.php?topic=94.0)
Init
Recall "\Masm32\include\msvcrt.inc", ms$() ; create a string table
Print "Len", Tb$, "String"
For_ ecx=0 To 30
Print Str$("\n%i\t", Len(ms$(ecx))), ms$(ecx)
Next
Inkey "--- hit any key ---"
EndOfCode
Quote from: mabdelouahab on October 16, 2015, 07:22:14 AM
Quote from: CCurl on October 16, 2015, 03:00:51 AM
In my implementation a string is a DWORD count, followed by a bunch of BYTEs.
Are you looking for BSTR?
No, I am implementing my own Forth interpreter. In my implementation, I want to use counted strings with the count as the first element of the string. I also want the string data to be 8-bit CHARs. So the first element of the string (the count) is 32-bit, and the rest of the elements (the characters in the string) are 8-bit.
So it's sort of a hybrid.
I swear ... you guys are the best! Thanks again for being so helpful! :icon14: