NASM汇编中直接操作.data段变量报错,是否需先移入寄存器?
关于NASM中
inc内存变量报错的问题 嘿,作为刚接触NASM的初学者,碰到这个报错太正常了——我来给你理清楚到底是怎么回事!
首先直接给你答案:完全不需要把内存数据移入寄存器才能操作!x86架构本身支持直接对内存执行inc这类指令,你的问题出在语法细节上,而非不能原地操作内存。
为什么你的代码会报错?
你定义的counter是16位的字变量(dw 0),而在Mac的Xcode默认的64位编译环境下,NASM需要你显式指定内存操作数的大小,否则它会默认使用32位或64位的操作数宽度,这和你定义的16位变量不匹配,就会触发"invalid combination of opcode and operands"错误。
修正后的代码
只需要给inc指令加上操作数大小的前缀,明确告诉NASM你要操作的是16位字:
section .data counter dw 0 global _start _start: inc word [counter] ; 显式指定操作16位内存变量 ret
额外补充
如果你的变量是32位(用dd定义)或者64位(用dq定义),在64位模式下可以直接写inc [counter],因为默认的操作数大小会和变量匹配。但养成显式指定大小的习惯会更稳妥,能避免很多类似的匹配错误。
x86指令集里有大量支持直接内存操作的指令(比如dec、add、sub等),只要保证操作数大小和变量定义一致,就可以直接对内存进行原地操作,不需要先加载到寄存器。
内容的提问来源于stack exchange,提问作者Toerktumlare
相关产品推荐
相关产品推荐

