汇编中如何将字符串存入变量?初始化与未初始化变量问题咨询
汇编字符串赋值问题解析
你的理解不正确,未初始化变量的大小在定义时就已固定,不会被“锁定”为1字节。以下是问题的核心原因和解决方法:
报错原因分析
初始化变量的情况
你用DB定义的MESSAGE是字节类型数组,汇编器会将其视为连续的字节序列。当执行MOV [MESSAGE], 'Test'时,汇编器会自动把4字节的'Test'拆分为单个字节,依次写入MESSAGE起始的4个内存位置——只要字符串总长度不超过原数组的总长度,就不会触发错误。
未初始化变量的情况
BUFFER用DD 4 DUP(?)定义,是4个双字(每个4字节)的数组,总大小16字节。但汇编器会默认把[BUFFER]识别为双字类型(4字节),而'Tablespoons'是10字节的字符串,长度远大于4字节,因此汇编器判定“引用字符串超出数据大小”并报错——和变量是否初始化无关,纯粹是操作数类型与字符串长度不匹配导致的。
向未初始化变量写入字符串的方法
1. 逐个字符写入(明确类型)
通过BYTE PTR指定按字节操作,逐个写入字符:
BUFFER DD 4 DUP ? [...] MOV BYTE PTR [BUFFER], 'T' MOV BYTE PTR [BUFFER+1], 'a' MOV BYTE PTR [BUFFER+2], 'b' MOV BYTE PTR [BUFFER+3], 'l' MOV BYTE PTR [BUFFER+4], 'e' ; 继续写入剩余字符直到完成'Tablespoons'
2. 用字符串指令批量复制
利用x86的字符串操作指令(如REP MOVSB)批量复制,效率更高:
; 先在数据段定义要复制的字符串 STRING DB 'Tablespoons' BUFFER DD 4 DUP ? [...] LEA SI, STRING ; SI指向源字符串起始地址 LEA DI, BUFFER ; DI指向目标缓冲区起始地址 MOV CX, 10 ; CX设置为字符串长度('Tablespoons'共10个字符) CLD ; 方向标志位清零,按递增方向复制 REP MOVSB ; 重复执行MOVSB,直到CX为0
3. 分块写入多字节数据
如果想用MOV指令批量写入,可以按双字、字的大小分块处理:
BUFFER DD 4 DUP ? [...] MOV DWORD PTR [BUFFER], 'Tabl' ; 写入前4字节 MOV DWORD PTR [BUFFER+4], 'espo' ; 写入中间4字节 MOV WORD PTR [BUFFER+8], 'on' ; 写入最后2字节
4. 修改变量定义为字节类型
如果后续主要按字节操作字符串,可以直接把BUFFER定义为字节数组:
BUFFER DB 16 DUP(?) ; 16字节未初始化字节数组 [...] MOV [BUFFER], 'Tablespoons' ; 多数汇编器支持直接向字节数组写入字符串(只要长度不超过数组大小)
内容的提问来源于stack exchange,提问作者Lavonen
相关产品推荐
相关产品推荐

