x86 macOS завершается сигналом SIGSEGV (ошибка границы адреса) - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь написать программу, которая найдет и напечатает простые числа до 255. Следующая программа прекрасно работает в visUAL :

    mov     r0, #1
    mov     r3, #0x100
L1
    mov     r1, r0
    mov     r2, #2      
    adds        r0,r0,#2        
    cmp     r0, #0x100 ; only testing 1-byte numbers
    bge     exit        
    bvs     exit        
L2
    mov     r1, r0
L3
    sub     r1,r1,r2        
    cmp     r1, #0
    bgt     L3      
    beq     L1      
    add     r2, r2, #1
    cmp     r2, r0
    bne     L2      
    add     r3,r3,#4        
    str     r0, [r3]
    b       L1
exit

Я пытался перенести этов x86 для macOS, в основном используя викибук x86 в качестве ссылки.Это то, что у меня есть:

;compile with
;   nasm -f macho FILE.asm
;   ld -o primes -e _main FILE.o
extern _printf
segment .data
segment .text
global _main
_syscall:
    int 0x80
    ret
_main:
    mov     eax, 1
    mov     ecx, 0x100
L1$:
    mov     edx, eax
    mov     ebx, 2
    add     eax,2
    cmp     eax, 0x100 ; only testing 1-byte numbers
    jge     exit
    jo      exit
L2$:
    mov     edx, eax
L3$:
    sub     edx,ebx
    cmp     edx, 0
    jg      L3$
    je      L1$
    add     ebx, 1
    cmp     ebx, eax
    jne     L2$
    add     ecx,4
    push dword  1
    push dword  eax
    push dword  1
    mov eax, 0x4
    call _syscall
    add esp, 12
    jmp     L1$
exit:

Нет ошибок / предупреждений при запуске nasm или ld, но ./primes не работает.С рыбой (моя нормальная раковина) она печатает только fish: './primes' terminated by signal SIGSEGV (Address boundary error).В bash или sh он печатает Segmentation fault: 11.Насколько я могу судить, это означает, что я пытаюсь получить доступ к памяти, которая не разрешена.Однако я не верю, что у меня есть доступ к какой-либо памяти вообще.Что случилось?Идеально было бы сделать так, чтобы код работал правильно, но очень полезно было бы понять ошибку.

...