汇编代码 - 循环中的xor如何工作?

时间:2016-09-12 01:30:57

标签: assembly reverse-engineering

我有这个汇编代码,其中包含一个for循环,我将其转换回C代码。但是,我注意到循环中有一个xor。

.L3:
        movq    -8(%rbp), %rax      
        andl    $1, %eax    
        xorl    %eax, -12(%rbp)     
        sarq    -8(%rbp)        
.L2:
        cmpq    $0, -8(%rbp)        
        jg      .L3         

所以我知道for循环会一直循环,只要它大于0并且每循环除以2。但我遇到麻烦的是使用andl和xorl。我知道它检查1和eax with和取决于它们的值返回1或0,但循环如何改变xor?

1 个答案:

答案 0 :(得分:2)

假设局部变量b位于-8(%rbp),局部变量c位于-12(%rbp)

.L3:    movq    -8(%rbp), %rax
        andl    $1, %eax

eax的值设置为b的最低有效位的值。

xorl    %eax, -12(%rbp) 

执行c的异或,以及b的最低有效位,将结果存储在c中。

sarq    -8(%rbp)

b除以2

cmpq    $0, -8(%rbp)
jg      .L3

如果b大于0,请返回循环开始,否则继续。

所以相应的C代码是:

do {
    c ^= (b & 1);
    b /= 2;           //  Or: b >>= 1;
} while ( b > 0 );

虽然.L2标签的存在表明之前可能存在jmp .L2,但您没有向我们展示,在这种情况下,它会是while循环:< / p>

while ( b > 0 ) {
    c ^= (b & 1);
    b /= 2;           //  Or: b >>= 1;
}

工作演示(在OS X上使用气体汇编程序):

asm_func.S

.globl  _asm_func

.text

_asm_func:
    push    %rbp
    mov     %rsp, %rbp
    sub     $16, %rsp

    movq    %rdi, -8(%rbp)
    movl    %esi, -12(%rbp)

    jmp     .L2

.L3:
    movq    -8(%rbp), %rax
    andl    $1, %eax
    xorl    %eax, -12(%rbp)
    sarq    -8(%rbp)

.L2:
    cmpq    $0, -8(%rbp)
    jg      .L3

    movl    -12(%rbp), %eax

    leave
    ret 

main.c

#include <stdio.h>

int asm_func(int b, int c);

int c_func(int b, int c)
{
    while ( b > 0 ) {
        c ^= (b & 1);
        b >>= 1;
    }
    return c;
}

int main(void)
{
    for ( int i = 112; i < 127; i += 7 ) {
        for ( int j = 203; j > 182; j -= 9 ) {
            printf("C function  (%d, %d): %d\n", i, j, c_func(i, j));
            printf("Asm function(%d, %d): %d\n", i, j, asm_func(i, j));
        }
    }
    return 0;
}

Makefile

prog: main.o asm_func.o
    cc -o prog main.o asm_func.o

main.o: main.c
    cc -o main.o main.c -c -std=c99 -pedantic -Wall -Wextra

asm_func.o: asm_func.S
    as -o asm_func.o asm_func.S

带输出:

paul@horus:~/src/sandbox/so_asm$ ./prog
C function  (112, 203): 202
Asm function(112, 203): 202
C function  (112, 194): 195
Asm function(112, 194): 195
C function  (112, 185): 184
Asm function(112, 185): 184
C function  (119, 203): 203
Asm function(119, 203): 203
C function  (119, 194): 194
Asm function(119, 194): 194
C function  (119, 185): 185
Asm function(119, 185): 185
C function  (126, 203): 203
Asm function(126, 203): 203
C function  (126, 194): 194
Asm function(126, 194): 194
C function  (126, 185): 185
Asm function(126, 185): 185
paul@horus:~/src/sandbox/so_asm$