mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assambler Frage 8086 auch code


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich wollte mal fragen ob einer mal mein Programm kontrollieren 
kann.
Aber zuerst hab ich noch ne andere Kleinigkeit. in einem 16 Bit Register 
steht der Wert 90C7. Der entspricht ja dezimal 37063 wenn sf nicht 
gesetzt ist aber wie sieht es aus wenn sf gesetzt ist?


So nun zu meinem Prog.: Ich habe eine Gleichung mit z= ((x*2+y)/20).
Für x und y sol ich jeweils eine Byte Variable mit vorzeichenbehafteten 
Initialwert und für Z eine Byte Variable für den Quotienten und eine für 
den Divisionsrest.Beide sollen keinen bestimmten Initialwert haben. Weil 
vorzeichenbehaftet muss imul und idiv benutzt werden.
Jetzt hab ich das raus:

.data  x DB 12
       y DB 6
       Z DB ?;?;? ;1Byte Quotient
                  ;2Byte Rest
;-------------------------------------------
.stack 16  ;16Byte stack reserviert
;-------------------------------------------

.code
.startup
mov al, x
mov bl, 2
imul bl
mov bl, y
add bl
mov bh, 20
idivbh
mov z[0], ah
mov z[1], al
.exit


ist das soweit ok oder hab ich da nen Fehler drin?
Hoffe Ihr könnt kurz helfen. Danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke einer deiner Hauptfehler besteht darin, dass du hier

imul bl
mov bl, y
add bl

davon ausgehst, dass das Ergebnis der Multiplikation wieder nur 8 Bit 
haben wird und du daher nur mit 1 Byte weiterrechnest.

Im übrigen: Versuch macht kluch. Warum probierst du die Sequenz nicht 
einfach aus, anstatt hier zu warten? Den 9 Zeiler hast du schneller 
durch den Assembler und Debugger gejagt, als du hier die Überschrift 
schreiben kannst.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke,

also wäre es besser mit

datseg SEGMENT
var_x db01
var_y db02
var_z db?
var_zr db?
datseg ENDS

mov ax,3
mul var_x
add ax, var_y
div 20
mov var_z, al
mov var_zr, ah
.exit

da ich jetzt ax benutze passt es oder? bin auch gerade dabei mir den 
assambler zu besorgen.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles ok, hab den fehler, danke

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber wie sieht es denn nun mit der Hex zahl in dezimal aus wenn sf 
gesetz ist? wie komme ich auf den wert?

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Signed-Flag hat nichts mit der Interpretation von Registern zu tun.
Das SF wird von den verarbeitenden Befehlen gesetzt (z.B. beim Compare)

Die Interpretation des Wertes hängt nur von den Befehlen ab, die du 
benutzt.
IMUL wird es als signed (1er Komplement) interpretieren. MUL als 
unsigned.

Autor: Tomek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias schrieb:
> aber wie sieht es denn nun mit der Hex zahl in dezimal aus wenn sf
> gesetz ist? wie komme ich auf den wert?

Der Emu8086 hat auch nen Umrechner den findest du bei Math -> Number 
Converter. Dort wird dir auch der signed und unsigned Wert deiner 
Hexadezimalzahl angezeigt.
Willst du den Wert von Hand umrechnen musst du mit dem 2er Komplementär 
aus der Digitaltechnik Vorlesung rechnen.
Also kurz gesagt:
alle Bits Invertieren
1 addieren
Ergebnis steht nun im 2er Komplementär da

Für deine 90C7h (37063) ergeben sich 6F39h und dies ergibt -28473 
dezimal

Schöne Grüße an Prof. Münke

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Tomek,
jupp grüße den Münke ;-)
Hab das mit dem Programm aus meinem ersten Beitrag leider doch nicht hin 
bekommen. Kannst du mir da mal auf die sprünge helfen?
Assembler ist leider echt nicht mein ding.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist was ich habe,

.data x db 12
      y db 06
      z db ?,?,?

.stack 16
.code
.startup

mov al,x
mov bl,2
imul bl
mov bl,y
add bl
mov bh,20
idiv bh
mov z[0],ah
mov z[1],al
.exit


bei x db 12 und y db 06 kann ich ja im Prinzip jede Zahl einsetzen oder? 
gebe damit doch nur an welchen wert x bzw. y haben soll, richtig?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.