Can anyone help me im kinda stuck or don't know how to do im trying to make 3D star or any shape but professor wants me to use print chr$ which i have no clue what im doing and i don't know how to or where to put coordinate for X,Y on print chr$. And my professor does not want us to use invoke location. or any invoke statement.
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data?
; JUST TRYING HARD TO UNDERSTAND AND LEARN HOW TO CONVERT C++ CODE INTO MASM32
a dd ?
b dd ?
star dd ?
; Right here is just trial and error and i don't know much and wanted to do 3D diamond or any 3d Shape if could have any sample code. that i could read and understand. That would be a great Help
;TOP
.if a <= 7
mov a, 1
cmp a, 7
inc a, 2
.if star <= a
mov star, 1
inc star
;BOTTOM
.if a <= 5
.if a >= 0
mov a,-2
.if b = 10 - a / 2
.if b > 0
inc b
.if star <= a
mov star,1
inc star
print chr$("*"), ; I DONT KNOW HOW TO USE PRINT CHR$
.code
start:
; this the code i follow for my masm32 i hope i did it right or not
int a, b, star; //integor declaration
//starting point of upper diamond shape loop
for (a = 1; a <=7; a+=2)
{
for (b = (10 - a) /2; b >0; b--)
{
printf (" ");
}
for (star = 1; star <= a; star++)
{
printf ("*");
}
printf ("\n");
}
//ending point of upper diamond shape loop
//staring point of bottom diamond shape loop
for (a = 5; a >= 0; a -= 2)
{
for (b = (10 - a) /2; b > 0; b--)
{
printf (" ");
}
for (star = 1; star <= a; star++)
{
printf("*");
}
printf ("\n");
}
getch ();
}
//ending point of bottom diamond shape loop
A simple translation of your C code would be:
include \masm32\include\masm32rt.inc
.code
diamond proc dim:SDWORD
; use nonvolatile registers with typecast
a EQU SDWORD ptr esi
b EQU SDWORD ptr edi
star EQU SDWORD ptr ebx
.if !(dim & 1)
add dim,1 ; make odd
.endif
mov a,1
.while a <= dim
mov eax,dim
add eax,2
sub eax,a
shr eax,1
mov b,eax
.while b > 0
print chr$(" ")
sub b,1
.endw
mov star,1
.while star <= a
print chr$("*")
add star,1
.endw
print chr$(13,10)
add a,2
.endw
mov a,dim
sub a,2
.while a >= 0
mov eax,dim
add eax,2
sub eax,a
shr eax,1
mov b,eax
.while b > 0
print chr$(" ")
sub b,1
.endw
mov star,1
.while star <= a
print chr$("*")
add star,1
.endw
print chr$(13,10)
sub a,2
.endw
ret
diamond endp
main proc
push 7
call diamond
push 20
call diamond
inkey
exit
main endp
end main
Remarks that the nonvolatile registers ESI, EBX and EDI are used as variables. These registers are not modified by API functions (in contrast to EAX,ECX and EDX).
Now it's your turn...
escuse me sir qWord is this how you put location in print chr$(13,10) ?
"print" and "chr$" are macros, part of the masm32 package
if your instructor doesn't want you to use INVOKE, he's probably not going to want you to use those pre-written macros, either
chr$ doesn't use INVOKE, as far as i know
but, print does
you could write your own macros, and include them as part of your program
to see how those macros are written, you can look at the file masm32\macros\macros.asm
INVOKE can be replaced with PUSH/CALL
for example, if you see code like this
INVOKE Function,Arg1,Arg2,Arg3
you can re-write it like this
push Arg3
push Arg2
push Arg1
call Function
for functions that use the "StdCall" convention, you do not have to POP the values off the stack
the function removes them for you, at exit
how do i use go to x,y i cant use invoke locate
SetConsoleCursorPosition
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686025%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686025%28v=vs.85%29.aspx)
in ASM, that would be
INVOKE SetConsoleCursorPosition,hStdOut,dwCoord
well - something like that :biggrin:
a COORD structure is 2 WORD's
so, you can use a DWORD with the x position in the low word and y position in the hight word
COORD STRUCT
x WORD ?
y WORD ?
COORD ENDS
to get the standard output handle, you can use GetStdHandle
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231%28v=vs.85%29.aspx)
INVOKE GetStdHandle,STD_OUTPUT_HANDLE
it returns the standard output handle in EAX
now, let's do it without using INVOKE
push STD_OUTPUT_HANDLE ;STD_OUTPUT_HANDLE = -11
call GetStdHandle ;EAX = standard output handle
push 150010h ;X = 10h = 16, Y = 15h = 21
push eax
call SetConsoleCursorPosition
excuse sir dedndave was wondering push 150010h about this is there a chart of some sort to know which locate on x and y ? for example i would like to it to be at the center how do i know im putting the right coordinate
generally, the console window is set up with 80 columns, and 25 rows
the columns would then be numbered 0 to 79 (0 to 4Fh)
and the rows would be numbered 0 to 24 (0 to 18h)
however, the user can alter the console window dimensions
so, the best way is to use GetConsoleScreenBufferInfo
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171%28v=vs.85%29.aspx)
that function will fill a CONSOLE_SCREEN_BUFFER_INFO structure for you
and, you can get the dimensions from that structure
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093%28v=vs.85%29.aspx)
Under Windows XP, at least by default, the screen buffer is 300 lines.
the buffer is default 300
but the window is default 25 :)