由信号SIGSEGV终止的x86 macOS(地址边界错误)

时间:2018-06-05 02:22:42

标签: macos assembly x86 nasm intel

我正在尝试编写一个程序,可以找到并打印255以下的素数。以下程序在this blog中正常工作:

    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 for macOS,主要使用x86 wikibook作为参考。这就是我到目前为止所做的:

;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。据我所知,这意味着我正在尝试访问一些不允许的内存。但是,我不相信我会访问任何内存。怎么了?使代码正确运行的明确方法是理想的,但只是理解错误将非常有用。

0 个答案:

没有答案