在汇编中的同一行上跳转和调用

Jump and Call on same line in assembly

我想知道是否有办法做出条件决定并根据该结果调用函数。

例如。我想比较一些东西。如果它们是偶数,我想进行函数调用。但是,我编写函数的方式需要调用函数而不是跳转到它。 (基于我的函数处理堆栈的方式)有没有办法做到这一点?如图所示,我已经复制了我的代码,它无法编译。

.endOfForLoop: cmp  dword [ebp - 4], 1 ; compares the boolean to one
je call print_prime ; if it is one then prime needs to be printed
jmp call print_not_prime ; otherwise it is not prime

使用 NASM、x86 32 位汇编、linux、英特尔

只需跳过函数调用,就像您要实现 if-then-else 一样:

.endOfForLoop:
    cmp dword [ebp-4],1
    jne .not_prime
    call print_prime
    jmp .endif
.not_prime:
    call print_not_prime
.endif:

您还可以使用函数指针和 cmov 指令使您的代码无分支,但我建议不要编写这样的代码,因为它更难理解,而且实际上并不像我所知道的所有分支预测器那样更快根本不尝试预测间接跳跃。

.endOfForLoop:
    cmp dword [ebp-4],1
    mov eax,print_prime
    mov ebx,print_not_prime
    cmovne eax,ebx
    call eax