【发布时间】: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"...