[ad_1]
मैं एक प्रोग्राम बनाने की कोशिश कर रहा हूं जो यह निर्धारित करता है कि wsl का उपयोग करके असेंबली x64 में कोई संख्या प्राइम है या नहीं, यह कोड है:
global main section .data input_number dq 17 newline db 0xA prime_msg db "The number is prime" not_prime_msg db "The number is not prime" section .text main: mov rdi, input_number ; Preserve rdi push rdi call is_prime ; Restore rdi pop rdi ; Exit the program mov rax, 60 xor rdi, rdi syscall is_prime: ; Function to check if a number is prime ; Check if the number is less than 2 cmp rdi, 2 jl not_prime ; Loop to check divisors from 2 to the square root of the number mov rcx, 2 check_next_divisor: mov rax, rdi ; Copy the number to rax xor rdx, rdx ; Clear any previous remainder div rcx ; Divide rax by rcx, quotient in rax, remainder in rdx ; Check if the remainder is zero test rdx, rdx je not_prime ; If yes, it's not a prime number inc rcx ; Check if the divisor is greater than the square root of the number mov rax, rcx mul rax cmp rax, rdi jg prime ; If the divisor is greater than the square root, it's a prime number jmp check_next_divisor prime: ; Print message for a prime number mov rax, 1 mov rdi, 1 mov rsi, prime_msg mov rdx, 40 ; Adjust the length of the message if needed syscall ; Set zero flag to indicate it is prime ret not_prime: ; Print message for a non-prime number mov rax, 1 mov rdi, 1 mov rsi, not_prime_msg mov rdx, 40 ; Adjust the length of the message if needed syscall ; Set carry flag to indicate it is not prime stc ret and i got these errors: ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000 1.o: in function `prime_msg': 1.asm:(.data+0x1c): relocation truncated to fit: R_X86_64_8 against `.data' 1.o: in function `not_prime_msg': 1.asm:(.data+0x34): relocation truncated to fit: R_X86_64_8 against `.data'
मैंने क्या प्रयास किया है:
मुझे ये त्रुटियाँ मिलीं:
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000 1.o: in function `prime_msg': 1.asm:(.data+0x1c): relocation truncated to fit: R_X86_64_8 against `.data' 1.o: in function `not_prime_msg': 1.asm:(.data+0x34): relocation truncated to fit: R_X86_64_8 against `.data'
समाधान 1
पहला संदेश आपको बता रहा है कि आपने परिभाषित नहीं किया है start
प्रोग्राम के मुख्य प्रवेश बिंदु के लिए लेबल। अन्य संकेत दे रहे हैं कि ऑपरेंड रजिस्टर के लिए बहुत लंबा है rsi
. इसका कारण जानने के लिए आपको असेंबलर और सीपीयू दस्तावेज़ की जांच करनी चाहिए। कुछ समय हो गया है जब से मैंने बहुत अधिक असेंबलर लिखा है, लेकिन अगर मुझे सही से याद है तो आपको इसका उपयोग करने की आवश्यकता है offset
उन पंक्तियों पर ऑपरेटर:
एएसएम
mov rsi, offset prime_msg ; ... mov rsi, offset not_prime_msg
[ad_2]
コメント