Forum: PC-Programmierung Assembler (Klausur Informatik)


von Frederik S. (typenschild)


Lesenswert?

Hallo,
da ich bald eine Informatikklausur schreibe wo Assembler vorkommt wäre 
es nett wenn mal jemand meinen Lösungsvorschlag zu Aufgabe gegenlesen 
könnte.

Schreiben Sie eine C-Funktion void show_regs(void) die aktuelle Inhalte 
der
Allzweckregister (eax, ebx, ecx, edx, edi, esi) hexadezimal im 
Konsolfenster
ausgibt. In der Funktion kann, wo notwendig, Inline-ASM genutzt werden.
1
int a,b,c,d,di,si;
2
void show_regs(void){
3
__asm{ mov a, eax
4
       mov b, ebx
5
       mov c, ecx
6
       mov d, edx
7
       mov di, edi
8
       mov si, esi}
9
printf ("%x %x %x %x %x %x", a, b, c, d, di, si);
10
return 0;
11
}

Vielen dank schonmal im Vorraus
Fred

von Wilhelm F. (Gast)


Lesenswert?

> Vielen dank schonmal im Vorraus

Hast du keine Möglichkeit, das zu kompilieren und zu testen?

von Kindergärtner (Gast)


Lesenswert?

Funktioniert nicht:

test.c: In function ‘show_regs’:
test.c:3:6: error: expected ‘(’ before ‘{’ token
 __asm{ mov a, eax
      ^
test.c:3:8: error: unknown type name ‘mov’
 __asm{ mov a, eax
        ^
test.c:4:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ 
before ‘mov’
        mov b, ebx
        ^
test.c:9:1: warning: incompatible implicit declaration of built-in 
function ‘printf’ [enabled by default]
 printf ("%x %x %x %x %x %x", a, b, c, d, di, si);
 ^
test.c:10:1: warning: ‘return’ with a value, in function returning void 
[enabled by default]
 return 0;
 ^
test.c:15:1: error: expected declaration or statement at end of input
 }
 ^

von Wilhelm F. (Gast)


Lesenswert?

Sorry, da kann ich im Augenblick nicht weiter helfen. Tools und 
Prozessor zu spezifisch, was ich nicht kenne, du könntest ja da mal ein 
paar Teile nennen, damit jemand anderes damit was anfangen kann.

von Amateur (Gast)


Lesenswert?

Ich weiß zwar nicht, wie's richtig geht aber, habe den 
KleinWeich-Compiler in den letzten 10 Jahren nicht in der Hand gehabt 
aber:

__asm{ mov a, eax

ist eine Mischung aus...

__asm {            C-Compiler bzw. Perprozessor
       mov         Assembler Befehl
            a,     C-Variable
               eax Assembler Register

würde mich also wundern, wenn das ginge.

Möglicherweise geht's aber mit lokalen Variablen. Diese waren früher 
BP-Relativ und konnten in einer Assembleranweisung erreicht werden.

von Adler (Gast)


Lesenswert?

So wird das nix!

> mov di, edi

Was soll das werden? Ein Prozessorregister 32-bit nach einem 
Prozessorregister 16-bit kopiert?

Nimm mal andere Variablennamen, z.B.

int a,b,c,d,e,f;

dann lässt sich das auch kompilieren.

von Homo Siemensis (Gast)


Lesenswert?

Hätte ich nicht gedacht, dass heute noch Assembler gemacht wird...

wer braucht denn sowas?

von Kindergärtner (Gast)


Lesenswert?

Homo Siemensis schrieb:
> wer braucht denn sowas?
Es gibt sogar Leute hier die Assemblerprogrammierung einfacher, 
effizienter, schneller als C-Programmierung finden...

von Homo Siemensis (Gast)


Lesenswert?

Die Frage ist eine andere: Muss man das im Studium machen?

Im Studium sollte frontal das erklärt und behandlet werden, was die 
Meisten gebrauchen können. Assembler zählt da eher nicht sazu oder?

von DirkZ (Gast)


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

Homo Siemensis schrieb:
> Die Frage ist eine andere: Muss man das im Studium machen?
>
> Im Studium sollte frontal das erklärt und behandlet werden, was die
> Meisten gebrauchen können. Assembler zählt da eher nicht sazu oder?

Im Studium sollten die Grundlagen erklärt und das Verständnis für die 
innere Funktionsweise geschaffen werden. Oder hat sich dieses Ziel 
geändert, seit es Bätscheller gibt?

von Alex (Gast)


Lesenswert?

Zur Aufgabenstellung: Ich gehe davon aus, dass die Inhalte der Register 
vor dem Aufruf von show_regs Angezeigt werden sollen, d.h. du musst 
dafür sorgen, dass der Compiler nicht mit irgendwelchen 
Entry-/Exit-Sequenzen, dir die Registerinhalte überschreibt. Also musst 
du die Prozedur entweder komplett in Assembler schreiben oder sie als 
naked deklarieren (bei MSVC __declspec(naked), bei Gnu gibt's was 
Analoges mittels _attribute_ ).

Die erste Instruktion sollte dann PUSHA sein (ich gehe anhand der 
Registernamen von einer x86-Architektur aus), dann liegen alle General 
Purpose-Register auf dem Stack, danach kannst du über noch den 
Formatierungs-String auf den Stack legen und einfach Printf aufrufen, da 
die Register zwecks Parameter-Übergabe eh schon da liegen.

Danach den Stack bereinigen und mittels RET die Prozedur verlassen. Das 
sind ca. fünf Assembler-Instruktionen, plus Deklaration des 
Format-Strings.

So viel zum Vorgehen. Meine Meinung: für eine Informatik-Klausur ist die 
Aufgabe übertrieben. Da müssen schon im Vorfeld die 
x86-Aufrufkonventionen durchgekaut worden sein. Es gibt echt wichtigere 
Dinge, die in eine Informatik-Vorlesung gehören.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.