【问题标题】:Meaning of intfmt: db "%d", 10, 0 in assemblyintfmt 的含义:db "%d", 10, 0 在程序集中
【发布时间】:2011-12-12 19:48:30
【问题描述】:

我最近在我的一个汇编文件的顶部看到了这个,并意识到我在打印整数的过程中使用了很长时间,却没有真正意识到它最初来自哪里(在我的基本汇编模板中使用)或者 10 , 0 表示:

section .data
    intfmt: db "%d", 10, 0

谁能分解并解释不同的组件,特别是第 2 行的组件?

我现在正在尝试使用 scanf 读取输入,但这种格式似乎无法正常工作。想想我是时候了解这些数字的含义了!

另外,如果您对使用 scanf 在 64 位架构上读取输入有任何想法,我以前没有这样做过,这给我带来了一些问题,所以任何指向这样做的指针也将不胜感激!

【问题讨论】:

  • 这是什么架构?您应该在此处标记它,因为每个架构都有自己的机器/汇编语言,即使在特定架构中,也可能有许多汇编语法取决于使用的汇编器
  • 格式字符串和其他只读数据应该放在.rodata部分,这样它们就可以与其他只读数据一起进入映射共享的页面,而不是私有页面。

标签: assembly 64-bit scanf


【解决方案1】:

intfmt: 是一个标签——它可以是任何字符串,但其他代码引用它。

db 是“定义字节”伪指令。它不是组装机器代码指令,而是将原始字节转储到代码流中(在本例中为 .data 部分)。

"%d", 10, 0 是要转储到流中的字节。第一个是 ascii 字符串,转储两个字节(字符 '%' 和 'd'),10 是换行符(C 中的\n),0 是空字节。

请注意,该字符串是一个原始字符串——不是以 nul 结尾的,并且不支持任何 C 样式的转义(例如 \n 换行符)。因此,总的来说,这会创建与带有换行符和 NUL 终止符的 C 字符串 "%d\n" 等效的内容。

现在,为什么这适用于 printf 而不适用于 scanf(以及为什么如果删除 10 会切换)与 printf 和 scanf 的工作方式以及换行符对它们各自的意义有关。

在 printf 中,换行符打印一个换行符,然后(如果输出处于行缓冲模式,它可能是)刷新内部输出缓冲区,以便您可以实际看到结果。因此,当您删除 10 时,没有刷新,您也看不到输出。

在 scanf 中,换行符的意思是“读取并丢弃字符,直到到达非空白字符”,将该字符留作下一个要读取的字符。因此,如果您在终端输入上执行 scanf(例如),则换行符将导致它阻塞,直到您在数字后输入非空行...

【讨论】:

    猜你喜欢
    • 2014-03-11
    • 2019-09-28
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2010-12-12
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多