在x64汇编中输入输出

时间:2017-05-20 02:32:50

标签: assembly 64-bit masm

如何获得输入和输出我根本不理解,并且没有在任何地方找到一个简单的例子 我唯一拥有的是:

我在视觉工作室使用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`

1 个答案:

答案 0 :(得分:0)

这是高度操作系统特定的。您需要调用操作系统提供的API函数才能执行此操作。显然,从问题中的代码以及评论中,您的目标是Windows,因此您需要在Microsoft的文档中查找允许您读取和/或写入控制台的Windows API函数。您已找到GetStdHandle函数;其他所需的功能将记录在同一个地方。

具体来说,您可能正在寻找ReadConsoleWriteConsole,尽管有更多专门用于控制台I / O的功能。您可以在this website上找到有关如何从C调用这些函数的简要教程。

您应该能够将该C代码翻译成汇编语言。使用汇编语言调用任何Windows API函数的方式与GetStdHandle之后的WriteConsole相同。如果你不习惯将C转换为汇编语言,你总是可以用C语言编写代码,通过编译器运行代码,然后查看反汇编列表,看看应该如何完成。

这是一个简单的例子。首先,它使用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 重复该控制台中的文本。

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

注意:为清楚起见,省略了错误检查!这不是实际编写代码的好方法!

或者,您可以通过利用C标准库的强大功能来避免所有复杂的特定于操作系统的内容,C标准库已经为您封装了所有这些内容。您只需链接到相应的目标文件,然后调用scanffrom PIL import Image with Image.open(image_path) as image: image.thumbnail((200, 200), Image.ANTIALIAS) image.save(temporary_thumbnail_path) with open(temporary_thumbnail_path, "rb") as thumbnail_file: thumbnail_as_string = base64.b64encode(thumbnail_file.read()).decode() 之类的函数。有关入门的帮助,请参阅standard Windows 64-bit calling convention