unsigned char etc. in Assembler!

Hallo,

ich wusste nicht so recht wo ich das hier hätte hin Posten sollen also in die Plauderecke!
Da ich nun wieder über 2 Stunden damit verbracht habe Rum zu googlen und gescheitert bin kommt der Post mal hier :)

Meine Frage ist eigentlich ganz leicht.
Wie bekommt man ein unsigned char z. B. in Assembler hin?
Wenn im Assembler eine Variable DW 8 Bit erstellt ist diese doch immer Zweierkomplement behaftet oder? Wenn JA frage ich mich wie in C/C++ ein unsigned char dann den Werte Bereich 0 - 255 haben kann.
Mir ist klar das ich bei 2^8 = 256 Zahlen ansprechen kann. Mir geht es nur darum irgendwie müssen doch die Bits interpretiert werden. Wenn dann vorne eine 1 Steht ist es im Zweierkomplement eine - Zahl. Wie kommt man dann auf eine Positive Zahl.

Ich dachte eben ganz naiv da gibt es ein Register dort kann man das hinterlegen / eintragen. Es gibt ja auch imul, idiv die mit Vorzeichen rechnen und mul, div die ohne Vorzeichen rechnen? Also irgendwie muss man ja eine Variable erschaffen können in Assembler deren Wertebereich auch nur Positv ist nur wie?

Das ist mehr eine Theoretische und Allgemeine Frage. Brauch keinen Code wollte eigentlich nur mal wissen wie das Register dann heißt falls es ein solches gibt.

Ich hoffe meine Frage kann man verstehen.

LG
 
Genau. Ob das erste Bit teil des Wertbetrags oder das Vorzeichen sein soll, liegt im Ermessen des Programmierers.

In ASM gibt es auch kein char oder ints oder solchen Quatsch. Ob du ein Byte als Zahl oder als Zeichen interpretierst, ist dir allein überlassen. In ASM gibt es nur Register mit einer definierten Bitbreite.


Ich dachte eben ganz naiv da gibt es ein Register dort kann man das hinterlegen / eintragen. Es gibt ja auch imul, idiv die mit Vorzeichen rechnen und mul, div die ohne Vorzeichen rechnen? Also irgendwie muss man ja eine Variable erschaffen können in Assembler deren Wertebereich auch nur Positv ist nur wie?

Das ist mehr eine Theoretische und Allgemeine Frage. Brauch keinen Code wollte eigentlich nur mal wissen wie das Register dann heißt falls es ein solches gibt.
Es gibt (je nach Architektur unterschiedlich viele) Register, die rechnen können. Und es gibt ein Register, das Auskunft über einige Besonderheiten der letzten Rechenoperationen gibt. Da zeigt das erste Bit z.B. an, ob es einen Überlauf gab, nach einer Bitschiebeoperation wird das herausgeschobene Bit im zweiten Bit dieses Registers gespeichert, usw.
 
Also für amd64 sollte Folgendes gelten:
64 bit32 bit16 bitobere 8 v. 16 bituntere 8 v. 16 bit
raxeaxaxahal
rbxebxbxbhbl
...............

Hinzu kommen noch die meist 128 bit-XMM...-Register sowie ein paar Spezialregister.

Wie eine Zahl dargestellt wird das entscheidest Du...
 
Danke für eure Antworten.
Habe dann auch in einem Englischen Forum eine Antwort gefunden:

You are viewing this subject in a bad angle here. Let us say that the most number of bits that our data-bus can handle is 4 so we have 4-bit numbers (whether signed or unsigned). Now if you try to add 1110 + 1010 for example, the ALU computes this addition just like normal binary addition and it wouldn't care if it is signed or unsigned. The only one that has to be worried about it being signed or unsigned is the programmer. So there is no difference between -1 and 1 for the CPU except the fact that 32-bit -1 is shown as 0xFFFFFFFF and 1 is 0x00000001. So if you for example want to calculate -1 + 1 (which results in 0), you will give 0xFFFFFFFF to the CPU and add 0x00000001 to it. (At this point, the CPU just does the addition and it wouldn't care if they are signed or unsigned).

So now you have:

