Windows程序集(x86)从Stdin读取并输出到Stdout

时间:2012-10-04 14:13:49

标签: windows assembly x86 stdout stdin

我最近想出了如何在汇编中写入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的行为不符合预期(如果我将input_size替换为number,则会显示空格number次),这是导致我的问题(当我输入我的输入并点击返回时它根本不显示任何内容)。

我已经在这方面摸索了很长一段时间,并感谢任何帮助。 (我这样做只是为了了解这不是作业)。

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

1 个答案:

答案 0 :(得分:2)

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

input DW ?

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

input_size DD ?

nNumberOfBytesToRead应该作为值而不是指针传递。并且您希望写入在Readfile中输入的字节数:

INVOKE WriteFile, eax, OFFSET input, OFFSET input_size, read, 0
INVOKE WriteFile, eax, OFFSET input, read, read, 0