Forum: Mikrocontroller und Digitale Elektronik Assambler Frage 8086 auch code


von Tobias (Gast)


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!

von Karl H. (kbuchegg)


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.

von Tobias (Gast)


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.

von Tobias (Gast)


Lesenswert?

alles ok, hab den fehler, danke

von Tobias (Gast)


Lesenswert?

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

von Maxx (Gast)


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.

von Tomek (Gast)


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

von Tobias (Gast)


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.

von Tobias (Gast)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.