0xFFFFFFFF +
0x00000001 =
-----------
0x00000000 (Carry Flag = 1, Auxiliary flag = 1 although you don't need to worry about the Auxiliary flag).

When the carry flag is set, you have the answer in 32-bit DWORD which is 1. This is just in case you interpreted these values as signed values so that you say 0xFFFFFFFF is -1 and 0x00000001 is 1 but for the CPU 0xFFFFFFFF is equal to (2^32)-1 = 4294967295 = 0xFFFFFFFF. So when you ask the CPU to add 4294967295 (0xFFFFFFFF) and 1 (0x00000001), it will definitely add them as unsigned numbers and it will set the flags accordingly. Now if you interpret the number as a signed value, the carry should mean nothing to you because you were not looking for carry but otherwise it (the carry) tells you that in the process of adding two (unsigned) numbers, the carry flag is set and thus this means that the addition could not be completed in only 32-bits.

I hope that helps. Just look at every number as an unsigned number unless you feel the explicit need to use them as unsigned numbers because the CPU doesn't care.
Die Interpretation ist vom Programmierer abhängig ob ich sage 2er Kompliment oder eben unsigned (1er Kompliment) :)
Danke für eure schnelle Hilfe :) Hab mir den Wolf gesucht :D

LG
 
Hier habe ich noch etwas:
C:
#include <stdio.h>
#include <inttypes.h>

int main()
{
	uint8_t a = 0 - 1;
	uint16_t b = 0 - 1;
	uint32_t c = 0 - 1;
	uint64_t d = 0 - 1;
	printf("%u\n", a);
	printf("%u\n", b);
	printf("%u\n", c);
	printf("%" PRIu64 "\n", d);
	printf("%x\n", a);
	printf("%x\n", b);
	printf("%x\n", c);
	printf("%" PRIx64 "\n", d);
	return 0;
}
Code:
$ ./a.exe
255
65535
4294967295
18446744073709551615
ff
ffff
ffffffff
ffffffffffffffff
Code:
	movb	$-1, -1(%rbp)
	movw	$-1, -4(%rbp)
	movl	$-1, -8(%rbp)
	movq	$-1, -16(%rbp)
	movzbl	-1(%rbp), %eax
	movl	%eax, %edx
	leaq	.LC0(%rip), %rcx
	call	printf
	movzwl	-4(%rbp), %eax
	movl	%eax, %edx
	leaq	.LC0(%rip), %rcx
	call	printf
	movl	-8(%rbp), %eax
	movl	%eax, %edx
	leaq	.LC0(%rip), %rcx
	call	printf
	movq	-16(%rbp), %rax
	movq	%rax, %rdx
	leaq	.LC1(%rip), %rcx
	call	printf
	movzbl	-1(%rbp), %eax
	movl	%eax, %edx
	leaq	.LC2(%rip), %rcx
	call	printf
	movzwl	-4(%rbp), %eax
	movl	%eax, %edx
	leaq	.LC2(%rip), %rcx
	call	printf
	movl	-8(%rbp), %eax
	movl	%eax, %edx
	leaq	.LC2(%rip), %rcx
	call	printf
	movq	-16(%rbp), %rax
	movq	%rax, %rdx
	leaq	.LC3(%rip), %rcx
	call	printf
	movl	$0, %eax

Spannend oder? Er packt alles in rbp... Für die einzelnen Ausgaben wird eax und edx bemüht und auch rax und rdx bei 64 bit...
 
Er "packt" nicht alles in rbp. Das rbp Register wird als Basisadresse für den Hardwarestack (Bereich des virtuellen Speichers, der als Callstack verwendet wird) verwendet. Das Register wird vom Inhalt her in dem von dir gezeigten Code nicht angefasst. Es wird lediglich für die relative Adressberechnung der mov's verwendet. -4(%rbp) in AT&T Assembly Syntax z.B. bedeutet: Lese den Wert des Registers rbp aus, subtrahiere 4 davon und verwende das Ergebnis als eine Zieladresse (hier für das mov).
 
