assembly 编写一个x86(32位)汇编程序,将1到100,000之间的质数发送到标准输出

fdbelqdn  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(111)

我想写一个x86(32位)汇编程序,可以将从1到100,000的质数发送到标准输出。我写了一些代码,但似乎不能正常工作。

section .data
    msg db 'The next prime number is: ', 0
    len equ $-msg

section .text
    global _start

_start:
    mov eax, 1      ; current number
    mov edx, 1      ; divisor
    mov ecx, 100000 ; upper limit

find_next_prime:
    cmp eax, edx
    je print_number
    inc edx
    cmp edx, eax
    jg check_next_number
    mov ebx, eax
    xor edx, edx
    div edx, edx
    cmp edx, 0
    je not_prime
    jmp check_next_number

not_prime:
    inc eax
    jmp find_next_prime

check_next_number:
    cmp eax, ecx
    jl find_next_prime

print_number:
    ; Print message
    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, len
    int 0x80

    ; Print number
    mov eax, 3
    mov ebx, 1
    mov ecx, eax
    mov edx, 10
    int 0x80

    ; Exit
    mov eax, 1
    xor ebx, ebx
    int 0x80

我是汇编语言的新手,所以我不知道我能做些什么来让这个工作。也许有人可以修复这个代码,告诉我我做错了什么。

insrf1ej

insrf1ej1#

你的问题很可能就在这里:

find_next_prime:
    cmp eax, edx
    je print_number
    inc edx
    cmp edx, eax
    jg check_next_number
    mov ebx, eax
    xor edx, edx          ;mov edx,0
    div edx, edx          ;divide zero by zero
    cmp edx, 0
    je not_prime
    jmp check_next_number

我不熟悉32位x86(我只使用过16位版本),但我可以告诉你,如果你用零除任何东西,你不会得到想要的结果。
Here's how div works in x86.

相关问题