我在汇编时遵循本教程: 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的EHllo字符串 我想要:来自asm的HEllo字符串
那么如何将字值移动到MASM中的字符串中呢?
PS。有没有人有更好的来源,MASM教程而不是NASM?
提前致谢,
科迪
答案 0 :(得分:2)
HE
作为一个词值得'0x4845'
。当你把它放在内存中时,它被序列化为小端(因为你使用的是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(或反过来)可能会带来灾难性的后果。