如何在汇编程序中实现类似printf的功能?

时间:2011-03-27 23:06:33

标签: assembly

我非常只是寻求反馈和指导,而不是直接回答。

使用.586汇编程序指令,如何模拟类似printf的功能?对于固定宽度的字段,我知道我可以这样做:

.data
  Format BYTE 'You are ## years old.',0

然后在打印字符串之前,只需将##值替换为适当的数字,然后将其更改回来,以防我需要多次使用不同值的格式字符串。

这可能不是最好的方法,但现在可行。

如果您不知道提前的位数,我无法弄清楚如何做到这一点。如果您知道要使用的最大位数,格式选项就可以了(上面的例子对于100岁及以上的人来说不会很好,你会丢失单词之间的空格)。

如果你保留了太多的空间,你的数字和世界之间会有两倍的空间。

.data
  Format BYTE 'You are ### years old.',0

将我的计划与12岁的人一起使用会产生:

You are  12 years old.

我唯一的想法是碰巧有一个ASCII字符,什么都没有打印(除了\0),但它似乎很俗气。

整个问题出现是因为教师希望我们能够使用对PrintString程序(他提供给我们)的单个调用来打印这种类型的格式化字符串,该程序查找要设置为esi的{​​{1}} {1}}终止字节数组。

3 个答案:

答案 0 :(得分:1)

那么,您应该能够计算运行时所需的位数。那么你有很多选择:

  • 事先分配最大空间,然后向左移动字符串的部分,以便不留下多余的空格。

  • 仅使用一个空格,然后扩展&将你的字符串向右移动以根据需要添加更多空间。我认为你有一些内存管理问题,但是......

答案 1 :(得分:1)

您假设您的输出将与用于指定格式的缓冲区相同 - C printf()例程不会这样做。还要意识到格式说明符引起的转换不需要在输出中占用与格式说明符相同数量的字符。例如,printf()说明符%s在输出中占用的字符数远远超过2个字符(或者可以使用少于2个字符)。

您可以让您的汇编例程执行与C例程相同的操作 - 格式字符串输入到函数(并且不会被修改),格式字符串指定的要转换的项也是如此。函数产生的输出到达其他地方 - 或者是将数据发送到文件或设备的输出例程,或者是调用者提供的内存缓冲区。

当函数遍历格式字符串时,它可以决定字符是否需要不变地进入输出(即,格式字符串中不是格式说明符的字符)。当涉及格式说明符时,它将使用另一个输入参数,根据格式说明符转换它,并将这些字符发送到输出。

答案 2 :(得分:0)

首先为每种数据类型定义转义序列,例如“%f”,并将它们放入键值对表中。然后将任务拆分为以下子例程:

  • 一个 indexOf 例程,它接受一个指向字符串缓冲区的指针和一个起始索引。它搜索您从起始索引定义的转义序列之一,并在找到转义序列时返回它的索引,如果没有找到则返回-1。

  • 每种数据类型的打印函数,一个用于整数,无符号整数,浮点数等...按值获取数据并将其打印到屏幕上。

  • printf 函数获取指向字符串缓冲区的指针以及要插入的数据并将其打印到屏幕上。

在printf中,创建一个循环,用indexOf搜索转义序列。如果找到,则打印源字符串,直到indexOf返回索引。使用表格识别数据类型,然后使用相应的打印功能打印数据。在转义序列之后再次从新索引开始循环搜索。循环直到到达源字符串的末尾。完成。无需动态分配任何内存。