News:

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

How do you read a string into an array?

Started by bcddd214, April 27, 2011, 02:53:41 AM

Previous topic - Next topic

mineiro

I have installed irvine to help bcddd214, and compiled your code Sr RuiLoureiro and works fine, but need only a bit of modifications because Irvine uses non sensitive.
so, changing all MAXINDEX (uppercase) to MAXINDEX2 resolve this
and changing CRLF to CRLF1 too - Irvine uses the same in a call.
regards.

bcddd214

Quote from: bcddd214 on April 27, 2011, 04:48:49 AM
Quote from: dedndave on April 27, 2011, 04:35:34 AM
one way to do what you want would be to create an array of string like Hutch said
  mbr1 db 256 dup (?)
  mbr2 db 256 dup (?)
  mbr3 db 256 dup (?)
  mbr4 db 256 dup (?)
  mbr5 db 256 dup (?)
  mbr6 db 256 dup (?)

then, instead of trying to push the name entered onto the stack, push the address of the name onto the stack
then, the addresses will pop off in reverse order, as desired

in this case, you do not need an array of pointers
  parr dd mbr1, mbr2, mbr3, mbr4, mbr5, mbr6

I like this "push the address of the name onto the stack
then, the addresses will pop off in reverse order, as desired"
Your pushing me into pointers which was going to be my next question.....   :)
because each string buffer is 256 bytes
it is easy to calculate the address of a particular one by multiplying the index by 256 and adding the address of the first one
(256 being a power of 2 makes the multiplication very simple)

the strings above may be numbered 1 through 6, but those are just names   :P
you may refer to them as 0 through 5
then use that as the index

so, if you want the 4th string (index = 3)
offset mbr1 + 256*3 is the address

You appear to be creating a number of arrays?

What does 'mbr1' represent?

bcddd214

Quote from: mineiro on April 28, 2011, 09:07:52 PM
I have installed irvine to help bcddd214, and compiled your code Sr RuiLoureiro and works fine, but need only a bit of modifications because Irvine uses non sensitive.
so, changing all MAXINDEX (uppercase) to MAXINDEX2 resolve this
and changing CRLF to CRLF1 too - Irvine uses the same in a call.
regards.

I have a 'MAX' but not a MAXINDEX?

RuiLoureiro

Quote from: mineiro on April 28, 2011, 09:07:52 PM
I have installed irvine to help bcddd214, and compiled your code Sr RuiLoureiro and works fine, but need only a bit of modifications because Irvine uses non sensitive.
so, changing all MAXINDEX (uppercase) to MAXINDEX2 resolve this
and changing CRLF to CRLF1 too - Irvine uses the same in a call.
regards.

mineiro,
           Ok  :U

RuiLoureiro

 mineiro,
          could you compile this ?
          Does this works ?
          Ok, thanks

TITLE   Strings
        INCLUDE Irvine32.inc

ShowStringT proto   :DWORD
ShowStringR proto   :DWORD

MAXLENGTH   equ 63
MAXLENGTH1  equ MAXLENGTH+1
MAX_INDEX   equ 5   ;100

MAX_BUFFER  equ MAXLENGTH1 * MAX_INDEX


.DATA
        Info1       db "Type your string ", 0
        Info2       db " :", 0
       
        Info3       db "Buffer or Table is full",13,10, 0
       
        AnyString   db MAXLENGTH1 + 5 dup (?)
        MyStrBuffer db MAX_BUFFER dup (?)
        MaxIndex    dd 0

                    dd 0
        TablePtr    dd MAX_INDEX dup (?)
       
        PtrBuffer   dd offset MyStrBuffer       ; current buffer pointer
        LastAddress dd 0
       
       _CRLF        db 13, 10, 0
.CODE
main        proc

            mov     eax, offset MyStrBuffer
            add     eax, MAX_BUFFER 
            mov     LastAddress, eax
           
            call    Clrscr ;clear the screen
           
    _next:  call    PrintInfo
            ;
            ; Read the string to AnyString
            ; ----------------------------
      mov     edx, offset AnyString ;the buffer that hold the string
      mov     ecx, MAXLENGTH      ;buffer size - 1
      call    ReadString       ;return in eax the number of chars typed
            ;
            cmp     eax, 0                ; EAX=length
            je      _exit                 ; if eax=0 then exit
            ;
            ; Put AnyString into MyStrBuffer
            ; ------------------------------
            mov     ecx, eax
            call    SetBuffer
            jnc     short _next           ; next string
            ;
            ; Error
            ; -----
            call    WaitMsg

;-------------*****------------------
;  Show each string one after another
;-------------*****------------------
    _exit:  call    Clrscr ;clear the screen

            invoke  ShowStringT, addr TablePtr

            mov     edx, offset _CRLF
            call    WriteString

            invoke  ShowStringR, addr TablePtr

            call    WaitMsg
            exit
main        endp
;------------------------------
PrintInfo   proc

            mov     edx, offset Info1
            call    WriteString

            mov     eax, MaxIndex
            add     eax, 1
            mov     MaxIndex, eax
           
            call    WriteInt
            ;
            mov     edx, offset Info2
            call    WriteString
            ret
