Assembly 汇编:查找数组中的最大数,不';行不通

Assembly 汇编:查找数组中的最大数,不';行不通,assembly,Assembly,我正在开发MacOSX(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

我正在开发MacOSX(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,我不明白为什么,有什么线索吗?

看起来你的程序没有办法终止,因为你没有减少
cx
(它最初保持数组大小)的值,并在它变为
0
时停止比较。相反,您将继续循环并继续执行以下操作:

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

这会导致分段错误,因为在某个点上,您试图通过阵列端访问属于您不拥有的分段的内存。

另一个问题是
循环将使用
ECX
,即整个32位,不仅是
CX
的低16位,而且提供的代码似乎没有清除
ECX
的前16位。loop命令会自动减少ECX中的值,因此我的错误是使用CX而不是ECX。这是我所做的更正:mov ecx,n。现在可以了,谢谢。