असेंबली में त्रुटि को ठीक करने के लिए स्थानांतरण को छोटा कर दिया गया

[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]

コメント

タイトルとURLをコピーしました