PrintInfo   endp
;------------------------------
;       PtrBuffer   - next destination address
;       TablePtr    - table of pointers
;
SetBuffer   proc
            push    esi
            push    edi

            mov     edi, offset TablePtr
            mov     eax, dword ptr [edi - 4]
            add     eax, 1
            cmp     eax, MAX_INDEX
            ja      _exit                           ; there isnt table
            ;
            mov     edx, LastAddress
            sub     edx, PtrBuffer
            cmp     edx, ecx
            jbe     _exit                           ; there isnt buffer

            mov     edx, PtrBuffer                  ; destination
            mov     dword ptr [edi - 4], eax        ; eax=number of pointers
            sub     eax, 1
            mov     dword ptr [edi + eax*4], edx
            ;
            mov     edi, PtrBuffer                  ; destination           
            mov     esi, offset AnyString           ; source
                       
            mov     byte ptr [edi + ecx], 0         ; null terminated string
            mov     edx, ecx                        ; save ECX           
            ;
            ; copy from last to first
            ; »»»»»»»»»»»»»»»»»»»»»»»
    @@:     sub     ecx, 1
            movzx   eax, byte ptr [esi + ecx]
            mov     byte ptr [edi + ecx], al
            jnz     short @B           
            ;
            ; next buffer
            ; -----------
            add     edx, 1
            add     edx, edi
            mov     PtrBuffer, edx                  ; next destination
            clc           
            jmp     _end
           
    _exit:  mov     edx, offset Info3
            call    WriteString
            stc
           
    _end:   pop     edi
            pop     esi
            ret
SetBuffer   endp
;------------------------------
; Show the strings from first to last
; using the table of pointers
;
ShowStringT proc    pTbl:DWORD
            push    ebx
            push    esi
            ;
            xor     ebx, ebx                ; index
           
            mov     esi, pTbl
            mov     ecx, dword ptr [esi - 4]
            cmp     ecx, 0
            je      _end
            ;
    @@:     mov     edx, dword ptr [esi + ebx*4]
call    WriteString

            mov     edx, offset _CRLF
            call    WriteString
            ;
            add     ebx, 1                  ; next index
            sub     ecx, 1
            jnz     short @B
           
    _end:   pop     esi
            pop     ebx
            ret
ShowStringT endp
;------------------------------
; Show the strings from last to first
; using the table of pointers
;
ShowStringR proc    pTbl:DWORD
            push    esi
           
            mov     esi, pTbl
            mov     ecx, dword ptr [esi - 4]

    @@:     cmp     ecx, 0
            je      _end
            ;
            sub     ecx, 1
            mov     edx, dword ptr [esi + ecx*4]
call    WriteString

            mov     edx, offset _CRLF
            call    WriteString
            ;
            jmp     short @B
           
    _end:   pop     esi
            ret
ShowStringR endp
        END     main
       

mineiro

Yes Sr RuilLoureiro, works fine. Show the string in progressive and reversed order. :thumbu
regards.

RuiLoureiro

Quote from: mineiro on April 30, 2011, 09:33:07 PM
Yes Sr RuilLoureiro, works fine. Show the string in progressive and reversed order. :thumbu
regards.
mineiro,
            :thumbu Thank you  :U
       
        Now, i have installed Irvine.inc

        This code sort the strings

TITLE   Strings 3
        INCLUDE Irvine32.inc

ShowStringT proto   :DWORD
ShowStringR proto   :DWORD
StringSort  proto   :DWORD

MAXLENGTH   equ 63
MAXLENGTH1  equ MAXLENGTH+1
MAX_INDEX   equ 100

MAX_BUFFER  equ MAXLENGTH1 * MAX_INDEX


.DATA
        Info1       db "Type your string ", 0
        Info2       db " :", 0
       
        Info3       db "Buffer or Table is full",13,10, 0

        BufString   db MAXLENGTH1 + 5 dup (?)
        AnyString   db MAXLENGTH1 + 5 dup (?)
        MyStrBuffer db MAX_BUFFER dup (?)
        MaxIndex    dd 0

                    dd 0
        TablePtr    dd MAX_INDEX dup (?)
       
        PtrBuffer   dd offset MyStrBuffer       ; current buffer pointer
        LastAddress dd 0
       
       _CRLF        db 13, 10, 0
.CODE
main        proc

            mov     eax, offset MyStrBuffer
            add     eax, MAX_BUFFER 
            mov     LastAddress, eax
           
            call    Clrscr ;clear the screen
           
    _next:  call    PrintInfo
            ;
            ; Read the string to AnyString
            ; ----------------------------
      mov     edx, offset AnyString ;the buffer that hold the string
      mov     ecx, MAXLENGTH      ;buffer size - 1
      call    ReadString       ;return in eax the number of chars typed
            ;
            cmp     eax, 0                ; EAX=length
            je      _exit                 ; if eax=0 then exit
            ;
            ; Put AnyString into MyStrBuffer
            ; ------------------------------
            mov     ecx, eax
            call    SetBuffer
            jnc     short _next           ; next string
            ;
            ; Error
            ; -----
            call    WaitMsg

