【解決方法】アセンブリ内のエラーに合わせて再配置が切り詰められました

プログラミングQA


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。 理由を調べるには、アセンブラと CPU のドキュメントを確認してください。 アセンブラをたくさん書いてからしばらく時間が経ちましたが、私の記憶が正しければ、 offset これらの行の演算子は次のとおりです。

ASM
    mov rsi, offset prime_msg

; ...

    mov rsi, offset not_prime_msg

コメント

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