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