Битовые операции в ассемблере (под vs 2012)
На примере, если можно.
Заранее спасибо.
Код:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned short _ushort;
#ifndef _X86_
#error [Только x86]
#endif
// инверсия
__declspec(naked) _ushort __cdecl inverse_bits(_ushort) {
__asm {
push ebp
mov ebp, esp
push dx
push bx
xor ax, ax
mov bx, word ptr [ebp + 8]
__next:
mov dx, bx
and dx, 1 // dx & 1
or ax, dx // ax | dx
shr bx, 1 // bx >> 1
jz __end;
shl ax, 1 // ax << 1
jmp __next;
__end:
pop bx
pop dx
pop ebp
ret
};
}
int main(void){
char buf[17];
_ushort a = (_ushort)-49;
puts(itoa((int)a, buf, 2));
a = inverse_bits(a);
puts(itoa((int)a, buf, 2));
a = inverse_bits(a);
puts(itoa((int)a, buf, 2));
return 0;
}
#include <stdlib.h>
typedef unsigned short _ushort;
#ifndef _X86_
#error [Только x86]
#endif
// инверсия
__declspec(naked) _ushort __cdecl inverse_bits(_ushort) {
__asm {
push ebp
mov ebp, esp
push dx
push bx
xor ax, ax
mov bx, word ptr [ebp + 8]
__next:
mov dx, bx
and dx, 1 // dx & 1
or ax, dx // ax | dx
shr bx, 1 // bx >> 1
jz __end;
shl ax, 1 // ax << 1
jmp __next;
__end:
pop bx
pop dx
pop ebp
ret
};
}
int main(void){
char buf[17];
_ushort a = (_ushort)-49;
puts(itoa((int)a, buf, 2));
a = inverse_bits(a);
puts(itoa((int)a, buf, 2));
a = inverse_bits(a);
puts(itoa((int)a, buf, 2));
return 0;
}