我有一个名为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
答案 0 :(得分:2)
地址的偏移部分在base + index*scale + displacement
表格中给出。偏移的scale
部分只允许某些值。这些是1
(默认),2
,4
和8
。
Intel's Software Developers Manual第1卷(名为指定偏移的部分)中描述了这一点:
内存地址的偏移部分可以直接指定为静态值(称为位移)或通过 地址计算由以下一个或多个组成部分组成:
•位移 - 8位,16位或32位值 •基础 - 通用寄存器中的值 •索引 - 通用寄存器中的值 •比例因子 - 值为2,4或8,乘以索引值。
(以上引用适用于32位模式,但比例因子的相同限制适用于64位模式)