当前位置: 首页 > 面试题库 >

汇编:printf不打印新行

子车修平
2023-03-14
问题内容

我有以下代码可以打印传递给的参数数量./main。请注意fmtrodata部分中的。我已经包括了新行\n,就像 C中一样
,但是它不是打印新行而是打印:

参数数量:1 \ n

我的代码是:

;main.asm
GLOBAL main
EXTERN printf

section .rodata:
fmt db "Number of parameters: %d \n", 0

section .text:

main:

    push ebp
    mov ebp, esp    ;stackframe

    push dword[ebp+8]       ;prepara los parametros para printf
    push fmt
    call printf
    add esp, 2*4

    mov eax, 0      ;return value

    leave           ;desarmado del stack frame
    ret

我知道在0和“ Number …”之后包含10 fmt将打印它,但我想printf这样做。我用 NASM 汇编代码,然后通过 GCC
将其链接以创建我的可执行文件。


问题答案:

当您在 NASM中 对字符串使用双引号或双引号时,它不接受 C 样式转义序列。在Linux上,您可以这样编码\n为ASCII 10:

fmt db "Number of parameters: %d", 10, 0

还有一种选择。 NASM 支持反引号(反引号),这允许 NASM 将它们之间的字符作为 C 样式转义序列进行处理。这也应该工作:

fmt db `Number of parameters: %d \n`, 0

请注意:这些不是单引号,而是 反引号
。NASM文档中对此进行了描述:

3.4.2字符串

字符串最多由八个字符组成,这些字符包含在单引号(’…’),双引号(“
…”)或反引号(...)中。单引号或双引号等效于NASM(当然,用单引号引起来的常量可以使双引号出现在反引号中,反之亦然);这些内容按原样表示。
用反引号引起来的字符串支持C样式的特殊字符转义



 类似资料:
  • 本文向大家介绍汇编语言实现打印杨辉三角,包括了汇编语言实现打印杨辉三角的使用技巧和注意事项,需要的朋友参考一下 计算杨辉三角形的前n(n<=10)行,并显示在屏幕上。要求计算及显示 用子程序形式实现。其显示格式为: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 在这个链接中,rustyx提到他使用了一个调试虚拟机和以下标志来获取java字节码的汇编指令 我用sudo apt get install openjdk-17-dbg安装了调试虚拟机 我使用命令java-XX:UnlockDiagnosticVMOptions-XX:PrintAssembly Main 我习惯用C和gdb来完成这项工作,但无法用java来完成。printAssembly只打印指

  • 我正在尝试在macOS上的汇编x86_64中打印整数。我已经知道大约有3/4的答案,但我无法解决我的问题。 现在,我会满意地把它倒着印出来。这是代码: mov rax,123;将数字移动到rax寄存器中 调用get_backwards过程 除法和mult需要两个寄存器,一个用于商,一个为余数。对剩余部分进行异或运算,以便清除所有垃圾。 mov转换为rcx,10,这样我就可以得到与数字的最后一位相对

  • 问题内容: 在Python 2中,我使用了: 我试过了: 问题答案: 在Python2中,是一个引入了以下语句的关键字: 在Python3中,是可以调用的函数: 在这两个版本中,都是一个运算符,它在左侧需要一个字符串,在右侧需要一个值或一个值的元组或一个映射对象(如)。 因此,您的行应如下所示: 另外,对于Python3和更高版本,建议使用-style格式而不是-style格式: Python 3

  • 我试图在x86_64汇编中打印一个浮点数,但它只是将值打印为零。 关于这一点已经有几个问题了。一个问题似乎通过确保您设置在%al中使用的向量寄存器的数量得到了解决。另一个表明您需要16个字节的堆栈对齐。但是,我正在做这两件事,但仍然没有得到正确的输出。 这是我的程序:

  • 问题内容: 我尝试从我的汇编代码中使用,这是一个最小示例,应仅打印到stdout: 我用 当我运行它时,它似乎可以正常工作:该字符串已打印出来,退出状态为: 但是当我尝试捕获文本时,很明显,某些功能无法正常工作: 该变量应具有值,但为空。 我的用法有什么问题? 问题答案: 使用 诸如printf之类的stdio函数后,请使用而不是原始syscall。 正如Michael解释的那样,可以动态链接C库