我很大程度上只是在寻找反馈和指导,而不是直接的答案。
使用.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过程(他提供给我们)的单个调用来打印这种类型的格式化字符串,该过程查找要设置为\0
终止的字节数组的esi
。
发布于 2011-03-28 07:45:24
您假设您的输出将进入用于指定格式的同一个缓冲区--C printf()
例程不会这样做。还要认识到,由格式说明符引起的转换不需要占用输出中与格式说明符相同的字符数。例如,printf()
说明符%s
可以在输出中占用2个以上的字符(也可以使用少于2个字符)。
您可以让汇编例程执行与C例程相同的操作-格式字符串被输入到函数(并且不会被修改),就像格式字符串所指定的要转换的项一样。该函数产生的输出会转移到其他地方--要么是发送数据到文件或设备的输出例程,要么是调用者提供的内存缓冲区。
当函数遍历格式字符串时,它可以决定字符是否需要不变地进入输出(即,格式字符串中不是格式说明符的字符)。当涉及到格式说明符时,它将使用另一个输入参数,根据格式说明符进行转换,并将这些字符发送到输出。
https://stackoverflow.com/questions/5453107
复制相似问题