【问题标题】:NASM invalid address behaviour?NASM 无效地址行为?
【发布时间】:2015-04-21 14:00:56
【问题描述】:

我有一个名为 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

【问题讨论】:

  • 使用 3*ebx = "push ebx" , "lea ebx, [ebx+ebx*2]" , " mov al,[ebx+esi+a]", ....."添加 cl,[ebx+esi+a]", ..... , afteradd: "pop ebx", "add ebx,1"...

标签: assembly x86 nasm


【解决方案1】:

地址的偏移部分以base + index*scale + displacement 的形式给出。偏移量的scale 部分仅允许使用某些值。它们是1(默认)、248

这在Intel's Software Developers Manual Vol 1(名为指定偏移量的部分)中有描述:

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

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

【讨论】:

  • (准确地说,上面的引用是 16 位模式的附加内容,以及 80386+ 的操作数大小/地址大小前缀。)
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2014-08-15
  • 2023-03-16
  • 2022-08-13
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多