Microsoft KB Archive/12043

Error 35: Operand Must Have Size ID Number: Q12043

4.00 MS-DOS

Problem:

In the following program, the assembler gives “error 35: Operand must have size”:

code1 segment para public 'code' assume cs:code1 mov ds:[28H],offset prog1 prog1: c1 ends In the following program, the assembler again gives “error 35: Operand must have size”:

code2 segment para public 'code' assume cs:code2 mov ds:[28h],offset prog2 org 0ffh prog2: code2: ends However, the assembler does not give an error message with the following program:

code3 segment para public 'code' assume cs:code3 mov ds:[28h],offset prog3 org 100h prog3: code3 ends It seems that MASM generates an error 35 if the offset of prog relative to the beginning of the segment is less that 256 bytes. Nevertheless, I have the following workaround:

code4 segment para public 'code' assume cs:code4 mov word ptr ds:[28h],offset prog4 prog4: code4 ends Response:

In the following, your program statement is calculating the offset from the beginning of your code segment to the label prog2:, then placing that value into the location to which ds:28h points:

mov ds:[28h],offset prog2 By generating “error 35: Operand must have size,” the assembler is complaining that you told it to move this offset, but you did not indicate the size of the offset. Your workaround to this problem is the correct code; however, you must indicate the size of the offset as follows:

mov byte ptr ds:[28h],offset prog2

The ORG directive moves the next command down the indicated number of bytes. For example, in your second program you are moving the prog2 label down 099h bytes. By doing so, you are increasing the size of the offset by 099h bytes.

The assembler is working correctly when it gives you an error in the first two example programs, complaining that you did not indicate the size of the data you want moved.

The reason that you do not get this error in your third example is that the assembler determines the size of the data you want to move from the program context, without the “byte ptr” directive. Because you are moving the prog3: label 100H bytes away, the assembler knows that you are adding 100h words to the offset; it also knows that you have to be moving a word into ds:[28h] because the offset is at least one word in size. Thus, the assembler no longer gives you the error message.

The assembler gives you an error unless it has enough information to determine what you want to do.

Page 96 of the “Microsoft Macro Assembler Reference” manual states the following:

“Many assembly-language program listings in books and magazines are written for assemblers with weak typing for operands. These programs may produce error messages such as”Illegal size for item&quot; or “Operand types must match” when assembled as listed using the Microsoft Macro Assembler. You can correct lines that product errors by using the PTR operator to assign the correct size to variables.&quot;