stringassemblyx86masmundefined-symbol

What does "undefined symbol: stringread" mean?


I'm working on a big project for my college class.

I put a string/array in the .data section like this:

stringread BYTE DUP(STRSIZE)

And in main I have:


push OFFSET stringread
push esi
call ReadFileLine
pop esi
pop OFFSET stringread

But I get this error:

undefined symbol: stringread

I think my problem is that I didn’t declare the string correctly.

At first I thought maybe I wasn’t allowed to push strings directly onto the stack like that, but I looked at my professor's example code and he had something similar:

array DWORD 1,2,3,4,5
push OFFSET array

EDIT: I replaced the declaration with this, which seems to have fixed it:

stringread BYTE STRSIZE DUP(?)

Solution

  • stringread BYTE DUP(STRSIZE)
    

    For MASM this line is syntactically wrong. As a consequence what would normally be considered a label, didn't get recognized that way and so the symbol stringread was reported 'undefined' once you used it on the line push OFFSET stringread in main.
    The DUP operator needs to be told how many duplications you need. Looking at DUP(STRSIZE) it would seem that you erroneously have placed the repeat count between the parenthesis. One solution could be:

    stringread BYTE STRSIZE DUP(0)
    
    push OFFSET stringread
    push esi
    call ReadFileLine
    pop esi
    pop OFFSET stringread
    

    OFFSET stringread is a so-called 'immediate' aka just a number. While you can push an immediate, you can not pop an immediate!
    You can remove the pushed value either through