当前位置: 首页 > 知识库问答 >
问题:

从标准输入读取Windows程序集(x86)并输出到标准输出

相洛华
2023-03-14

我最近想出了如何在汇编中写入 stdout,但现在无法从 stdin 中读取,并将我读取的内容输出回 stdout。这是我到目前为止的代码:

.386
.model flat, stdcall

WriteFile PROTO STDCALL:DWORD, :PTR, :DWORD, :PTR DWORD, :PTR OVERLAPPED
ReadFile  PROTO STDCALL:DWORD, :PTR, :DWORD, :PTR DWORD, :PTR OVERLAPPED
GetStdHandle PROTO STDCALL:DWORD
.data


.data?
input DW ?
input_size DD ?
read DD ?

.code
main:
    INVOKE GetStdHandle, -10
    INVOKE ReadFile, eax, OFFSET input, input_size, read, 0
    INVOKE GetStdHandle, -11
    INVOKE WriteFile, eax, OFFSET input, OFFSET input_size, read, 0
    RET 
END main

我很确定我看错了。我很确定input_sizeread的行为没有达到预期(如果我将 替换为 次),这是导致我的问题的原因(当我输入输入并点击return时,它什么也不显示)。

我已经摸索了一段时间了,希望能得到任何帮助。(我这么做只是为了了解这不是家庭作业)。

我的问题本质上是我做错了什么?

共有1个答案

顾宏朗
2023-03-14

您只为输入缓冲区分配了两个字节:

input DW ?

您的输入大小为零,导致ReadFile最多读取0个字节:

input_size DD ?

nNumberOfBytesToRead 应作为值而不是指针传递。并且您希望写入与读取文件中输入的字节数一样多的字节:

INVOKE WriteFile, eax, OFFSET input, OFFSET input_size, read, 0
INVOKE WriteFile, eax, OFFSET input, read, read, 0
 类似资料:
  • 本文向大家介绍OCaml 从标准输入读取并打印到标准输出,包括了OCaml 从标准输入读取并打印到标准输出的使用技巧和注意事项,需要的朋友参考一下 示例 我们准备一个包含reverser.ml以下内容的文件: 然后,我们使用以下命令编译程序: 我们通过将数据传递到新的可执行文件进行测试: 该reserver.ml程序以命令式风格编写。虽然命令式样式很好,但是将其与功能翻译进行比较很有趣: 由于引入

  • 回顾一下我们写的第一个 Rust 程序就是带副作用的,其副作用就是向标准输出(stdout),通常是终端或屏幕,输出了 Hello, World! 让屏幕上这几个字符的地方点亮起来。println! 宏是最常见的输出,用宏来做输出的还有 print!,两者都是向标准输出(stdout)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用

  • 问题内容: 我为IA32编写了以下汇编脚本。应该从stdin读取一个数字,将其递增并打印到stdout,但是它的行为不符合预期,它不会打印任何内容(也许从stdin的读取不会终止,或者打印有问题吗?) 看到错误了吗?对于任何帮助,我要先感谢您, 祝一切顺利,西蒙 问题答案: 这部分都是错误的。您无法将读取结果存储在寄存器中。这实际上是在将结果存储在%edi中包含的地址中,由于您没有设置它,所以可能

  • 问题内容: 如何使用Go中的函数从标准输入获取整数输入? 如果使用无法完成此操作,那么读取单个整数的最佳方法是什么? 问题答案: http://golang.org/pkg/fmt/#Scanf Go中包含的所有库都有充分的文档记录。 话虽如此,我相信 绝招

  • 我是Java的初学者。学习罗伯特·塞奇威克的《Java导论》 我尝试在Netbeans中编译以下代码。 } 我收到了这个错误。我已将文件放置在标准位置。java 线程“main”java.lang.RuntimeException中的异常:无法编译的源代码-错误的sym类型:示例。StdIn.is在示例中为空。verage.main(verage.java:16)Java结果:1 BUILD SU

  • 问题内容: 我有一个应该调用ruby脚本的go程序。 我有一个功能: 我这样调用它: 它适用于大多数情况,除非子进程中有一个或任何类似的操作需要暂停输入。 我已经尝试设置,但是它不等待输入。 我究竟做错了什么? 问题答案: 下面的程序好像你问什么(我几乎等同于你的。我只是改变了到了线。)你在做一些不同的东西?