Windows (x86) 程序集将空终止符 append 到输入的字符串

标签 windows string assembly x86 append

我目前正在尝试将空终止符 append 到(a?)用户输入的字符串:

.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
    buff            DB 100h DUP(?)
    stdInHandle     DWORD 0
    bytesRead       DWORD ?

.code
    start:
            ;read string from stdin
            INVOKE GetStdHandle, -10
            MOV stdInHandle, eax
            INVOKE ReadFile, stdInHandle, BYTE PTR[buff], 100, ADDR bytesRead, 0

            ;append null terminator on CR,LF
            MOV eax, bytesRead
            MOV edx, BYTE PTR[buff]
            SUB eax, 2
            AND BYTE PTR [eax+edx], 0
            RET
    END start

它拒绝在 MOV edx, BYTE PTR[buff] 处进行汇编并给我一个错误:
错误:操作码和操作数的组合无效(或错误的 CPU 设置)。

所以我假设我不能MOV BYTE PTR[buff] 的值到寄存器 edx 中。因此,我什至无法开始测试这种尝试将 NULL 终止符应用于字符串的方法是否有效。

我的问题是,上面的代码有什么问题(我应该使用不同的寄存器而不是 edx 吗?)

NULL 终止符应用于字符串的最佳方法是什么?

最佳答案

您不能将字节值移动到双字大小的寄存器中。您要么需要使用字节大小的寄存器,例如 dl,要么使用 movzx 对其进行零扩展。当您使用字节时,我建议您选择第一个选项。

关于Windows (x86) 程序集将空终止符 append 到输入的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12748013/

相关文章:

Windows Phone 7 开发指南

c++ - UTF-8 字符串迭代器

python - 如何将字符从特定字符打印到具有多个字符实例的特定字符?

go - Go,x64汇编和CMOVLMI : Where is this opcode described?

c# - Windows 10 IoT Core - 视频打开关闭

c++ - Windows C++中线程的退出代码

windows - Windows Server 2008 上的 .NET 2.0 应用程序失败

string - 反斜杠字符的 Bash 参数扩展规则

c - 内联汇编导致没有前缀的错误

c - 高效的整数比较函数