2011-11-29 57 views
2

我开发在Mac OS X(FreeBSD的)大会:找到一个数组的最大数量,不工作

这里是代码

section .data 
v dd 72,54, 89, 21, 0, 12 
n equ 6 

section .bss 
max resd 1 
section .text 
global _start 
_start: 
    mov eax, 0 
    mov ebx, [v] 
    mov cx, n 
    dec cx 
    change_max: 
     mov ebx, [v+eax*4] 
     loop lp 
    lp: 
     inc eax 
     cmp ebx, [v+eax*4] 
     jl change_max 
     loop lp 
    return_max: 
      mov [max], ebx 
    exit: 
     push dword 0    
     mov eax, 0x1    
     sub esp, 4 
     int 0x80 

我得到一个分割故障:11我不明白为什么,有什么线索?

回答

2

看起来你的程序没有办法终止,因为你不会减少cx(最初保存数组大小)的值,并在它变成0时停止比较。相反,你不断循环,继续做:

inc eax 
cmp ebx, [v+eax*4] 

导致分段错误,因为在某些时候您尝试访问过去数组末尾,属于你没有自己的一段记忆。

+0

另一个问题是'LOOP'将使用整个32位的'ECX',而不仅仅是'CX'的低16位,并且它看起来并不像所提供的代码清除'ECX'的前16位。 –

+0

loop命令会自动减少ecx中的值,所以我的错误是使用cx而不是ecx。这是我所做的更正:mov ecx,n。现在,它的工作,谢谢。 – AR89