Die Mathe-Redaktion - 17.11.2018 04:34 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt1 im Schwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 332 Gäste und 4 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Einführung Assembler: Addition anhand eines Beispiels
Druckversion
Druckversion
Antworten
Antworten
Autor
Kein bestimmter Bereich Einführung Assembler: Addition anhand eines Beispiels
kleinesengel
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 30.04.2008
Mitteilungen: 949
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2018-07-20


Hallo,

ich befasse mich ein wenig mit den Grundlagen von Assembler und betrachte das Addtionsbeispiel von hier
Assembler
 org 100h
 start:
   mov bx, 500h
   add bx, [summand1]
   mov [ergebnis], bx
   mov ah, 4Ch
   int 21h
 section .data
   summand1 DW 900h
   ergebnis DW 0h

Was wird genau hier beschrieben?
Ich fange einfach mal an:
Assembler
 org 100h // Counter startet hier
 start: // Programm startet
   mov bx, 500h // h steht für hexadezimal; die Zahl 500 wird in das BX-Register überführt
   add bx, [summand1] // summand1, also die Zahl 900 wird in das BX-Register überführt und auf die 500 drauf addiert
   mov [ergebnis], bx // Ausgabe Ergebnis im BX-Register
   mov ah, 4Ch
   int 21h
 section .data
   summand1 DW 900h // DW steht wohl für eine 2 Byte Breite
   ergebnis DW 0h // Ergebnis wird oben wohl auf 0 gesetzt

So ... wenn ich 500 + 900 rechne, ergibt das 1400.
Laut dem Beispiel steht im BX-Register das Ergebins '0E00'
'0E00' wäre die die wissenschaftliche Schreibeweise für Exponenten.
Wird der Speicher direkt überschrieben, sodass zum Schluss im Register 0 gesetzt wird?

LG





  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26562
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2018-07-20


Hi kleinesengel

Soooo verkehrt liegst du mit deiner Analyse gar nicht.
ASM
org 100h              ; Code ab dieser Adresse im Speicher ablegen
start:                ; könnte auch HUGO oder sonstwie heißen
   mov bx, 500h       ; h=Hex ist richtig, aber warum ignorierst du das dann?
                      ; 500h=1280 dezimal
   add bx, [summand1] ; der Wert an der Adresse summand1 wird zu BX addiert
   mov [ergebnis], bx ; der Wert von BX wird an der Adresse ergebnis abgelegt
   mov ah, 4Ch        ; 4Ch = Funktionscode "Programm beenden"
   int 21h            ; DOS Funktion aufrufen => beendet Programm
section .data
   summand1 DW 900h   ; DW : Declare Word, ein 2-Byte Speicherbereich
                      ; wird mit 900h=2304 dezimal vorbelegt
   ergebnis DW 0h     ; dto. mit 0 initialisiert

Zu Rechnung:
500h+900h=E00h
Dezimal:
1280+2304=3584

Zu den Funktionen, die der Interrupt 21h auslösen kann siehe z.B. hier.
Speziell der hier verwendete: INT 21,4C (eigentlich INT 21h,4Ch)

Gruß vom ¼


-----------------
Bild



  Profil  Quote  Link auf diesen Beitrag Link
kleinesengel
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 30.04.2008
Mitteilungen: 949
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2018-07-20


wow ... vielen Dank!
Das hilft schonmal enorm viel.

Kennst du vill. gute Einführungsbücher oder auch Skripte?

LG



  Profil  Quote  Link auf diesen Beitrag Link
gonz
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 16.02.2013
Mitteilungen: 2934
Aus: Oberharz
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2018-07-20


Hallo Kleinesengel,

"'0E00' wäre die die wissenschaftliche Schreibeweise für Exponenten."

hiermit liegst du falsch, mit 0E00 ist eine Zahl in hexadezimaler Schreibweise gemeint, es ist 0500 + 0900 = 0E00

man kann auch in hexadezimalen Zahlen stellenweise rechnen, dh wir benötigen 5+9, das ist im dezimalen 14, und 14d = Eh


Grüsse aus dem Harz sendet
Gerhard/Gonz





-----------------
to fight! (Don Quijote de la Mancha)



  Profil  Quote  Link auf diesen Beitrag Link
kleinesengel
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 30.04.2008
Mitteilungen: 949
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2018-07-21

ASM
section .data
   summand1 DW 900h   ; DW : Declare Word, ein 2-Byte Speicherbereich
                      ; wird mit 900h=2304 dezimal vorbelegt
   ergebnis DW 0h     ; dto. mit 0 initialisiert

'section .data' sogt dafür, dass hinter dem letzten Befehl des Programms Speicher für Daten reserviert wird.
DW daher, weil 1-Byte aus 8-Bits besteht, welche mit 0en und 1en gefüllt werden können. Also 2-Byte umfasst 16-Bits. Der Assembler schreibt dann '900h' übersetzt in die entsprechende Adresse '100100000000'. Der Binärcode von '900h' umfasst 12-Bits. Was passiert mit den restlichen 4-Bits?

LG



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26562
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2018-07-21


Die 12 Bit werden rechtsbündig geschrieben, links wird mit 0en aufgefüllt, also 0000100100000000.
Wie im Dezimalsystem: 7025 ist das Gleiche wie 00000000007025 (führende Nullen).



  Profil  Quote  Link auf diesen Beitrag Link
kleinesengel
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 30.04.2008
Mitteilungen: 949
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2018-07-23


Einen Schritt weiter: 'Bedingte Sprünge'
Bei Sprungbefehlen wird neben dem 'Carry Flag' auch das 'Zero Flag' geprüft.
Warum ausgerechnet das 'Zero Flag'?

LG



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26562
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2018-07-24


Ein Test, ob ein Wert 0 (Null) ist, oder auch nicht, wird häufig benötigt. Z.B. ein Countdown, ob eine Liste leer ist (Länge 0), etc.



  Profil  Quote  Link auf diesen Beitrag Link
kleinesengel
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 30.04.2008
Mitteilungen: 949
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2018-07-24


ah ... ok!
Ich hatte einen Denkfehler ...
Im 'Flag-Register' befinden sich Infos wie: Carry-Flag, Zero-Flag, ...
Ich bin bisher davon ausgegangen, dass diese auch in z.B. 'AX-Register' zu finden sind.
Die beiden Register sind aber komplett unterschiedlich!

LG



  Profil  Quote  Link auf diesen Beitrag Link
kleinesengel
Aktiv Letzter Besuch: im letzten Quartal
Dabei seit: 30.04.2008
Mitteilungen: 949
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, vom Themenstarter, eingetragen 2018-07-24


z.B. die Rechnung

    0000 1101 (Operand1)
-   0001 1010 (Operand2)
Ü 1 111   1
-------------
    1111 0011

Die vordere '1' im Übertrag wäre der 'Carry-Flag'.
Im 'Flag-Register' wird doch dann eine '1' gesetzt?
Wie läuft das mit dem 'Zero-Flag'?




  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26562
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, eingetragen 2018-07-24


Das Zero-Flag wir gesetzt, wenn das Ergebnis einer Operation Null ist.
Das muß nicht unbedingt eine Rechnung sein, sondern auch schon beim Laden eines Registers mit einer Null.

Aber das ist doch logisch, wenn das Ding Zero-Flag heißt. Und sowas kann man auch nachlesen.



  Profil  Quote  Link auf diesen Beitrag Link
kleinesengel hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2018 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]