5

まず、これが昨日アセンブリとスタックで開始したスレッドの一部であるかどうかはわかりませんが、ここで尋ねている質問はまったく異なると思います。

ウィキペディアとGoogleを介して、 Cygwinが正確に何であるかを理解しようとしていますが、あまり運がありません。gcc ガス アセンブラを使用して、Linux でアセンブリ プログラミングを始めたところです。私は昼食時に Windows しか搭載されていないマシンを職場で使用しています。ここでアセンブリ言語プログラミングの練習をしたかったので、Cygwin が役立つのではないかと考えました。

Linux で書いたコードは、Cygwin を使って Windows でコンパイルして実行できると思っていました。Cygwin を使用すると、コードをうまくコンパイルできます。

as someAssmProg.as -o someAssmProg.o
ld someAssmProg.o -o someAssmProg

しかし、Cygwin でコードを実行しようとすると、

./someAssmProg

「未処理の win32 例外が発生しました」というメッセージが表示される

これは、私が書いているコードが Linux を対象としているためだと思います。私はCygwinがこれに対処すると思っていました。Cygwin は、Unix スタイルのコマンド ライン方式で Windows アプリケーションを開発するために使用されることを本当に意図しているのでしょうか?

繰り返しになりますが、これはおそらくここにいるほとんどの人にとって明らかなことですが、私は本当に混乱しています!

PS Windows 用にAndLinuxを試したことがありますが、インストールにはかなりの手間がかかります。

4

4 に答える 4

7

Cygwinは、Windows上のUnix/Linuxの世界からライブラリとソフトウェアを提供するランタイムレイヤーです。OSはまだWindowsの下にあるため、アセンブラコードを実行できません。したがって、すべての割り込みなどは、LinuxではなくWindowsのバージョンのままです。さらに、本当にWindowsでアセンブラを実行したい場合は、Linux(またはDOS)で行うのとは大きく異なる方法で行う必要があります。

于 2009-02-18T14:37:47.853 に答える
3

Cygwin でアセンブリ プログラムを完全に実行できます。Windows がプロセスを実行してから関数に到達するまでの間に発生しなければならないことがたくさんあるため、ロードが失敗したと推測していますmain。gcc にアセンブリが入力として与えられると、適切な定型コードにリンクして、有効な実行可能ファイルを生成します。

アセンブリ プログラムのサンプルを次に示します。hello.s として保存します。

.intel_syntax noprefix

.section .text

.globl _main
_main:
        enter 0, 0

        // welcome message
        push    OFFSET s_HelloWorld
        call    _printf
        pop     eax

        // add three numbers
        push    2
        push    4
        push    5
        call    _addThree
        add     esp, 3 * 4

        // print returned value
        push    eax
        push    OFFSET s_PercentD
        call    _printf
        add     esp, 2 * 4

        xor     eax, eax
        leave
        ret

// Add three numbers
_addThree:
       enter    0, 0
       mov      eax, DWORD PTR [ebp + 8]
       add      eax, DWORD PTR [ebp + 12]
       add      eax, DWORD PTR [ebp + 16]
       leave
       ret

.section .rdata

s_HelloWorld:
       .ascii  "Hello, world.\n\0"
s_PercentD:
       .asciz "%d\n"

次に、それを実行します

$ gcc -mno-cygwin hello.s -o hello && ./hello
Hello, world.
11

プロセッサの組み立て手順のリファレンスは、AMD64 Architecture Programmer's Manualに含まれています。C 呼び出し規則は、Internet Archive のこのページに記載されています。たぶん、まだ画像がある同様のものを見つけることができますか?

Cygwin は現在 32 ビットのアセンブリのみを行うことに注意してください。(非消費者の) 世界は現在すべて 64 ビットであり、最新のプロセッサの 64 ビット モードでは、より多くのレジスタとさまざまな呼び出し規則があります。

于 2009-02-24T00:24:41.680 に答える
1

これを実際に行う最善の方法は、VM を (VirtualBox などを使用して) インストールし、その下に Linux を完全にインストールすることです。それはあなたの要件を満たすには重すぎるかもしれませんが、現時点で私が持っている唯一の提案です.

于 2009-02-18T15:39:19.907 に答える