Assembly 装配SIGSEGV,分段故障
我在段中有4个变量Assembly 装配SIGSEGV,分段故障,assembly,x86,nasm,intel,Assembly,X86,Nasm,Intel,我在段中有4个变量 数组A 阵列B 数组C 数组大小 我的目标是将A的第i个元素与B的第i个元素相乘,结果进入数组C的第i个元素 我正在将SASM与NASM编译器intel x86一起使用 这是我的密码: %include "io.inc" SECTION .DATA A DD 10, 200, -34, 56, 7 B DD 12, -3, 4, 7, 100 C DD 0, 0, 0, 0, 0 SIZE DB 5 section .text global
%include "io.inc"
SECTION .DATA
A DD 10, 200, -34, 56, 7
B DD 12, -3, 4, 7, 100
C DD 0, 0, 0, 0, 0
SIZE DB 5
section .text
global CMAIN
CMAIN:
MOV ESI, 0
MOV ECX, [SIZE]
MULT:
MOV EAX, [A + ESI*4]
MOV EBX, [B + ESI*4]
IMUL EAX, EBX
MOV [C + ESI*4], EAX; Program received signal SIGSEGV, Segmentation fault.
INC ESI
LOOP MULT
xor eax, eax
ret
有什么问题吗?我没有SASM,但问题中的说明看起来不错。我能想到的唯一原因是目标[C+ESI*4]
位于只读部分。此时,我注意到您在一个名为.data
的部分中使用以下行定义了数据:
SECTION .DATA
我不知道SASM在链接器脚本中使用了什么,但很可能.DATA
部分不是读/写部分的典型名称,并且可能导致链接器在创建可执行文件时将.DATA
设置为只读。读/写部分通常称为.data
(小写)。尝试修改部分。数据
以读取:
SECTION .data
感谢这项工作,您能把您的评论作为答案吗?
MOV ECX,[SIZE]
是错误的,大小定义为SIZE DB 5
=字节,而不是dword,因此您应该将指令更改为movzx ECX,byte[SIZE]
,或者将定义更改为SIZE DD 5
。