Assembly NASM按参考传递

Assembly NASM按参考传递,assembly,x86,nasm,Assembly,X86,Nasm,我在用NASM编写代码时遇到了一个问题(我是这门语言的初学者)。我使用的是参考传递。当[ebp-2](用作计数器)中的值等于[ebp+4](来自用户的数字)中的值时,代码应终止。我期望“checked”打印5次,但输出是无限循环或“checked”打印n次 这是发生问题的代码的一部分: find_prime: mov ebp, esp sub esp, 2 mov ecx, [ebp+4] ;ecx contains address o

我在用NASM编写代码时遇到了一个问题(我是这门语言的初学者)。我使用的是参考传递。当[ebp-2](用作计数器)中的值等于[ebp+4](来自用户的数字)中的值时,代码应终止。我期望“checked”打印5次,但输出是无限循环或“checked”打印n次

这是发生问题的代码的一部分:

find_prime:
        mov ebp, esp
        sub esp, 2

        mov ecx, [ebp+4]      ;ecx contains address of ebp+4    
        mov word [ebp-2], 1   ;[ebp-2] as counter

        while1_begin:
            mov bx, [ebp-2]
            cmp bx, [ecx]     ;check if bx < [ecx]  
            je terminate      ;if bx = [ecx] terminate

            mov eax, 4
            mov ebx, 1
            mov ecx, pri      ;pri contains 'checked'
            mov edx, priLen
                int 80h

            inc word [ebp-2]
            jmp while1_begin

        while1_end:
            jmp terminate

        add esp, 2
        ret 4
find_prime:
电动汽车
副esp,2
mov-ecx,[ebp+4];ecx包含ebp+4的地址
mov字[ebp-2],1;[ebp-2]作为计数器
开始时:
mov bx,[ebp-2]
cmp-bx[ecx];检查bx是否<[ecx]
终止;如果bx=[ecx]终止
mov-eax,4
mov-ebx,1
mov-ecx,pri;pri包含“已检查”
移动edx,priLen
int 80h
inc-word[ebp-2]
jmp while1_开始
当1_结束时:
jmp终止
添加esp,2
ret 4
  • 您的代码甚至无法汇编,因为where是终止的
  • 您的算法过于复杂,因为它的结构可能是这样的
  • 这并不是一个要求,但保留EBP是一个好主意

        push    ebp
        mov     ebp, esp
        mov     ecx, [ebp+8]
    
    L1: jcxz    done
        dec     ecx
        push    ecx
        .... Do printing here
        pop     ecx
        jmp     L1
    
    done:
        leave
        ret     4
    
  • 注意:如果您知道传递的值总是大于零,或者至少是非零,则此示例甚至可以按大小进行压缩。


    否则,唯一真正的问题是没有在循环中保留ECX。

    mov ECX,[ebp+4]
    将ebp+4处的值移动到ECX中。如果您想要地址,您的意思是
    leaecx,[ebp+4]
    ?很难说,因为这不是一个简单的例子。你在那一行的评论有点模棱两可。你说这是通过引用传递的,但你的文字和代码似乎表明这是通过值传递的。
    add/sub esp,2
    。。。我至少会将其填充到4(访问单词[ebp-2]可能与访问单词[ebp-4]一样好,我只会保持
    esp
    4字节边界对齐)。虽然如果现在使用未对齐的堆栈处理
    int 80h
    ,那么它可能没问题(或者只会影响性能)。您的代码甚至不会进行汇编,因为终止在哪里?这意味着什么?@fuzzxl有一个条件的绝对jmp到一个名为
    terminate
    的位置。标签
    在哪里终止:
    。OP在他的问题中写道这是我的问题的一部分code@MichaelPetch是的,OP有,但我不认为,基于代码结构,认为
    terminate
    不存在是不合理的,因此该评论旨在提请注意可能存在的错误。