Assembly mov[string]的MASM语法,单词PTR';他';

Assembly mov[string]的MASM语法,单词PTR';他';,assembly,nasm,masm,Assembly,Nasm,Masm,我将遵循以下有关装配的教程: 他们使用NASM。我使用MASM 我有这个字符串: string db 'hello string from asm here' 我想修改程序中的字符串。 我想替换前两个字母 mov [name], dword 'Nuha' 所以我试着: mov [string], WORD 'HE' 这将导致错误a2070。 它可以做到这一点: mov [string], 'H' 输出:来自asm的Hello字符串 然后我发现: mov word ptr [st

我将遵循以下有关装配的教程: 他们使用NASM。我使用MASM

我有这个字符串:

string db 'hello string from asm here'
我想修改程序中的字符串。 我想替换前两个字母

mov [name],  dword 'Nuha'
所以我试着:

mov [string], WORD 'HE' 
这将导致错误a2070。 它可以做到这一点:

mov [string], 'H'   
输出:来自asm的Hello字符串 然后我发现:

mov word ptr [string], 'HE' 
它编译,但从后面到前面读取 输出:此处来自asm的EHllo字符串 我想:你好字符串从asm在这里

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

还有谁有更好的源代码,MASM的教程而不是NASM

提前感谢,


科迪

作为一个词是值得的
'0x4845'
。当您将其放入内存时,它被序列化为little endian(因为您使用的是intel 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
“交换”字符串是字/长,而不是十六进制值

MASM更为“基本”,而这种交换并没有完成,这就解释了您所经历的“标准”行为


注意:这样做是一种黑客行为。调用字节到字节的复制例程更好、更通用。将这样的代码从MASM移植到NASM(或者反过来)可能会产生灾难性的结果。

谢谢你的回答。我知道它将使用little endian,但是为什么不在教程中使用这个示例呢?我也犯了一个错误,编的行去了;MOV单词PTR[string],'HE';对不起,请看我的编辑。NASM对字符串有特殊的交换方法。