mov [string], WORD PTR 'HE' 的 MASM 语法

MASM syntax for mov [string], WORD PTR 'HE'

我遵循这个关于组装的教程: https://www.tutorialspoint.com/assembly_programming/assembly_addressing_modes.htm 他们使用 NASM。我使用 MASM.

我有这个字符串:

string db 'hello string from asm here'

我想修改程序中的字符串。 我想替换前 2 个字母。

mov [name],  dword 'Nuha'

所以我尝试:

mov [string], WORD 'HE' 

抛出错误a2070。 它可以这样做:

mov [string], 'H'   

输出:来自这里的 asm 的 Hello 字符串 然后我发现了这个:

mov word ptr [string], 'HE' 

它编译,但是从后往前读 输出:来自 asm here 的 EHllo 字符串 我想要:来自 asm here

的 Hello 字符串

那么如何在 MASM 中将单词值移动到字符串中?

PS。有没有人有更好的 MASM 资源和教程而不是 NASM?

提前致谢,

科迪

HE一个字值'0x4845'。当你把它放在内存中时,它被序列化为小端(因为你使用的是英特尔 x86 或 x64 处理器)=> 交换字节:十六进制转储:0x45 0x48

如果您这样做,您将获得预期的行为:

 mov [string] WORD PTR, 'EH'

(你本来可以自己想出来的,但现在你知道原因了)

我查看了 NASM 文档,他们对字符串做了一件特殊的事情,可能是因为它更方便:

  dw    0x1234              ; 0x34 0x12 
  dw    'a'                 ; 0x61 0x00 (it's just a number) 
  dw    'ab'                ; 0x61 0x62 (character constant) 
  dw    'abc'               ; 0x61 0x62 0x63 0x00 (string) 

请注意 dw "swaps" 字符串 word/longs 但不是十六进制值。

MASM 更 "basic" 并且此交换未完成,这解释了您遇到的 "standard" 行为。

注意:这样做是一种技巧。调用字节到字节的复制例程更好,也更通用。将这样的代码从 MASM 移植到 NASM(或相反)可能会导致灾难性的后果。