刚学微机原理没多长时间,碰到以下几个问题,望各位行家解释一下原因,谢谢

问题一:对于命令 ADD [SI],30H  在运用masm进行编译时,出现严重错误,说:‘operand must have size’, 也就是格式不匹配喽,为什么呢?难道程序不知道[SI]所对应内存单元的数据类型,必须用后面的源操作数确定,但是立即数又不知道是什么数据类型么?
类似还有INC,清华大学那本《微型计算机原理及运用》上在举例时,这样处理:INC BYTE PTR[BX+DI+500],为什么强制转换数据类型呢?同上么?

问题二:对于这样定义的数据段变量,"BUFFER DB 10 DUP(?),'$'"存入数据后,进行9号系统功能调用,也就是字符串输出时,为什么输出的是乱码呢?而且是一大片乱码,不是10位。难道字符串存入内存的格式和上面定义的格式有不同么?谢谢