Я пытаюсь написать программу, которая найдет и напечатает простые числа до 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
.Насколько я могу судить, это означает, что я пытаюсь получить доступ к памяти, которая не разрешена.Однако я не верю, что у меня есть доступ к какой-либо памяти вообще.Что случилось?Идеально было бы сделать так, чтобы код работал правильно, но очень полезно было бы понять ошибку.