1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Assembler Zahl positiv machen

Dieses Thema im Forum "Sonstige Sprachen" wurde erstellt von üäpöol, 21. Februar 2012.

  1. üäpöol

    üäpöol Erfahrenes Mitglied

    Hi,

    ich hab ein kleines Problem mit Assembler. Ich habe eine Variable, die entweder positiv oder negativ ist. Wenn sie negativ ist, soll die Zahl positiv gemacht werden. Ich möchte das ganze aber ohne Abfrage machen.
    Ich habe folgendes versucht, was aber an der Variable nichts ändert.
    [ASM]
    mov ax, word [Var]
    mov bx, 1
    mul bx
    mov word [Var], ax
    [/ASM]
    Var bleibt aber negativ. Die Idee war ohne Vorzeichen mit eins multiplizieren, wodurch die Zahl entweder positiv bleibt oder wird.
    Weiß jemand, warum der Code nicht funktioniert, oder hat einen anderen Lösungsvorschlag?

    Danke im Voraus. :)
  2. deepthroat

    deepthroat Premium-User

    Hi.
    Ha, ha, ha. Selten so gelacht. ;) Denk nochmal drüber nach... Stichwort "neutrales Element", Multiplikation, natürliche Zahlen...

    Warum setzt du denn nicht einfach das Vorzeichenbit?

    Gruß
  3. üäpöol

    üäpöol Erfahrenes Mitglied

    Hi,

    ist ja schön, wenn ich dich zum Lachen bringen konnte. :)
    Ich bin leider blutiger Anfänger mit Assembler und verstehe leider nicht ganz, wie ich ein Vorzeichenbit setzen kann und was du mit neutrales Element meinst. :D
  4. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    Hi,

    Das Thema wird zum Beispiel hier erklärt.
    Abstrakt gesagt musst du eigentlich nur alle Bits in dem Byte umdrehen, bin mir aber auch nicht mehr sicher.

    Gruß,
    BK
  5. deepthroat

    deepthroat Premium-User

    Stichwort Bitoperationen.

    Wie werden denn bei dir überhaupt neg./pos. Zahlen repräsentiert? Zweierkomplement? Dann müßtest du doch das MSB testen und dann umrechnen.
    https://de.wikipedia.org/wiki/Nullelement

    Gruß
  6. üäpöol

    üäpöol Erfahrenes Mitglied

    Tut mir Leid, wenn ich euch auf die Nerven gehe, aber ich bin wie gesagt - blutiger Anfänger... Ich weiß leider nicht mal wie negative Zahlen dargestellt werden. Wiegesagt möchte ich das mit möglichst wenig Code lösen.
    Zu den Bitoperationen: Was passiert, wenn die Zahl schon positiv ist?
  7. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

    Hi,

    hier mal ein paar Beispiele, wie Zahlen auf Bitebene in einem Byte aussehen:
    Code (Text):
    1.  
    2.   -1: 1111 1111
    3.    1: 0000 0001
    4.  -15: 1111 0001
    5.  127: 0111 1111
    6. -128: 1000 0000
    7.  
    Positiv machen kannst du diese, indem du die Zahl nimmst, ein exklusives Oder mit -1 (alle bits gesetzt)
    machst und anschließend noch +1 rechnest.

    Da meine ASM-Kenntnisse nicht gerade die Besten sind, folgende Angaben ohne Gewähr:
    [ASM]
    ; In EAX ist die Zahl
    XOR EAX, -1
    INC EAX
    [/ASM]

    Grüße,
    BK
  8. üäpöol

    üäpöol Erfahrenes Mitglied

    Danke, wie wird denn zwischen 255 und -1 unterschieden?
  9. einfach nur crack

    einfach nur crack mag Cookies & Kekse

    Ganz einfach: wenn das erste Bit eine 1 ist, dann ist die Zahl negativ, ansonsten positiv. Deshalb gibt es keine 255. Der Wertebereich ist also –128 bis 127.
  10. üäpöol

    üäpöol Erfahrenes Mitglied

    OK. Jetzt versteh ich's. :) Das bedeutet, ich muss das erste byte der Variable/Register nur auf 0 setzten. Kann mir jemand sagen, wie man ein einzelnes byte setzt?
  11. deepthroat

    deepthroat Premium-User

    Nein, da die Werte (höchstwahrscheinlich) im Zweierkomplement gespeichert werden.

    Du mußt die Methode von Bratkartoffel verwenden. Dazu mußt du aber erstmal prüfen ob das MSB überhaupt 1 ist.

    \edit: wenn mich nicht alles täuscht gibt es auch eine NEG Operation.

    Gruß
  12. timestamp

    timestamp Mitglied Käsekuchen

    Nur um noch einmal grundlegene Mathematik hier rein zu bringen...
    1*1 = 1
    (-1) * 1 = 1 * (-1) = -1
    (-1) * (-1) = +1
  13. üäpöol

    üäpöol Erfahrenes Mitglied

    @timestamp
    Das ist klar, aber was hat das mit meinem Problem zu tun?

    EDIT:
    @deepthroat
    Das bedeutet, es gibt keine Möglichkeit die Zahl ohne Abfrage zuvor, positiv zu machen?
    Zuletzt bearbeitet: 21. Februar 2012
  14. deepthroat

    deepthroat Premium-User

    So klar schien dir das wohl nicht zu sein, da du mit 1 multipliziert hast und eine Veränderung des Wertes erwartet hast... :confused:
    Ja.

    Gruß
  15. üäpöol

    üäpöol Erfahrenes Mitglied

    Ich dachte mul multipliziert ohne Vorzeichen, oder?
  16. deepthroat

    deepthroat Premium-User

    Nein, es führt eine Multiplikation von vorzeichenlosen Zahlen durch.

    Du hast aber keine vorzeichenlosen Zahlen, sondern vorzeichenbehaftete.

    Egal ob signed oder unsigned, mul oder imul - trotzdem gilt immer x * 1 = x.

    Gruß
  17. üäpöol

    üäpöol Erfahrenes Mitglied

    Das war mir nicht klar. Das Problem hat sich geklärt.

Diese Seite empfehlen