asm04.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 88 行

C
88
字号
#include "fail.h"

#define INLINE

#if defined(__386__) || defined(__I86__)

INLINE int sub( int a, int b ) {
    return a - b;
}
#pragma aux (__stdcall) sub parm reverse;

int INLINE burst( int i, int j );
#ifdef __386__
#pragma aux burst = \
        "xor eax,edx" \
        "and eax,edx" \
        "or eax,edx" \
        parm caller [eax] [edx] \
        value [eax] \
        modify exact [eax];
#else
#pragma aux burst = \
        "xor ax,dx" \
        "and ax,dx" \
        "or ax,dx" \
        parm caller [ax] [dx] \
        value [ax] \
        modify exact [ax];
#endif

int INLINE uses_burst( int a, int b ) {
    ++a;
    b -= 2;
    return burst( a, b );
}

int INLINE xor( short a, short b ) {
    short r;
    __asm {
        mov ax,word ptr a
        xor ax,word ptr b
        mov word ptr r,ax
    };
    return r;
}


int INLINE and( short a, short b ) {
    short r;
#pragma aux _do_and = \
    "mov ax,word ptr a" \
    "and ax,word ptr b" \
    "mov word ptr r,ax" \
    ;
    _do_and();
    return r;
}

INLINE int foo( int x, int y ) {
    int r;
    r = sub( x, y );
    if( r != (x-y) ) _fail;
    r = burst( x, y );
    if( r != ((( x^y ) & y ) | y ) ) _fail;
    r = uses_burst( x, y );
    x++;
    y-=2;
    if( r != ((( x^y ) & y ) | y ) ) _fail;
    return( r );
}

int five = 5;
int two = 2;
int twelve = 12;
int three = 3;

int main() {
    if( foo( five, three ) != 1 ) _fail;
    if( xor( two, two ) != 0 ) _fail;
    if( xor( three, twelve ) != 15 ) _fail;
    if( and( two, two ) != 2 ) _fail;
    if( and( three, twelve ) != 0 ) _fail;
    _PASS;
}
#else
ALWAYS_PASS
#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?