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.
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
}
^
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.
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.
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.
Homo Siemensis schrieb:> wer braucht denn sowas?
Es gibt sogar Leute hier die Assemblerprogrammierung einfacher,
effizienter, schneller als C-Programmierung finden...
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?
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?
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.