NASM-printf不打印第一个字符

祖玛洛

我想编写一个返回您编写的字符串的程序。但是它始终打印时不带第一个字符。此外,它不会返回超过第一个空格的任何内容。

例子:

IN: test
OUT: est

代码:

extern printf, scanf, exit
global main

section .text
main:
    push rbp
                            ;input of string
    mov rdi, format
    mov rsi, string
    mov rax, 0
    call scanf

                            ;output of string
    mov rdi, format_out
    mov rsi, qword [string]
    mov rax, 0
    call printf
_exit:                        ;end of program
    pop rbp
    call exit

section .data
  format     db "%s", 0
  string     db 0
  format_out db "You wrote: %s", 0

我注意到,如果我更改string db 0string db“,则显示错误,但程序正常运行,将整个句子打印到第一个空格。不幸的是,我不知道该信息的处理方法。感谢您的回答。

彼得·科德斯

printf("%s", ...)需要一个指针arg,但是您要向其传递字符串内容的前8个字节。使用mov rsi, string得到一个MOV,即时的,而不是mov rsi, [string](这是一个负荷)。

(或节省2个代码字节,mov esi, string因为在默认代码模型中保证静态地址可以容纳32位。)


正如评论中指出的那样,您的静态缓冲区太小。由于格式字符串没有大小限制,因此您需要一个无限大小的缓冲区,以避免长输入行将其溢出的任何风险。

但是,让我们假设1024B缓冲区足够安全。或者更好地使用,%1023s这样可以保证足够。我们不希望在可执行文件中包含1024B的零。那真是愚蠢。因此,我们应该在BSS中保留1024B:

section .rodata
  format:     db "%1023s", 0         # actually set a size limit, leaving room for the \0
  format_out: db "You wrote: %s", 0

section .bss
  string:     resb 1024              # RESERVE 1024 bytes.  Only works in .bss

没有理由:在数据上省略后标签名称,而没有理由

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在NASM x86_64 Linux Assembly中将字符串中的一个字符与另一个字符进行比较

来自分类Dev

如何在NASM x86_64 Linux Assembly中将字符串中的字符与另一个字符进行比较

来自分类Dev

Python ctypes 如何从传递给 NASM 的字符数组中读取一个字节

来自分类Dev

Twitter趋势列表打印第一个字符而不是第一个字符

来自分类Dev

在NASM中打印一个负数

来自分类Dev

指针的第一个字符

来自分类Dev

如何打印第一个字符的地址?

来自分类Dev

C ++ fprintf只打印第一个字符串

来自分类Dev

为什么该程序只打印第一个字符?

来自分类Dev

C ++ fprintf只打印第一个字符串

来自分类Dev

读取多维数组仅打印子数组的第一个字符

来自分类Dev

使用mysqlcursor覆盖第一个字符的Python打印功能

来自分类Dev

无法打印代码的第一个和最后一个字符

来自分类Dev

使用 lseek 时不打印第一个字节

来自分类Dev

转换数组元素为字符串并打印第一个字符?

来自分类Dev

打印字符串的第一个字符会导致分段错误

来自分类Dev

如何返回并打印出第一个字符串(string1)的起始地址?

来自分类Dev

终端打印出第一个字符后,scanf不起作用

来自分类Dev

Sed / Awk脚本可根据第一个字符打印字段

来自分类Dev

使用 putchar() 和 tolower() 或 toupper() 打印 AZ 在第一个字符处停止循环

来自分类Dev

如果第一个字符为 0,则替换字符串的第一个字符

来自分类Dev

在字符串的第一个字符之后插入字符?

来自分类Dev

在Laravel中读取数组的第一个记录而不是第一个字符

来自分类Dev

删除数组的第一个索引的第一个字符?

来自分类Dev

NASM,读取文件并打印内容

来自分类Dev

不使用printf在NASM中打印ARGC

来自分类Dev

字符串小写的第一个字符-C#

来自分类Dev

快速获取字符串第一个字符的方法?

来自分类Dev

在作为字母的字符串中查找第一个字符

Related 相关文章

  1. 1

    如何在NASM x86_64 Linux Assembly中将字符串中的一个字符与另一个字符进行比较

  2. 2

    如何在NASM x86_64 Linux Assembly中将字符串中的字符与另一个字符进行比较

  3. 3

    Python ctypes 如何从传递给 NASM 的字符数组中读取一个字节

  4. 4

    Twitter趋势列表打印第一个字符而不是第一个字符

  5. 5

    在NASM中打印一个负数

  6. 6

    指针的第一个字符

  7. 7

    如何打印第一个字符的地址?

  8. 8

    C ++ fprintf只打印第一个字符串

  9. 9

    为什么该程序只打印第一个字符?

  10. 10

    C ++ fprintf只打印第一个字符串

  11. 11

    读取多维数组仅打印子数组的第一个字符

  12. 12

    使用mysqlcursor覆盖第一个字符的Python打印功能

  13. 13

    无法打印代码的第一个和最后一个字符

  14. 14

    使用 lseek 时不打印第一个字节

  15. 15

    转换数组元素为字符串并打印第一个字符?

  16. 16

    打印字符串的第一个字符会导致分段错误

  17. 17

    如何返回并打印出第一个字符串(string1)的起始地址?

  18. 18

    终端打印出第一个字符后,scanf不起作用

  19. 19

    Sed / Awk脚本可根据第一个字符打印字段

  20. 20

    使用 putchar() 和 tolower() 或 toupper() 打印 AZ 在第一个字符处停止循环

  21. 21

    如果第一个字符为 0,则替换字符串的第一个字符

  22. 22

    在字符串的第一个字符之后插入字符?

  23. 23

    在Laravel中读取数组的第一个记录而不是第一个字符

  24. 24

    删除数组的第一个索引的第一个字符?

  25. 25

    NASM,读取文件并打印内容

  26. 26

    不使用printf在NASM中打印ARGC

  27. 27

    字符串小写的第一个字符-C#

  28. 28

    快速获取字符串第一个字符的方法?

  29. 29

    在作为字母的字符串中查找第一个字符

热门标签

归档