Assembly mov[string]的MASM语法,单词PTR';他';
我将遵循以下有关装配的教程: 他们使用NASM。我使用MASM 我有这个字符串: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
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对字符串有特殊的交换方法。