装配SIGSEGV,分段故障

时间:2017-07-20 18:11:52

标签: assembly x86 nasm intel

我在SEGMENT .DATA

中有4个变量
  1. 阵列A
  2. 数组B
  3. 数组C
  4. 数组大小
  5. 我的目标是将A的第i个元素与B的第i个元素相乘,结果将转换为数组C的第i个元素。

    我正在使用带有NASM编译器的SASM,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 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
    

    任何想法可能是什么问题?

1 个答案:

答案 0 :(得分:3)

我没有 SASM ,但qustion中的说明看起来没问题。我能想到的唯一原因是目标[C + ESI*4]位于只读部分。此时我注意到您使用以下行在名为.DATA的部分中定义数据:

SECTION .DATA

我不知道SASM用于链接器脚本的是什么,但.DATA部分可能不是读/写部分的典型名称,并且可能导致链接器创建.DATA的可执行文件只读。读/写部分通常称为.data(小写事项)。尝试修改SECTION .DATA以阅读:

SECTION .data