;-------------*****------------------
;  Show each string one after another
;-------------*****------------------
    _exit:  call    Clrscr ;clear the screen

            invoke  StringSort, addr TablePtr
           
           
            invoke  ShowStringT, addr TablePtr

            mov     edx, offset _CRLF
            call    WriteString

            invoke  ShowStringR, addr TablePtr

            call    WaitMsg
            exit
main        endp
;------------------------------
PrintInfo   proc

            mov     edx, offset Info1
            call    WriteString

            mov     eax, MaxIndex
            add     eax, 1
            mov     MaxIndex, eax
           
            call    WriteInt
            ;
            mov     edx, offset Info2
            call    WriteString
            ret
PrintInfo   endp
;------------------------------
;       PtrBuffer   - next destination address
;       TablePtr    - table of pointers
;
SetBuffer   proc
            push    esi
            push    edi

            mov     edi, offset TablePtr
            mov     eax, dword ptr [edi - 4]
            add     eax, 1
            cmp     eax, MAX_INDEX
            ja      _exit                           ; there isnt table
            ;
            mov     edx, LastAddress
            sub     edx, PtrBuffer
            cmp     edx, ecx
            jbe     _exit                           ; there isnt buffer

            mov     edx, PtrBuffer                  ; destination
            mov     dword ptr [edi - 4], eax        ; eax=number of pointers
            sub     eax, 1
            mov     dword ptr [edi + eax*4], edx
            ;
            mov     edi, PtrBuffer                  ; destination           
            mov     esi, offset AnyString           ; source
                       
            mov     byte ptr [edi + ecx], 0         ; null terminated string
            mov     edx, ecx                        ; save ECX           
            ;
            ; copy from last to first
            ; »»»»»»»»»»»»»»»»»»»»»»»
    @@:     sub     ecx, 1
            movzx   eax, byte ptr [esi + ecx]
            mov     byte ptr [edi + ecx], al
            jnz     short @B           
            ;
            ; next buffer
            ; -----------
            add     edx, 1
            add     edx, edi
            mov     PtrBuffer, edx                  ; next destination
            clc           
            jmp     _end
           
    _exit:  mov     edx, offset Info3
            call    WriteString
            stc
           
    _end:   pop     edi
            pop     esi
            ret
SetBuffer   endp
;------------------------------
; Show the strings from first to last
; using the table of pointers
;
ShowStringT proc    pTbl:DWORD
            push    ebx
            push    esi
            ;
            xor     ebx, ebx                ; index
           
            mov     esi, pTbl
            mov     ecx, dword ptr [esi - 4]
            cmp     ecx, 0
            je      _end
            ;
    @@:     mov     edx, dword ptr [esi + ebx*4]
call    WriteString

            mov     edx, offset _CRLF
            call    WriteString
            ;
            add     ebx, 1                  ; next index
            sub     ecx, 1
            jnz     short @B
           
    _end:   pop     esi
            pop     ebx
            ret
ShowStringT endp
;------------------------------
; Show the strings from last to first
; using the table of pointers
;
ShowStringR proc    pTbl:DWORD
            push    esi
           
            mov     esi, pTbl
            mov     ecx, dword ptr [esi - 4]

    @@:     cmp     ecx, 0
            je      _end
            ;
            sub     ecx, 1
            mov     edx, dword ptr [esi + ecx*4]
call    WriteString

            mov     edx, offset _CRLF
            call    WriteString
            ;
            jmp     short @B
           
    _end:   pop     esi
            ret
ShowStringR endp
; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
StringSort  proc    pTbl:DWORD
            push    ebx
            push    esi
            push    edi
           
            mov     esi, pTbl
            mov     ecx, dword ptr [esi - 4]
            cmp     ecx, 1
            jbe     _end

            sub     ecx, 1
            xor     ebx, ebx
   
    _loop1: invoke  Str_copy, [esi + ebx*4], addr AnyString
            invoke  Str_ucase, addr AnyString
            ;
            ; Next string
            ; -----------
            mov     edx, ebx
            ;
    _loop2: add     edx, 1
            cmp     edx, ecx
            ja      short _next
           
            invoke  Str_copy, [esi + edx*4], addr BufString
            invoke  Str_ucase, addr BufString
            ;
            ; compare
            ; -------
            invoke  Str_compare, addr AnyString, addr BufString
            jbe     short _loop2
            ;
            ; change
            ; ------
            mov     eax, dword ptr [esi + ebx*4]           
            mov     edi, dword ptr [esi + edx*4]
           
            mov     dword ptr [esi + ebx*4], edi           
            mov     dword ptr [esi + edx*4], eax
            jmp     _loop1
            ;
    _next:  add     ebx, 1
            cmp     ebx, ecx
            jb      _loop1           

    _end:   pop     edi
            pop     esi
            pop     ebx
            ret
StringSort  endp
;---------------------------------------
        END     main