2009-02-18 12 views
5

Erstens bin ich mir nicht sicher, ob dies Teil des Threads sein sollte Ich begann gestern auf assembly and the stack aber ich denke, die Frage, die ich hier frage, ist ganz anders.Cygwin: Assembler Sprachentwicklung?

Ich habe versucht zu verstehen, was genau Cygwin ist, über Wikipedia und Google, ich habe nicht viel Glück. Ich habe gerade begonnen, Assembly-Programmierung auf Linux mit dem GCC Gas Assembler. Ich benutze eine Maschine bei der Arbeit während des Mittagessens, dass nur Windows darauf hat. Ich wollte eine Assembly Programmiersprache hier üben, also dachte ich Cygwin könnte helfen können.

Irrtümlicherweise glaubte ich, dass der Code, den ich in Linux schrieb, einfach kompiliert und in Windows mit Cygwin ausgeführt werden konnte. Cygwin ermöglicht es mir, den Code in Ordnung zu kompilieren:

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

Aber wenn ich versuche, den Code unter Cygwin zu laufen,

./someAssmProg 

Ich erhalte eine Meldung "nicht behandelte win32 Ausnahme aufgetreten"

Jetzt Ich gehe davon aus, dass der Code, den ich schreibe, für Linux ist. Ich dachte allerdings, dass Cygwin damit umgehen würde. Ist Cygwin nur dazu gedacht, Windows-Anwendungen in einer Befehlszeile im Unix-Stil zu entwickeln?

Wieder weiß ich, das ist wahrscheinlich für die meisten Leute hier offensichtlich, aber Ich bin wirklich verwirrt!

P.S Ich habe versucht vorher für Windows, aber es ist ziemlich eine heftige Installation.

+0

Falls jemand aus dem gleichen Grund, den ich habe, über dieses Thema stolpert, habe ich erfolgreich LLVM IR kompiliert, um Cygwin mit den Befehlen des Posters auszuführen. – sdasdadas

Antwort

6

Cygwin ist eine Laufzeitschicht, die Bibliotheken und Software aus der Unix/Linux-Welt unter Windows bereitstellt. Es wird nicht erlauben, dass Ihr Assembler-Code ausgeführt wird, da das Betriebssystem immer noch unter Windows liegt, also sind alle Interrupts usw. immer noch die Windows-, nicht die Linux-Versionen. Wenn Sie Assembler wirklich unter Windows ausführen wollen, müssen Sie die Dinge anders machen als unter Linux (oder DOS).

+0

danke, das macht Sinn. Nur eine Sache, was genau ist eine "Laufzeitschicht"? Nicht pedantisch zu sein, weiß es wirklich nicht! – bplus

+0

bplus: cygwin interpretiert im Grunde die C-Aufrufe (im Gegensatz zu Interrupts) eines Programms, das ursprünglich für irgendeine Art von Unix geschrieben wurde, und versucht dann stattdessen, den entsprechenden Windows-Aufruf aufzurufen. Da es C-Aufrufe abfängt und nicht unterbricht, müssen Sie gegen Cygwin bauen, um es auf Cygwin ausführen zu können. –

+0

natürlich ist es viel komplizierter und es macht viele andere Sachen, aber das ist die Grundidee. –

1

Die beste Weg, es wirklich zu tun ist eine VM (mit VirtualBox oder Somesuch) mit einer vollständigen Installation von Linux darunter zu installieren. Es klingt so, als ob das zu schwer wäre, um Ihre Anforderungen zu erfüllen, aber das ist der einzige Vorschlag, den ich im Moment habe.

+0

Das ist die Schlussfolgerung, zu der ich auch gekommen bin. –

2

Sie können Assembly-Programme in Cygwin vollständig ausführen. Ich schätze, dass Ihre Ladung fehlgeschlagen ist, da es eine Menge Dinge gibt, die zwischen dem Ausführen eines Prozesses durch Windows und dem Erreichen der main-Funktion passieren müssen. Wenn gcc eine Baugruppe als Eingabe erhält, wird sie mit dem entsprechenden Standardcode verknüpft, um eine gültige ausführbare Datei zu erzeugen.

Hier ist ein Beispielmontageprogramm. Speichern Sie es als 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" 

führen Sie es dann mit

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

Die Referenz für Ihren Prozessor Montageanleitung enthalten ist, in den AMD64 Architecture Programmer’s Manual.Die C-Aufrufkonvention ist im Internetarchiv unter this page dokumentiert; Vielleicht kannst du einen ähnlichen finden, der noch die Bilder hat?

Beachten Sie, dass Cygwin derzeit nur 32-Bit-Assembly ausführt; Die (Nicht-Consumer-) Welt besteht jetzt aus 64 Bits, und im 64-Bit-Modus auf modernen Prozessoren haben Sie viel mehr Register und verschiedene Aufrufkonventionen.

+0

Es ist ein Fehler in der Website; Es funktioniert ordnungsgemäß im Vorschaufenster. "AMD64 Architecture Programmer's Manual" verweist auf http://developer.amd.com/documentation/guides/Pages/default.aspx "diese Seite" verweist auf http://web.archive.org/web/20050208123742 /http://ocliteracy.com/techtips/win32-callconv-asm.html Ich weiß, okliteracy.com/... ist kaputt, deshalb bin ich mit der Wayback Machine verbunden – andrewdotn

+0

Ist '-mno-cygwin' notwendig? Es stellt nur sicher, dass wir eine ausführbare MINGW-Datei erstellen? – CMCDragonkai

+0

Das '' mno-cygwin'' arbeitet nicht am neuesten GCC für Cygwin. – CMCDragonkai

0

Hallo, ich hatte ein ähnliches Problem, aber war in der Lage, es herauszufinden, die -mconsole Option in dieser Cygwin-Sitzung mit einer Datei foo.c zuerst kompiliert und als mit dem GDB-Debugger ausführen ich, dass hoffentlich helfen Ihnen

$ cat foo.c 
int main(void) 
{ 
     __asm__ ("mov $5, %rax"); 
     return 0; 
} 
$ make 
gcc -ggdb -Wall -mconsole -o foo.o -c foo.c 
gcc -ggdb -o foo foo.o -lm 
$ gdb ./foo.exe 
GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1 
Copyright (C) 2015 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-pc-cygwin". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from ./foo.exe...done. 
(gdb) l 
1  int main(void) 
2  { 
3    __asm__ ("mov $5, %rax"); 
4    return 0; 
5  } 
(gdb) b 3 
Breakpoint 1 at 0x1004010ed: file foo.c, line 3. 
(gdb) r 
Starting program: /cygdrive/c/C++/C/foo.exe 
[New Thread 6724.0x13d0] 
[New Thread 6724.0x1890] 
[New Thread 6724.0x8e0] 
[New Thread 6724.0xd84] 

Breakpoint 1, main() at foo.c:3 
3    __asm__ ("mov $5, %rax"); 
(gdb) info registers rax 
rax   0x0  0 
(gdb) s 
4    return 0; 
(gdb) info registers rax 
rax   0x5  5 
(gdb) c 
Continuing. 
[Thread 6724.0x1890 exited with code 0] 
[Thread 6724.0x8e0 exited with code 0] 
[Thread 6724.0xd84 exited with code 0] 
[New Thread 6724.0x1368] 
[Inferior 1 (process 6724) exited normally] 
(gdb)