0

次のような非常に基本的な C++ インライン x86-64 アセンブリの例を見つけようとしています。

C/C++ による単純な「Hello World」インライン アセンブリ言語プログラム

char msg[] = "Hello, world";

asm {
    mov ax,4       // (I/O Func.)
    mov bx,1       // (Output func)  
    lds cx, msg   // (address of the string)
    mov dx,6       //  (lenght of the string)
    int 0x21       // system call
}

これは Intel Compiler で動作します。誰かがこれを手伝ってくれませんか?

EDIT OSに関しては、WindowsとLinuxにICCがあります-Linuxとしましょう!

4

2 に答える 2

5

投稿したコードは 16 ビット コードです。64 ビット Windows (または任意のバージョンの Linux) は、16 ビット コードをサポートしていません。[そして、文字列の実際の長さが 12 であるのに、長さを 6 に設定するため、少しバグがあります...]

Windows コードで同じことを行う方法を理解できるかもしれませんが、アセンブラーから Windows でシステム コールを作成する方法を学ぶ意味がわかりません。文字列内の文字数をカウントするなど、実際に実際に適用できることを行うコードを記述します。

もちろん、Microsoft コンパイラは 64 ビット モードでのインライン アセンブラを許可していないため、Intel または GCC コンパイラのいずれかを使用する必要があります。

これは、「タイムスタンプ カウンターの読み取り」命令を使用したインライン アセンブラーの小さなサンプルです。これは、gcc コンパイラーで動作します (互換性により、Intel コンパイラーでも動作するはずです)。

static __inline__ unsigned long long rdtsc(void)
{
    unsigned hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
于 2013-03-20T21:36:20.653 に答える
1

AT&T 対 Intel アセンブリ形式。

at&t noprefix                   intel
mov eax, -4(ebp,edx,4)          mov DWORD PTR[-4 +ebp +edx *4], eax
mov eax, -4(ebp)                mov DWORD PTR[-4 +ebp], eax
mov edx, (ecx)                  mov DWORD PTR[ecx], edx
lea (   ,eax,4), eax            lea eax, DWORD PTR[8 + eax*4]
lea (eax,eax,2), eax            lea eax, DWORD PTR[eax*2+eax]

またはこれ。

asm(".intel_syntax noprefix");
asm("mov eax, ebx");

asm(".att_syntax prefix");
asm("mov %ebx, %eax");

AT&T 構文。

int main(int argc, char *argv[])
{
int x=1, f=2, fa=3;
asm("int $0x3");
asm("mov 4%0,%%eax"::"m"(x));
asm("movss 4%0,%%xmm1"::"m"(f));
asm("fld 4%0"::"m"(fa));
return 0;
}

違いの 1 つは、'%' の使用と、レジスタへの割り当ての方向であることに注意してください。

ここここでさらに議論します。その多くはデバッグに関係しています。

于 2013-03-21T05:23:41.727 に答える