从零开始制作编程语言/数组
外观
数组声明通常与所有其他简单变量一起完成。数组声明的格式本质上是对简单变量声明格式的扩展。
[format as for simple declarations][,][name of variable]['[' or ',' or ';' or '='][if '[' size of array (constant)][']'][value of array][next declaration]
示例
int a,b,arr[5],arr2[5]=(1,2,3,4,5);
(请注意,由于我们指定了 '{' 作为终止字符,因此我们将常见的 '{' 替换为 '('。如果你还没有这样做,你也可以使用大括号。)
该算法是对先前算法的延续,其中添加了以下步骤,用于检查数组变量并正确处理它们。
1. Get name. 2. If next character be [ then until the character be ] input character and store it in the index variable . 3. If next character be , or ; then write to data? section : [Name] [index] dup ? 4. Else add one character and then get character until character be ). Then write to data section: [name] [value]
dup 关键字将复制 ? 或 0 值,用于所有成员,而无需单独初始化每个成员。
字符串的初始化方式不同于其他数组变量,它们可以在一块中使用“and”同时声明。此外,字符串总是以字符 0(或 '\0')结尾。以下算法要追加到之前的算法中。
仅用于字符串的算法
1. if character after char array declaration not be'=' continue with rest of parent algorithm. 2. add one to index.(skip ") 3. while character not " get character and store in array. 4. write to .DATA section: [name] byte "[value]",0
请注意,一些汇编程序可能对初始化字符串的实际大小设置限制(在 MASM 6.1 中,它是 255 字节或 255 个单独的字符)。请注意,初始化字符串的大小仅为提供的值的大小,即在以下示例中
char str[50]="hello";
数组 str 的大小只有 5+1 或 6 个字符。
必须引用数组才能使其有用。数组的引用格式如下。
[...expression][array name][index of variable][...expression]
但是,汇编语言不接受此格式。此外,它将索引作为起始地址后的字节数,而不是起始地址后的变量数。
汇编语言中的格式
[...instruction][array name][number of bytes after starting][...instruction]
此外,索引不能是内存变量,而必须是寄存器或常量。
解决方案是以下一组指令
mov ebx,[index variable(can be a constant also)] [assignment instruction to register of type of array][array name] /[ebx * type array]/ [assignment instruction to arr[ANUM] (increment ANUM) from register used above]
'/' 表示 '[' 的差异使用(此处,'/' 后面的括号需要复制到代码中)
引用算法(在检测到数组变量时或在指令到达后立即执行)
1. While character not '[' and not ';' and not '{' increment index. 2. If character be ';' or '{' end process. 3. While character not ']' get character and store in array. 4. Get name of array. 5. Use format as given above. 6. Replace reference by arr[ANUM-1] 7. Repeat step 1