Mal eine andere Frage.
Muss man so etwas heute noch wissen? Klar ist es nicht verkehrt so etwas zu wissen aber wird es noch verlangt?
Ich stehe ja was Programmierung an geht noch fast bei 0. Was habe ich schon groß Programmiert, etwas Java ja Okay aber auch keine Projekte. Nun geht es mit etwas C/C++ weiter.
Ich stelle mir immer wieder die Frage was ihr Beruflich macht bzw. wo Ihr dieses Wissen her habt und wie lange es dauert sich ein solchen Wissen an zu eignen. Wenn ich mir überlege das ich 1 Jahr gebraucht habe für das bisschen Java :( Komme ich mir echt verloren vor :( "als könnte man einfach nichts!"

Danke nochmals für eure Hilfe und eure Antworten :)

LG
 
Ja oder so...
Ja den Funktionsprolog des Callee (hier main) habe ich weggelassen, da sich dieser ja bei jedem "Dialekt" unterscheidet...
Aber so ganz verstanden habe ich das (mit der relativen Adressierung) noch nicht und per Hand hätte ich das anders geschrieben. Vielleicht könnt ihr mir das nochmal erklären.
 
@ocsme Ich denke, für Compilerbauer könnte das wichtig/interessant sein. Aber ich ist auch nur ein Teilgebiet der Informatik. Eben wie die griechische Mythologie auch nicht nur aus... Zeus sage ich jetzt mal... besteht.
 
K

kneitzel

Muss man so etwas heute noch wissen? Klar ist es nicht verkehrt so etwas zu wissen aber wird es noch verlangt?
Ich stehe ja was Programmierung an geht noch fast bei 0. Was habe ich schon groß Programmiert, etwas Java ja Okay aber auch keine Projekte. Nun geht es mit etwas C/C++ weiter.
Ich stelle mir immer wieder die Frage was ihr Beruflich macht bzw. wo Ihr dieses Wissen her habt und wie lange es dauert sich ein solchen Wissen an zu eignen. Wenn ich mir überlege das ich 1 Jahr gebraucht habe für das bisschen Java :( Komme ich mir echt verloren vor :( "als könnte man einfach nichts!"
Also das hängt immer davon ab, was Du denn genau machen willst. Assembler spielt in vielen Bereichen absolut keine Rolle. Software Entwicklung spielt sich im Bereich der Entwicklung von Anwendungen in Hochsprachen statt. Aber es gibt natürlich Bereiche, in denen man ein tiefes Verständnis benötigt. Tobias hat hier z.B. den Compilerbau angesprochen. Aber es gibt deutlich mehr - Hardware will ja auch gebaut werden und so.....

Generell ist es aus meiner Sicht kontraproduktiv, zig Programmiersprachen zu lernen. Erst Java und dann C/C++? Was lernst Du durch das Lernen der genauen Syntax von der nächsten Sprache? (So diese zu der gleichen Art von Sprache gehört. Sinn macht es schon, diverse Herangehensweisen zu kennen, also neben den prozeduralen / objektorientierten Sprachen halt noch logische und funktionale Sprachen.

Wenn es um die Menge des vermittelten Wissens geht: Was ist die Erwartungshaltung? Das Feld der Software Entwicklung ist extrem groß und man benötigt hier ein relativ breites Wissen. Was kann man da in nur einem Jahr lernen? Vor allem: was hast Du in dem Jahr noch alles gemacht? Hast Du Dich Vollzeit mit dem Thema beschäftigt?

Wenn man nur wenige Stunden die Woche Zeit mit etwas verbringt, dann ist das Ergebnis entsprechend. Die Erwartung an z.B. drei Jahre Informatik LK mit 6 Schulstunden Schule und von mir aus noch einmal 6 Schulstunden Hausaufgaben macht dann gerade mal 9h pro Woche. Ein Junior Software Engineer wird sich 30-40h / Woche damit beschäftigen.
(Urlaub und so lasse ich mal außen vor. Aber die Auszeiten in Schule und Studium sind doch höher als die gesetzlichen 25 Tage Urlaub ... auch wenn viele wohl vertraglich auch 30 Tage haben werden ....)

Daher ist das vollkommen normal. Und daher ist auch meine Empfehlung ganz klar, dass man da lieber das Wissen entsprechend erweitern sollte. Nicht die 101te Sprache lernen. Lern die Konzepte und dann die Vertiefung durch Anwendung.

Alleine schon zu sehen, was alles notwendig ist, kann schon ein gewissen Aha Effekt haben. Noch nie ein richtiges Projekt gemacht.... Ist auch klar: wann in welchem Rahmen hättest Du das auch machen können?

Ganz wichtig: das ist keine Abwertung! Es soll nur eine kleine Außensicht sein. Und die soll nicht demotivieren sondern genau das Gegenteil:
Das was Du gemacht hast, hilft Dir (und auch Anderen) jetzt sagen zu können: Macht mir das Spaß? Will ich damit (viel) Zeit zubringen? Beruf sollte doch sowas wie Berufung sein. Ich würde jedem wünschen, ein Hobby zu seinem Beruf machen zu können.
Und Feinheiten kommen dann später auch ... Die Aufgabenbereiche sind ja vielseitig und da kann man sich dann auf Dinge spezialisieren, die einem mehr Spaß machen oder einen mehr interessieren.... (ich bin z.B. mehr der Backend Entwickler. Die CSS Styles überlasse ich sehr gerne Anderen ...)

Und natürlich ist das, was Du in dem einen Jahr gelernt hast, (meist) sinnvoll. Leute machen sich da ja Gedanken, was z.B. in der Schule vermittelt werden soll. Da geht es um wichtige Grundlagen. Ein Verständnis, wie z.B. Daten verwaltet werden können (Listen und Suchbäume wirst Du später eher seltener selbst schreiben) oder wie Dinge sortiert werden können (oder andere Basis Algorithmen) ist in meinen Augen extrem wichtig, den darauf baut man massiv auf.

Das erklärt dann auch den Tipp von mir aus anderen Threads: wenn man da für sich schon erkannt hat: ‚das will ich machen’, dann heißt es: bewerben! Noch ein Jahr mehr bringt nur begrenzt etwas in Teilzeit. Das was du in einem Jahr selbst lernst wirst du in Vollzeit ‚on the job‘ in viel kürzerer Zeit lernen mit ganz anderer Unterstützung. Und Du wirst Einblick in Dinge erhalten, in die Du sonst eher keinen Einblick bekommst.
 
@ocsme : Was machst du gerade? Im Studium wirst Du es brauchen , einfach weil es für bestimmte ICs noch keinen C Compiler gibt, wohl aber Assemblersprache, imo - und diese möchten Ja auch programmiert werden... Es ist aber auch richtig, dass sich der überwiegende Teil der Softwareentwicklung in Hochsprachen abspielt, dennoch wird man wahrscheinlich um asm nicht drumherumkommen - und Du darfst auch nicht außerachtlassen, dass Java nicht in asm übersetzt wird, sondern in zu interpretierenden Bytecode, also dass Java nicht in Maschinensprache übersetzt wird.

Ich brauche das manchmal für solche Spielereien, um in einem Prozess den Programmspeicher eines anderen Prozesses durch Aufrufe von Syscalls zu ändern, um dessen Verhalten zu ändern.... Also zB wird die XP irgendwo mit 10 multipliziert: Ändere diese Stelle, springe zu einer anderen Speicherstelle, multipliziere den XP-Wert mit 100, springe zurück zur ursprünglichen Stelle usw. - und stürze dabei nicht ab... Mal ein Buzzword: SetWindowsHookExA...
 
Und zudem... fängt man auch nicht mit AMD64 an... sondern sucht sich etwas leichteres....

Ehe man nicht richtig Schwimmen kann und in guter Verfassung dafür ist, macht man auch nicht das Totenkopf(schwimm)abzeichen...
 
Mal eine andere Frage.
Muss man so etwas heute noch wissen? Klar ist es nicht verkehrt so etwas zu wissen aber wird es noch verlangt?
Wie @kneitzel schon völlig richtig sagte: Es kommt darauf an, was du machst/machen willst.

Assembler war die erste Programmiersprache, die ich gelernt habe (noch vor meinem E-Technikstudium). Allerdings für 8-Bit-AVRs, nicht für Desktopprozessoren. Ich habe mich damals für ASM entschieden weil es immer hieß, da lernt man am meisten was unter der Haube abläuft.
In der Tat habe ich ASM nie wirklich gebraucht. Aber als wir im Studium C gelernt haben war ich einer der wenigen, die mit Pointern keinerlei Verständnisprobleme hatten.
Auch im Hardwarebau wird ASM heute selten benötigt, man wird vorraussichtlich nur mit C auskommen. Dennoch werden die, die ASM-Kenntnisse im Hinterkopf haben, öfter irgendwo besser sein, Probleme vorhersehen und pragmatischere Lösungen haben als Leute ohne ASM-Kenntnisse.
Vielfach wird ja auf ressourcensparendes Programmieren wertgelegt, und so mancher Entwickler versteigt sich dann zur Diskussion, ob man die Abbruchbedingung einer Schleife lieber mit x < y oder !(x >= y) formuliert. Wer etwas ASM kennt weiß, daß diese Diskussion grober Unfug ist, vertane Zeit.


Ich stelle mir immer wieder die Frage was ihr Beruflich macht bzw. wo Ihr dieses Wissen her habt und wie lange es dauert sich ein solchen Wissen an zu eignen. Wenn ich mir überlege das ich 1 Jahr gebraucht habe für das bisschen Java :( Komme ich mir echt verloren vor :( "als könnte man einfach nichts!"
Naja...beruflich sitze ich gerade an meiner Masterarbeit, habe für mein Studium relativ lange gebraucht und nicht unbedingt die besten Noten, weil ich das Formula Student Team, Werkstudentenarbeit oder private Projekte wichtiger und interessanter fand als das höchst unproduktive und lanweilige Klausurenschreiben.
Viel Wissen habe ich z.B. aus Internetforen: die Probleme anderer Leute sind oft interessant und irgendwann einfacher als die eigenen. Messebesuche, private Projekte, ... "Studium" ist halt mehr als nur an einer Hochschule immatrikuliert zu sein, Vorlesungen zu lauschen und Klausuren zu bestehen.
Wissen anzuhäufen ist ein langwieriger Prozess, das dauert seine Zeit und kann auch nicht abgekürzt werden. (Auch wenn so mancher Bildungsminister das glaubt.)
 
Guten Tag,

vielen Lieben Dank für eure Antworten :)
Das macht mir wieder MUT meinen WEG so weiter zu GEHEN :)
Ich komme oft von meinem eigenen Weg ab und verzettel mich immer wieder! Denn es ist wie du sagst Lernen ist ein langwieriger Prozess.

Entschuldigung das ich mich jetzt erst melde. Es soll nicht so aussehen als hätte ich kein Interesse mehr gezeigt. Leider hatte ich in den Letzten Tagen einiges um die Ohren :(

Naja ich bekomme ehrlich gesagt nur mein Studium gebacken! Zeit für private Projekte, Messebesuche, Arbeiten gehen ist ehrlich gesagt bei mir nicht drin. Ich habe für 2 Mathe schiene insgesamt 4 Semester benötigt! WIESO ganz einfach weil ich von der Hauptschule komme, danach MIttlerereife und dann Schwerpunkt Wirtschaft Höhereberufsfachschule absolviert habe und rein gar nichts von dem Stoff hatte (Was dann in Mathe1/2 bei uns im Informatik Studium benötigt wird) ! Doch ich habe die Scheine hin bekommen wo die aller meisten Studis dran hängen (scheitern!), selbst die Leute die von "besseren" Schulen kommen :) Das soll doch auch etwas heißen :D

Nochmals Danke :)

LG
 
Naja ich bekomme ehrlich gesagt nur mein Studium gebacken! Zeit für private Projekte, Messebesuche, Arbeiten gehen ist ehrlich gesagt bei mir nicht drin. Ich habe für 2 Mathe schiene insgesamt 4 Semester benötigt!
Ja...das ist durchaus normal. Lass dir etwas Zeit, wenn es dir irgendwie möglich ist. Man gilt als Absolvent mittlerweile nicht mehr unbedingt als gut, wenn man sein Studium mit Bestnoten in Regelstudienzeit abgerissen hat. Der Grund dafür ist einfach: es kommen viele Studenten mit guten Noten und relativ kurzer Studiendauer von der Uni und die Firmen stellen zunehmend fest: Die können nix.

Lass den Stoff sacken, sieh zu daß du möglichst viel davon behältst und deine Interessen wenigstens ein wenig ausleben kannst. Und ganz wichtig: vermeide unter allen Umständen Bolemielernen.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben