汇编:在 Windows nasm 中处理用户输入

2023-12-07

我是 asm 的新手,试图制作一个简单的 hello world,等待用户按一个键结束。现在,hello world 一切都很好,但是我从中获得的 .exe 控制台程序立即关闭,而我希望它保留在屏幕上,直到用户按下某个键。 现在我遇到的问题是,由于某种原因,程序不断循环,搜索用户输入,但是当我强制关闭程序(^C)时,我可以看到我按下的所有键都写在下一个控制台行上,就像如果它使用了错误的缓冲区(?)

几天来我一直在互联网上寻找修复方法,最后我寻求帮助,因为这让我发疯了^^ 我发现的所有内容大多基于int系统或linux下,而我必须处理windows api......

非常感谢,欢迎任何帮助或提示!

Code :

STD_OUTPUT_HANDLE   equ -11
STD_INPUT_HANDLE    equ -10 
NULL                equ 0

global start
extern ExitProcess, GetStdHandle, WriteConsoleA, ReadConsoleInputA

section .data
msg                 db "Hello World!", 13, 10, 0
msg.len             equ $ - msg
consoleInHandle     dd 1

section .bss
buffer              resd 2
buffer2             resd 2

section .text
    start:

        push    STD_OUTPUT_HANDLE
        call    GetStdHandle

        push    NULL
        push    buffer
        push    msg.len
        push    msg
        push    eax
        call    WriteConsoleA 

    read:

        push STD_INPUT_HANDLE
        call GetStdHandle
        mov [consoleInHandle],eax
        push consoleInHandle
        push dword[buffer2]
        push 1
        push NULL
        call ReadConsoleInputA

        cmp eax,1
        jge exit
        jmp read

    exit:

        push    NULL
        call    ExitProcess

有关 Windows 函数的 Moar 信息可以在这里找到:

  • 读取控制台输入
  • 写入控制台

push consoleInHandle推送的是地址,而不是句柄。你要push dword [consoleInHandle]。相反,对于缓冲区你想传递地址,所以你需要push buffer2那里。此外,该缓冲区的大小应为INPUT_RECORD结构,我认为是 32 字节。

Update:正如弗兰克评论的那样,论证顺序也是错误的。 这段代码对我有用(注意我必须添加@xx由于我的环境设置方式而导致的 stdcall 装饰 - 显然您不需要这些):

STD_OUTPUT_HANDLE   equ -11
STD_INPUT_HANDLE    equ -10
NULL                equ 0

global start
extern ExitProcess@4, GetStdHandle@4, WriteConsoleA@20, ReadConsoleInputA@16

section .data
msg                 db "Hello World!", 13, 10, 0
msg.len             equ $ - msg
consoleInHandle     dd 1

section .bss
buffer              resd 2
buffer2             resb 32

section .text
    start:

        push    STD_OUTPUT_HANDLE
        call    GetStdHandle@4

        push    NULL
        push    buffer
        push    msg.len
        push    msg
        push    eax
        call    WriteConsoleA@20

    read:

        push STD_INPUT_HANDLE
        call GetStdHandle@4
        mov [consoleInHandle],eax
        push NULL
        push 1
        push buffer2
        push dword [consoleInHandle]
        call ReadConsoleInputA@16

    exit:

        push    NULL
        call    ExitProcess@4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编:在 Windows nasm 中处理用户输入 的相关文章

  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 批处理脚本 FOR 循环仅设置输出的第一个字母 wsl --list -q

    我正在编写一个批处理脚本 将文件从 Windows 目录复制到 WSL 发行版 其中一部分是选择将文件复制到哪个发行版 如果我使用命令wsl list q如果给我以下输出 Ubuntu 22 04 Ubuntu 18 04 我正在尝试使用此
  • 在运行时,我如何判断我是否在 WinXP+ 上? win32

    我正在进行一些 win32 字符串 API 调用 并假设字符串以宽字符串形式出现 这在 XP 和更高版本上有效 我该如何断言这一点 这是运行时检查还是编译时检查 我做错了吗 这是一个例子 typedef std basic string
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • 导致崩溃转储的 Java 错误的解决方法

    我开发的一个程序偶尔会由于这个错误而导致 JVM 崩溃 http bugs java com bugdatabase view bug do bug id 8029516 http bugs java com bugdatabase vie
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • C# WMI 在远程 PC 上运行一个 exe,然后在同一台 PC 上运行另一个 exe,然后在网络路径上调用 Directory.CreateDirectory 并失败

    使用 C WMI 我在另一台计算机上启动一个 exe 该 exe 使用 C 启动另一个 exeProcess班级 最后一个 exe 尝试调用Directory CreateDirectory使用网络路径 又名 comp1 d dir Dir
  • Windows批处理文件:将结构转换为单行字符串

    我需要将这个艰巨的任务作为批处理文件来完成 这对于 C 来说不是最困难的 但在 DOS 中是一个地狱 至少对我来说 我需要将结构转换为单个 var 字符串 才能在我的程序中再次将它们转换为该结构 别担心回归 一切都已经完成了 该结构的大小会
  • 可以读取目标文件吗?

    我很好奇 obj文件 我几乎不知道它们是什么 或者它们包含什么 所以我用 Vim 文本编辑器打开它们 我在里面发现了一种类似外星人的语言 有什么办法可以理解它们代表什么以及它们的内容是什么 另外 它们的用途是什么 Thanks Sure 但
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • Visual C++ 找不到“Windows 类型”,如 PVOID、DWORD、ULONG 等

    Windows 似乎无法找到任何这些类型 我完全不知道该怎么办 我在 MSDN 上找到的东西似乎表明它们是默认包含的 但它们在 Native 程序或 CLR 程序中不起作用 我收到的具体错误是
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • Windows 上的 boot2docker 缺少 apt-get / 包管理器

    我在 boot2docker 中 我不确定我完全理解它 但它似乎是我正在进行的项目所需要的 我已经通过 ssh 登录了 并且尝试对我们的项目进行 make 但是我得到了 make not found 然后我尝试了一个 apt get ins
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • sqlite3-ruby gem:无法构建 gem 本机扩展

    Update 看看这个后续问题 Windows 上的 Gem 更新 它坏了吗 https stackoverflow com questions 134581 gem update on windows is it broken 在 Win
  • 在 Windows 上通过 ctypes 将文件描述符传递给 C 库函数

    我试图通过 ctypes 将文件描述符传递给在 fd 上执行写入的 C 函数 在linux上它可以工作 在 Windows 上则不然 我不明白为什么 我没有 Windows 开发人员的经验 C func signature void fun
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望

