【问题标题】:Assembly SIGSEGV, Segmentation fault装配 SIGSEGV,分段错误
【发布时间】:2017-07-20 18:11:51
【问题描述】:

我在 SEGMENT .DATA 中有 4 个变量

  1. 数组 A
  2. 数组 B
  3. 数组 C
  4. 数组大小

我的目标是将 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

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

【问题讨论】:

  • 谢谢你的工作,你能把你的评论作为答案吗?
  • MOV ECX, [SIZE] 错误,大小定义为SIZE DB 5 = byte,而不是 dword,因此您应该将指令更改为movzx ecx, byte [SIZE],或者将定义更改为SIZE DD 5。跨度>

标签: assembly x86 nasm intel


【解决方案1】:

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

SECTION .DATA

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

SECTION .data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多