NASM汇编递增db定义变量时增量远大于1的原因及解决方法
故障原因
你通过db定义的Var是1字节长度的单字节变量,但读写时使用了32位寄存器ebx,属于典型的操作数宽度不匹配问题:
- 执行
mov ebx, [Var]时,CPU会从Var的起始地址开始连续读取4字节数据加载到ebx,除了Var本身存储的1字节值,Var地址后方相邻3字节的内存随机数据会被填充到ebx的高24位,读到的值根本不是你预期的单字节变量值。 - 执行
mov [Var], ebx写回时,会把ebx的4字节内容连续写入从Var开始的4个内存单元,直接覆盖Var后方3字节的原有数据,破坏相邻内存。
这种错误的读写逻辑下,你每次递增的是Var和后方3字节拼成的非法32位值,自然会出现变量增长幅度远大于1的现象,还会随机引发其他内存相关故障。
修复方案
根据你实际需要的变量宽度二选一即可:
- 如果你确实需要使用1字节变量,改用8位寄存器操作,或者直接对内存做单字节递增:
注意直接操作内存时必须加; 写法1:通过8位通用寄存器中转 mov bl, [Var] inc bl mov [Var], bl ; 写法2:直接操作内存,代码更简洁 inc byte [Var]byte宽度限定符,否则汇编器无法判断操作数宽度,会抛出编译错误。 - 如果你实际需要的是32位宽度的变量,修改变量定义为32位双字类型即可,原有操作逻辑无需改动:
; dd代表定义32位双字(double word) Var: dd 1
内容的提问来源于stack exchange,提问作者Markian
相关产品推荐
相关产品推荐