随机推荐

  • PyQt5:类型错误:“顶级小部件的基类错误”

    我已经使用 QtDesigner 创建了 ui 文件 并将它们加载到两个单独的窗口中 如下所示 class MainWindow QMainWindow def init self parent None super init Set up
  • 用于加载 PNG 图像的替代库

    我的 java J2SE 应用程序正在从 Web 读取大量 png 图像 其中一些图像使用诸如真彩色图像的透明度颜色 tRNS 部分 之类的功能 而 Sun 的 Oracle 的 PNGImageReader 实现会简单地忽略这些功能 因此
  • Angular 将回调函数作为 @Input 传递给子组件,类似于 AngularJS 方式

    AngularJS 有 参数 您可以在其中将回调传递给指令 例如AngularJS 的回调方式 是否可以将回调作为 Input对于角度组件 如下所示 如果不是 那么与 AngularJS 最接近的是什么 Component selector
  • 如何查看哪个复选框被选中?

    如何在 PHP 中检查是否checkbox是否检查 如果选中该复选框 则将传递该复选框的值 否则 该字段不会在 HTTP post 中传递 if isset POST mycheckbox echo checked
  • 从 .NET 服务打印 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我现在正在开发一个项目 该
  • Maven项目中Tomcat部署问题

    我一直在尝试创建一个简单的基于 Maven Web 的项目 以对 Maven 充满信心 我在 pom xml 中添加了 tomcat7 插件以将其用作服务器 但是当我开始使用以下命令将 war 文件部署到 tomcat 时 tomcat7
  • ORDER BY 子句的 CASE WHEN 语句

    我正在使用 SQL Server 2008 R2 我想要对表中的记录进行基于优先级的排序 所以我在 ORDER BY 子句中使用 CASE WHEN 语句 ORDER BY 子句如下 ORDER BY CASE WHEN TblList P
  • 如何为 Java 应用程序构建 docker 容器

    我想要做的是为我的 Java 应用程序构建一个 docker 映像 但对于大多数编译语言来说 以下注意事项应该适用 problem 在我的构建服务器上 我想为我的应用程序生成一个 docker 映像作为可交付成果 为此 我必须使用一些构建工
  • 如何在unity3d上使用xcode游戏

    我有一个使用 Objective C 在 xcode 上构建的游戏 这个游戏需要与unity3d开发的另一个游戏集成作为它的一部分 我怎样才能做到这一点 有什么插件可以实现这个目的 问题是 我有一个unity3d游戏 而我在主游戏中几乎没有
  • 手动设置响应状态代码

    我有一个 try catch 块来处理我的应用程序遇到的错误 我想要一种简单的方法来设置对状态代码 403 或禁止的响应 然后将用户重定向到登录页面或自定义错误页面 我在设置状态代码和重定向时遇到一些问题 有人有设置状态代码然后重定向的示例
  • Pandas 将(不等长)列表的列拆分为多列

    这个问题的一个轻微的变体 Pandas 将列表的列拆分为多列 给定一个数据框 col1 0 1 2 0 1 0 1 2 3 4 5 6 0 1 2 3 如何将其转换为列等于最大长度的数据框 col1 col2 col3 col4 col5
  • flutter firebase 数据库和 ListView 构建器问题

    我想在 ListView 中显示我的 shopList 的每一项 但我找不到它一直显示相同记录的原因 请帮助解决这个问题 这里使用代码 从 firebase 数据库获取数据 databaseReference once then DataS
  • 用 C 语言和两个整数发送信号

    你能帮我完成以下任务吗 编写一个C程序 将命令行参数1和2解释为pid和信号号 并将相应的信号号发送到进程pid 要将命令行参数解释为整数 可以使用 C 函数 atoi 用户将通过标准输出得知该过程有多成功 此外 还应使用合适的退出代码 这
  • Java 默认值混乱,为什么函数作用域变量没有默认值? [复制]

    这个问题在这里已经有答案了 我对在我看来不一致的背后的推理感到困惑 例如 public class Test static int a public static void main String args System out print
  • Apache CXF:- 如何使用 cxf 拦截器提取有效负载数据

    我应该遵循哪些步骤来使用 Apache CXF 拦截器提取有效负载 你的拦截器需要从AbstractPhaseInterceptor或子类 public class MyInterceptor extends AbstractPhaseIn
  • 如何回滚 TFS 签入?

    我想回滚最近在 TFS 中所做的更改 在 Subversion 中 这非常简单 然而 在TFS中似乎有一个令人难以置信的头痛问题 选项 1 获取先前版本 手动获取每个文件的先前版本 签出进行编辑 失败 结帐 在 VS2008 中 迫使我获取
  • Java中InputStream的内存问题

    我需要将文件读入字节数组 整个文件需要读入数组 问题是我收到 OutOfMemory 错误 因为文件大小太大 增加 XmX似乎没有任何效果 这是代码片段 InputStream in new FileInputStream file lon
  • 如果选中复选框,如何更改 div 的颜色?

    我有根据数据库记录创建的表 在 tbody 内部 我有 tr 创建每个表行 表行具有同一日期的多个时间段 如果选中复选框 我想更改时间块的背景颜色 我让我的复选框正常工作 我用警报和里面的一些文本进行了测试 现在我正在尝试更改背景颜色 但到
  • 值更改时 Swiftui Textfield 不更新

    我在表单上有一个文本字段 用户可以在其中输入值 但我还想使用按钮更新文本字段的内容 这是我的代码 struct test View State private var amount Double 0 0 var body some View
  • 汇编:在 Windows nasm 中处理用户输入

    我是 asm 的新手 试图制作一个简单的 hello world 等待用户按一个键结束 现在 hello world 一切都很好 但是我从中获得的 exe 控制台程序立即关闭 而我希望它保留在屏幕上 直到用户按下某个键 现在我遇到的问题是