Erstes C-Programm

Bevor wir mit der Assembler Programmierung beginnen, werden wir uns ein einfaches C-Programm ansehen. Das folgende Programm addiert zwei Zahlen und gibt diese über die Kommandozeile wieder aus. Das Programm lautet

int main() {
  int a = 19, b = 89;
  return a + b; 
}

Wir übersetzen das Programm auf der Eingabezeile mit dem Kommando

cl p0.c 

und starten das Programm auf der Kommandozeile mit

p0 

oder

p0.exe.

Mit dem Befehl

echo %errorlevel% 

auf der Kommandoeile eingegeben,erhalten wir die Ausgabe

108 

aso die Summe der beiden Variablen a und b. Wir wollen jetzt untersuchen, was der Compiler aus dem C-Programm generiert. Hierbei verwenden wir den Befehl auf der Eingabezeile

cl /FAs p0.c

der das folgende Listing des Programms mit Assembler Anweisungen erzeugt.

; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.42 

  TITLE I:\Dokumente und Einstellungen\M60\Eigene Dateien\Assemembler\p0.c

  .686P
  .XMM
  include listing.inc
  .model      flat
INCLUDELIB LIBCMT   
INCLUDELIB OLDNAMES

PUBLIC      _main   
; Function compile flags: /Odtp

; File i:\dokumente und einstellungen\m60\eigene dateien\assemembler\p0.c

_TEXT SEGMENT   
_b$ = -8                                 ; size = 4 
_a$ = -4                                 ; size = 4 
_main PROC   

; 1    : int main(){

      push  ebp 
      mov   ebp, esp    
      sub   esp, 8

; 2    :   int a = 19, b = 89;   

      mov   DWORD PTR _a$[ebp], 19             ; 00000013H  
      mov   DWORD PTR _b$[ebp], 89             ; 00000059H 

; 3    :   return a + b;

      mov   eax, DWORD PTR _a$[ebp]
      add   eax, DWORD PTR _b$[ebp]  

; 4    : }

      mov   esp, ebp    
      pop   ebp 
      ret   0

_main ENDP  
_TEXT ENDS  
END

Hier sehen wir einen Mix aus C-Programm und die zugehörigen Assembler Anweisungen. Man erkennt sehr gut, dass die Zahl der Anweisungen gegenüber den C-Programm wesentlich umfangreicher ist. Im folgenden Listing sind neben den Memnonics und der HEX Code der Assember Anweisungen codiert.

; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.42 

TITLE I:\Dokumente und Einstellungen\M60\Eigene Dateien\Assemembler\p0.c    
      .686P
      .XMM
      include listing.inc
      .model      flat

INCLUDELIB LIBCMT   
INCLUDELIB OLDNAMES

PUBLIC      _main

; Function compile flags: /Odtp

; File i:\dokumente und einstellungen\m60\eigene dateien\assemembler\p0.c

_TEXT SEGMENT
_b$ = -8                            ; size = 4
_a$ = -4                            ; size = 4

_main PROC

; 1    : int main(){    

00000     55                    push  eb
00001     8b ec                 mov   ebp, esp
00003     83 ec 08              sub   esp, 8

; 2    :   int a = 19, b = 89;

00006     c7 45 fc 13 00 00 00    mov   DWORD PTR _a$[ebp], 19 ; 00000013H
0000d     c7 45 f8 59 00 00 00    mov   DWORD PTR _b$[ebp], 89 ; 00000059H

; 3    :   return a + b;

00014     8b 45 fc               mov   eax, DWORD PTR _a$[ebp]
00017     03 45 f8               add   eax, DWORD PTR _b$[ebp]

; 4    : }

0001a     8b e5                 mov   esp, ebp
0001c     5d                    pop   ebp   
0001d     c3                    ret   0

_main ENDP
_TEXT ENDS
END

Diese beiden Lisitings sind sehr umfangreich und komplex, jedoch kann man wenn man ein Assembler Programm per Hand erstellt wesentlich komprimierter arbeiten.

Wir wollen nun schrittweise vorgehen. Hierzu teilen wir das obige Programm in ein Hauptprogramm mit dem Namen main und ein Unterprogramm mit dem Namen add. Wir verwenden vorerst nur eine Datei

int main() {
    int a, b sum;
    a = 19; 
    b = 89;

    sum = add(a,b);

    return sum;
}

int sum(int a, int b) {
    return a + b;
}