我最近在我的一个汇编文件的顶部看到了这个,并意识到我在打印整数的过程中花了很多时间使用它而没有真正意识到它最初来自哪里(在我的基本汇编模板中使用)或10 ,0结尾意味着:
section .data
intfmt: db "%d", 10, 0
有没有人可以解决这个问题并解释不同的组件,特别是第2行?
我现在正在尝试使用scanf读取输入,似乎此格式无法正常工作。想想是时候我才知道这些数字意味着什么!
另外,如果您对使用scanf在64位架构上读取输入有任何想法,我之前没有这样做,这会导致我出现一些问题,所以任何指向这样做的指针也会受到赞赏!
答案 0 :(得分:5)
intfmt:
是一个标签 - 它可以是任何字符串,但其他代码引用它。
db
是“定义字节”伪指令。它不是组装机器代码指令,而是将原始字节转储到代码流中(在本例中为.data部分)。
"%d", 10, 0
是要转储到流中的字节。第一个是ascii字符串,它转储两个字节(字符'%'和'd'),10
是换行符(C中为\n
),0是空字节。 / p>
请注意,字符串是一个原始字符串 - 不是nul终止,并且不支持任何C样式转义(如换行符\n
)。总的来说,这会创建一个与C字符串“%d \ n”相当的东西,带有换行符和NUL终止符。
现在至于为什么这适用于printf而不是scanf(以及为什么在你删除10时切换)与printf和scanf的工作原理以及换行对每个工作的含义有关。
在printf中,换行符打印换行符然后(如果输出处于行缓冲模式,它可能是),刷新内部输出缓冲区,以便您可以实际看到结果。所以当你删除10时,没有刷新,你看不到输出。
在scanf中,换行符的意思是“读取并丢弃字符,直到达到非空白字符”,然后将该字符作为下一个要读取的字符。因此,如果您在终端输入上执行scanf(例如),换行将导致它阻塞,直到您在数字后输入非空白行...