NASM无效的地址行为?

时间:2015-04-21 14:00:56

标签: assembly x86 nasm

我有一个名为a的数组和一个名为n的常量,我试图将其作为一个二维数组来处理,其中包含以下行:mov al, [a+ebx*n+esi] 问题是如果n是偶数(n equ 4),它可以正常工作,但如果n是奇数(n equ 3),编译器会给出"错误:无效有效地址"。我能理解两个案例中是否有效或失败,但我无法理解为什么他们的工作方式不同。

编译器:NASM
链接器:GCC(适用于Windows的minGW)
IDE:SASM

该计划:

    %include "io.inc"

section .data
a    db    1, 2, 3, 4
     db    5, 6, 7, 9
     db    9, 10, 11, 12
     db    13, 14, 15, 16
n    equ   4

section .text
global CMAIN
CMAIN:
    mov ebp, esp; for correct debugging
    ; write your code here
    ;
    ; get upper limit
    xor    eax, eax
    mov    edi, n
    ;
    ; get last column
    mov    esi, n-1
    xor    ebx, ebx
    xor    edx, edx ; count in DL
    xor    ecx, ecx ; sum in CX
    mov    dh, 3
cycle:
    xor    ah, ah
    mov    al, [a+ebx*n+esi]
    div    dh
    cmp    ah, 0
    jne    afteradd
    add    cl, [a+ebx*n+esi]
    add    dl, 1
afteradd:
    add    ebx, 1
    cmp    ebx, edi
    jl     cycle
solve:
    mov    ax, cx
    div    dl       ; среднее арифметическое будет в AL
aftercycle:
    xor    eax, eax
    ret

1 个答案:

答案 0 :(得分:2)

地址的偏移部分在base + index*scale + displacement表格中给出。偏移的scale部分只允许某些值。这些是1(默认),248

Intel's Software Developers Manual第1卷(名为指定偏移的部分)中描述了这一点:

  

内存地址的偏移部分可以直接指定为静态值(称为位移)或通过   地址计算由以下一个或多个组成部分组成:
  •位移 - 8位,16位或32位值   •基础 - 通用寄存器中的值   •索引 - 通用寄存器中的值   •比例因子 - 值为2,4或8,乘以索引值。

(以上引用适用于32位模式,但比例因子的相同限制适用于64位模式)