我使用SASM在NASM中编写的程序有问题,我使用一个变量作为计数器,一旦我修改了它并试图将新值保存在内存中使用的地址,我就会出现分段错误。以下是有关变量的代码位:
section.data
p_count DW 0
section.text
global CMAIN
CMAIN:
mov ebp, esp; for correct debugging
mov bx, [p_count]
inc bx
mov [p_count], bx
ret
程序到达此处的最后一行时停止运行。有人知道可能是什么问题吗?
您忘记了section.data
(和.text
(中的空格,因此默认情况下所有内容都进入只读.text
部分。
section.data
被解析为标签,就像foo.bar:
是一样,而不是section
指令。当标签名称不是有效的指令助记符(如loop:
(时,标签末尾的冒号是可选的
相反的错误(有效的section .data
,但有缺陷的section.text
(会导致将代码放入.data
,后者会链接到不可执行的内存页中。在这种情况下,您将在从第一条指令获取代码时出错!
你应该从NASM得到这样的警告:
warning: label alone on a line without a colon might be in error [-w+orphan-labels]
如果您的NASM没有发出警告,请使用默认情况下已打开的较新版本,
或使用-Worphan-labels
运行NASM以启用该有用的警告。