Version 8 December has some more goodies (http://masm32.com/board/index.php?topic=94.0):
- DefStruct defines a structure:
include \masm32\MasmBasic\MasmBasic.inc
DefStruct PETS: puppyname, gender: BYTE, cuteness:BYTE, baseprice, DogOrCatProc
Data "Cooper", 0, 33, 100, Dog, "Yorky", 0, 99, 101, Dog
Data "Bella", 1, 77, 128, Cat, "Daisy", 1, 60, 100, Cat
Data "Charlie", 1, 55, 90, Dog, @, 1, 2, 3, "a string" ; @ separates pets section from the following data
Init
Dim pets() As PETS
Read pets()
For_ ecx=0 To eax-1
xCall pets(ecx, DogOrCatProc), ecx ; pass the registered function and the index
PrintLine Str$("\t(cuteness %i", pets(ecx, cuteness)), Str$(" x base %i)", pets(ecx, baseprice))
Next
Inkey "done"
Exit
Dog proc inx
movzx eax, pets(inx, cuteness)
push eax
fild pets(inx, baseprice)
fimul stack
fistp stack
Print pets(inx, puppyname), cfm$("\tis a dog and costs ")
pop eax
Print Str$("%i euros\t", eax)
ret
Dog endp
Cat proc inx
movzx eax, pets(inx, cuteness)
push eax
fild pets(inx, baseprice)
fimul stack
fistp stack
Print pets(inx, puppyname), cfm$("\tis a cat and costs ")
pop eax
Print Str$("%i euros\t", eax)
ret
Cat endp
EndOfCode
Output:
Cooper is a dog and costs 3300 euros (cuteness 33 x base 100)
Yorky is a dog and costs 9999 euros (cuteness 99 x base 101)
Bella is a cat and costs 9856 euros (cuteness 77 x base 128)
Daisy is a cat and costs 6000 euros (cuteness 60 x base 100)
Charlie is a dog and costs 4950 euros (cuteness 55 x base 90
- The Rewind macro sets the Data pointer back by n items (no arg, one item):
Data 123, "a string"
Read eax, ecx ; eax=123, ecx="a string"
Rewind 2
Read var1, var2 ; var1=123, var2="a string"
As always, since this code assembles just fine with Masm (6.15 ... 15 or so - attention, the latest ones are buggy), UAsm, AsmC and JWasm, it is purest Assembly :biggrin: