Assambler Frage 8086 auch code

Gast #1731403
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!
#1731462
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.
Gast #1731490
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.
Gast #1731506
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.
Gast #1732219
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
Gast #1734891
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.
Gast #1734900
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren