我如何获得输入和输出我根本不明白,也没有在任何地方找到一个简单的例子 我唯一拥有的是:
我在视觉工作室中使用masm
; get a write handle
MOV rcx, STD_OUTPUT_HANDLE
CALL GetStdHandle
MOV whandle, eax ; write handle
; get a read handle
MOV rcx, STD_INPUT_HANDLE
CALL GetStdHandle
MOV rhandle, eax ; read handle
这是高度特定于操作系统的。为此,您需要调用操作系统提供的 API 函数。显然,从问题中的代码以及您的评论来看,您的目标是 Windows,因此您需要在 Microsoft 文档中查找允许您读取和/或写入控制台的 Windows API 函数。您已经找到了
GetStdHandle
功能;其他所需的功能将记录在同一位置。
ReadConsole
和 WriteConsole
,尽管控制台 I/O 有很多更专门的函数。您可以在此网站上找到有关如何从 C 调用这些函数的简短教程。
您应该能够将该 C 代码翻译成汇编语言。任何 Windows API 函数都可以按照与您相同的方式从汇编语言调用
GetStdHandle
,遵循 标准 Windows 64 位调用约定。如果您在将 C 语言转换为汇编语言时遇到困难,您始终可以用 C 语言编写代码,通过编译器运行它,然后查看反汇编列表以了解它应该如何完成。
这是一个简单的例子。首先,它使用
WriteConsole
将一些指令文本写入控制台,并通过调用 GetStdHandle
获得输出句柄。然后,它使用 ReadConsole
和通过调用 GetStdHandle
获得的输入句柄将一些文本读入缓冲区。最后,它通过调用 WriteConsole
在控制台中重复该文本。
; L"Type some text:\n"
szInstruction DB 'T', 00H, 'y', 00H, 'p', 00H, 'e', 00H, ' ', 00H,
DB 's', 00H, 'o', 00H, 'm', 00H, 'e', 00H, ' ', 00H,
DB 't', 00H, 'e', 00H, 'x', 00H, 't', 00H, ':', 00H,
DB 0AH, 00H, 00H, 00H
MyFunction PROC
; Allocate space on the stack
sub rsp, 264
; WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
; L"Type some text:\n",
; 16,
; address of DWORD-sized variable on stack,
; NULL);
mov ecx, -11 ; STD_OUTPUT_HANDLE
call GetStdHandle
mov rcx, rax ; handle was returned in RAX
lea rdx, OFFSET szInstruction
mov r8d, 16
lea r9, QWORD PTR [rsp+272]
mov QWORD PTR [rsp+32], 0
call WriteConsoleW
; ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE),
; address of string buffer on stack,
; 100,
; address of DWORD-sized variable on stack,
; NULL);
mov ecx, -10 ; STD_INPUT_HANDLE
call GetStdHandle
mov rcx, rax ; handle was returned in RAX
lea rdx, QWORD PTR [rsp+48]
mov r8d, 100
lea r9, QWORD PTR [rsp+272]
mov QWORD PTR [rsp+32], 0
call ReadConsoleW
; WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
; address of string buffer on stack,
; number of chars read (from DWORD-sized variable written into by ReadConsoleW),
; address of DWORD-sized variable on stack,
; NULL);
mov ecx, -11 ; STD_OUTPUT_HANDLE
call GetStdHandle
mov rcx, rax ; handle was returned in RAX
lea rdx, QWORD PTR [rsp+48]
mov r8d, DWORD PTR [rsp+272]
lea r9, QWORD PTR [rsp+272]
mov QWORD PTR [rsp+32], 0
call WriteConsoleW
; Clean up space allocated on stack
add rsp, 264
ret
MyFunction ENDP
相当于下面的C代码:
void MyFunction()
{
TCHAR szBuffer[100];
DWORD dwCount;
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
L"Type some text:\n",
16,
&dwCount,
NULL);
ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE),
szBuffer,
100,
&dwCount,
NULL);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
szBuffer,
dwCount,
&dwCount,
NULL);
}
注意:为了清楚起见,省略了错误检查!这不是实际编写代码的好方法!
或者,您可以利用 C 标准库的强大功能来避免所有复杂的、特定于操作系统的内容,该库已经为您封装了所有这些内容。您只需链接到适当的目标文件,然后调用像
printf
或 scanf
这样的函数。请参阅此问题的答案以获取入门帮助。