我想编写一个返回您编写的字符串的程序。但是它始终打印时不带第一个字符。此外,它不会返回超过第一个空格的任何内容。
例子:
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 0
为string 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] 删除。
我来说两句