如何获取存储在字符串中的输入 - 程序集

How To Get Input That Is Stored In A String - Assembly

提问人:Merd Ceferzade 提问时间:7/25/2023 最后编辑:Merd Ceferzade 更新时间:7/25/2023 访问量:37

问:

我想编写一个程序集代码,打印“Hello, World!”,然后读取用户的输入,然后打印该输入。获取输入是正确的,但我无法打印它(或打印旧值)。 法典:

.global _start
.intel_syntax noprefix

_start:

    # Write
    mov rax, 1          # syscall number for sys_write
    mov rdi, 1          # file descriptor 1 (stdout)
    lea rsi, load_msg   # pointer to the message to be written
    mov rdx, 14         # message length
    syscall

    # Read
    mov rax, 0          # syscall number for sys_read
    mov rdi, 0          # file descriptor 0 (stdin)
    lea rsi, read_msg   # pointer to the buffer to store user input
    mov rdx, 255        # maximum number of bytes to read
    syscall

    # Write
    mov rax, 1          # syscall number for sys_write
    mov rdi, 1          # file descriptor 1 (stdout)
    mov rdx, rax 
    syscall             # writing the user input to the standard output

    # Exit
    mov rax, 60         # syscall number for sys_exit
    mov rdi, 0          # exit code 0
    syscall

load_msg:
    .asciz "Hello, World!\n"

read_msg:
    .space 256

装配 输入 输出

评论

0赞 ecm 7/25/2023
mov rdx, rax应该在之前mov rax, 1
0赞 Merd Ceferzade 7/25/2023
@ecm 是的,但这不会改变结果
2赞 ecm 7/25/2023
您可能需要切换部分才能获得可写缓冲区read_msg
1赞 Peter Cordes 7/25/2023
@ecm:没错,GAS 默认为该部分,即 read+exec,但不是 write。 除非有其他错误,否则应显示返回。OP 声称“获取输入是正确的”,但似乎没有与调试器进行检查。此外,LEA 应该是相对于 RIP 的,否则使用 LEA 就没有意义了。如何将函数或标签的地址加载到寄存器中。但是,如果这实际上是一个问题(在PIE中),则会出现链接错误。.textstrace ./a.outread-EFAULTlea rsi, [RIP + read_msg]

答: 暂无答案