assembly `cmp/test`和`js/jns/jz/jnz`示例

hts6caw3  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(91)

谁能展示一个类似C的表示法来说明cmp/testjs/jns/jz/jnz/等等的用法?
谢谢

qybjjes1

qybjjes11#

以下是一些例子:

#include <stdlib.h>
void test_with_self(int A){
    if (A) abort();
}

void test_with_mask(int A, int Mask){
    if (A&Mask) abort();
}

void test_js(int A){
    if (A<0) abort();
}

void test_jns(int A){
    if (A>=0) abort();
}

void cmp_jz(int A){
    if (A==42) abort();
}

void cmp_jnz(int A){
    if (A!=42) abort();
}

以及它们可以呈现为(clang output):

test_with_self:                         # @test_with_self
        test    edi, edi
        jne     .LBB0_2
        ret
.LBB0_2:
        push    rax
        call    abort@PLT
test_with_mask:                         # @test_with_mask
        test    esi, edi
        jne     .LBB1_2
        ret
.LBB1_2:
        push    rax
        call    abort@PLT
test_js:                                # @test_js
        test    edi, edi
        js      .LBB2_2
        ret
.LBB2_2:
        push    rax
        call    abort@PLT
test_jns:                               # @test_jns
        test    edi, edi
        jns      .LBB3_2
        ret
.LBB3_2:
        push    rax
        call    abort@PLT
cmp_jz:                                 # @cmp_jz
        cmp     edi, 42
        je      .LBB4_2
        ret
.LBB4_2:
        push    rax
        call    abort@PLT
cmp_jnz:                                # @cmp_jnz
        cmp     edi, 42
        jne     .LBB5_2
        ret
.LBB5_2:
        push    rax
        call    abort@PLT

注意je == jzjne == jnz

相关问题