The MASM Forum

General => The Campus => Topic started by: ayao on March 11, 2014, 09:55:40 PM

Title: Can Anyone Help Me Bit Confused
Post by: ayao on March 11, 2014, 09:55:40 PM
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




Title: Re: Can Anyone Help Me Bit Confused
Post by: qWord on March 11, 2014, 11:45:04 PM
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...
Title: Re: Can Anyone Help Me Bit Confused
Post by: ayao on March 12, 2014, 12:35:02 AM
escuse me sir  qWord is this how you put location  in print chr$(13,10) ?
Title: Re: Can Anyone Help Me Bit Confused
Post by: dedndave on March 12, 2014, 05:08:45 AM
"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
Title: Re: Can Anyone Help Me Bit Confused
Post by: ayao on March 12, 2014, 01:40:09 PM
how do i use  go to x,y i cant use invoke locate
Title: Re: Can Anyone Help Me Bit Confused
Post by: dedndave on March 12, 2014, 04:02:51 PM
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
Title: Re: Can Anyone Help Me Bit Confused
Post by: ayao on March 12, 2014, 06:01:02 PM
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
Title: Re: Can Anyone Help Me Bit Confused
Post by: dedndave on March 13, 2014, 07:19:44 AM
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)
Title: Re: Can Anyone Help Me Bit Confused
Post by: MichaelW on March 13, 2014, 09:08:43 AM
Under Windows XP, at least by default, the screen buffer is 300 lines.
Title: Re: Can Anyone Help Me Bit Confused
Post by: dedndave on March 13, 2014, 09:24:04 AM
the buffer is default 300
but the window is default 25 :)