计算字符串长度
为什么我们需要计算字符串的长度?
sys_write要求我们向它传递一个指针,指向我们想要在内存中输出的字符串,以及我们想要输出的字节长度。如果要修改消息字符串,我们也必须以字节为单位更新传递给sys_write的长度,否则它将不能正确打印。
你可以通过第二课的程序了解我的意思。修改信息字符串,说“你好,美丽的新世界!”'然后编译、链接并运行新程序。输出将是'Hello, brave '(前13个字符),因为我们仍然只向sys_write传递13个字节作为其长度。当我们想要打印用户输入时,这将是特别必要的。由于我们在编译程序时不知道数据的长度,因此需要一种方法在运行时计算长度,以便成功打印出来。
写我们的程序
要计算字符串的长度,我们将使用一种称为指针算术的技术。两个初始化寄存器指向内存中相同的地址。对于输出字符串中的每个字符,一个寄存器(在本例中是EAX)将向前递增一个字节,直到到达字符串的末尾。然后从EAX中减去原始指针。这实际上类似于两个数组之间的减法,结果生成两个地址之间的元素数。然后将这个结果传递给sys_write,替换我们的硬编码计数。
CMP指令将左手边与右手边进行比较,并设置一些用于程序流的标志。我们要检查的标志是ZF或者零标志。当EAX指向的字节等于0时,就设置ZF标志。然后,如果设置了ZF标志,我们使用JZ指令跳转到程序中标记为“finished”的点。这是为了跳出nextchar循环并继续执行程序的其余部分。