我目前正在尝试将空终止符 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/