Font
[thread]10675[/thread]

Assembler Code anzeigen lassen

Reader: 1


<< |< 1 2 >| >> 13 entries, 2 pages
pktm
 2007-10-27 15:13
#101450 #101450
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Hallo!

In meinem (schon länger zurückliegenden) Informatikkurs in der Schule haben wir uns mal den Assebler-Code eines Programmes anzeigen lassen.
Wie gehts das?
Das Programm bestand aus einer for-Schleife und war in Pascal geschrieben.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
GwenDragon
 2007-10-27 15:23
#101453 #101453
User since
2005-01-17
14745 articles
Admin1
[Homepage]
user image
Den Assemblercode kannst du nicht mit anderen Programmen anzeigen lassen. Außer einem Debugger ;)

Assembler ist das:
Code: (dl )
1
2
ld bc,3
jump 3000h


Du meinst Hexcode?
Code: (dl )
0000 1B CC 00 12 ...
ptk
 2007-10-27 18:08
#101465 #101465
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
GwenDragon+2007-10-27 13:23:19--
Den Assemblercode kannst du nicht mit anderen Programmen anzeigen lassen. Außer einem Debugger ;)

Klar kann man. Das nennt sich Disassembler. Auf meinem Rechner ist beispielsweise ndisasm installiert:
Code: (dl )
1
2
3
4
5
6
7
8
$ ndisasm echo
00000000 7F45 jg 0x47
00000002 4C dec sp
00000003 46 inc si
00000004 0201 add al,[bx+di]
00000006 0109 add [bx+di],cx
00000008 0000 add [bx+si],al
...

Sowas gibt es sogar für interpretierte Sprachen wie Perl (CPAN:B::Disassembler) und Java.
pktm
 2007-10-27 18:41
#101466 #101466
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Ich meinte schon den Assembler-Code. Könnte natürlich auch sein, dass wir den Debugger dafür verwendet haben.
Jetzt kam die Frage im KOntext eines C++-Kurses wieder auf. Dann nehme ich mal an, dass es bei C++ auch möglich ist, den Assembler-Code über den Debugger einzusehen.
Mal suchen - außer jemand weis, wie man das bei DevCpp einstellt :)

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
GwenDragon
 2007-10-27 19:20
#101470 #101470
User since
2005-01-17
14745 articles
Admin1
[Homepage]
user image
Ja sicher gibt es Disassbembler. Fällt bei mir unter Debugger.

Was meint ihr? Den Quellcode?
Der lässt sich bei einem kompilierten (binären) Code, egal mit welchem Programm, nicht mehr richtig anzeigen!
Denn selbst mit einem Disassembler fehlen Macros und richtige Namen der Sprungmarken etc., es sei denn Debuggincode ist mit in der ausführbaren Datei eingebaut.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cr eq 0dh
lf eq 0ah
dbl macro text
db text,cr,lf
endm

FBuf db 8 dup (' ')
dbl 'Perl ist toll!'
RetAll equ 03398h
Test equ 33
mov ax,Test
mov dx,FBuf
jz RetAll
dec dx
jnz FBuf+2
ret


Ich möchte mal sehen, wie ihr das wieder genauso anzeigt.
pktm
 2007-10-27 19:57
#101473 #101473
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Ich will doch gar nicht wissen wie das Programm aussah, welches den Assembler-Code generiert hat. Ich will wissen, wie der Assemblercode aussieht, den mein Programm generiert, also genau die andere Richtung.
http://www.intergastro-service.de (mein erstes CMS :) )
GwenDragon
 2007-10-27 20:33
#101474 #101474
User since
2005-01-17
14745 articles
Admin1
[Homepage]
user image
Ich blaube, ich kapier gerade nicht so richtig, was du möchtest.
pktm+2007-10-27 17:57:41--
Ich will doch gar nicht wissen wie das Programm aussah, welches den Assembler-Code generiert hat. Ich will wissen, wie der Assemblercode aussieht, den mein Programm generiert, also genau die andere Richtung.

Wie soll was aussehen?

Wenn du den Code für den Assembler (.asm-Datei) meinst, den das Pascalprogramm als Zwischenprodukt (kann eingeschaltet werden) geneierit?.
Dazu musst du dem Programm beibringen, anstatt ausführbaren (binären) Code nur Assembler zu erzeugen.
pktm
 2007-10-27 21:30
#101478 #101478
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
Ok, ich führe folgendes Programm aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
use strict;
use warnings;

my $x = undef;
for( my $i = 1; $i < 5; $i++ ) {
$x = $i;
}

print $x;


und dann will ich den Kode sehen, irgendwie, z.B. in der Kommandozeile, oder irgendwie anders, Hauptsache Assembler-Kode.

Bei diesem Programm gibt es nämlich zu sehen, wie diese Schleife in Assembler mittels JMP usw. funktioniert.
http://www.intergastro-service.de (mein erstes CMS :) )
GwenDragon
 2007-10-27 21:40
#101479 #101479
User since
2005-01-17
14745 articles
Admin1
[Homepage]
user image
Perl kann Bytecode erzeugen und Assemblerdaten.
Siehe B::Disassembler; B::Bytecode

http://www.heise.de/ix/artikel/2000/07/169/
ptk
 2007-10-27 22:03
#101482 #101482
User since
2003-11-28
3645 articles
ModeratorIn
[default_avatar]
Bei Perl wird kein Maschinencode erzeugt. Es gibt nur eine Opcode-Repräsentation. Dein Beispiel oben würde so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 $ perl5.10.0 -MO=Terse script.pl
LISTOP (0x747040) leave [1]
OP (0x747640) enter
COP (0x7acb80) nextstate
BINOP (0x7baa40) sassign
OP (0x7b2a80) undef
OP (0x7b2a00) padsv [1]
COP (0x7ace00) nextstate
BINOP (0x747100) sassign
SVOP (0x7470c0) const IV (0x79fbe8) 1
OP (0x747080) padsv [2]
LISTOP (0x747500) lineseq
COP (0x7acd80) nextstate
BINOP (0x7474c0) leaveloop
LOOP (0x7acd00) enterloop
UNOP (0x747480) null
LOGOP (0x747440) and
BINOP (0x7471c0) lt
OP (0x747140) padsv [2]
SVOP (0x747180) const IV (0x79fbd0) 5
LISTOP (0x747400) lineseq
LISTOP (0x747380) scope
OP (0x7acc80) null [177]
BINOP (0x747340) sassign
OP (0x7472c0) padsv [2]
OP (0x747280) padsv [1]
UNOP (0x747240) preinc [3]
OP (0x747200) padsv [2]
OP (0x7473c0) unstack
COP (0x7ace80) nextstate
LISTOP (0x747580) print
OP (0x7475c0) pushmark
OP (0x747540) padsv [1]

Der Perl-Interpreter ist eine virtuelle Maschine, die diesen Opcode-Baum ausführt. Vereinfacht gesagt, gibt es für jeden Opcode im Perl-Code eine C-Funktion (fängt mit Perl_pp_ an), die dann etwas Sinnvolles macht.
<< |< 1 2 >| >> 13 entries, 2 pages



View all threads created 2007-10-27 15:13.