跳转到内容

从零开始制作编程语言/数组

来自维基教科书,开放的书籍,为开放的世界

数组声明

[编辑 | 编辑源代码]

数组声明通常与所有其他简单变量一起完成。数组声明的格式本质上是对简单变量声明格式的扩展。

[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
华夏公益教科书