Forum: Mikrocontroller und Digitale Elektronik Assembler: Stack overflow bei div


von Peter93 (Gast)


Lesenswert?

Hallo, ich habe folgenden Programmcode:

.data
      D    equ  10          ; Teiler
      Zahl DW 76          ; Zahl
      ERG     DW   0          ; Ergebnis

; 
------------------------------------------------------------------------ 
--
.stack  16
; 
------------------------------------------------------------------------ 
--
.code
.startup

  mov ax,zahl
  mov bx,D
  div bx
  add AL,AH
  and ax,00FFh
  add AX,30h
  mov ERG,AX

.exit

und das Problem, dass ein Stack overflow bei div bx kommt. Woher kommt 
dieser und wie löse ich das?

von Heinz V. (heinz_v)


Lesenswert?

Lis mal unter DIV in der Befehlsreferenz nach, DIV BX teilt ein 
Doubleword (in DX,AX) durch BX Ergebniss (AX Rest in DX), DIV BL teilt 
ein Word aus AX durch das Byte BL und Plaziert Ergebniss in AL und Rest 
in AH.

von Peter93 (Gast)


Lesenswert?

Vielen Dank, habe ich ganz übersehen. Mit div dl klappts :)

von rbx (Gast)


Lesenswert?

Ich hätte ja jetzt div bl erwartet. Aber kannst du Teiler und Ergebnis 
nicht auch gleich so nennen, oder ist der Assembler (oder die Denke) 
noch aus der 8 Bit - Ära?

von Heinz V. (heinz_v)


Lesenswert?

rbx schrieb:
> Ich hätte ja jetzt div bl erwartet. Aber kannst du Teiler und Ergebnis
> nicht auch gleich so nennen, oder ist der Assembler (oder die Denke)
> noch aus der 8 Bit - Ära?

Naja, DIV BL und DIV BX unterscheiden sich zwar nicht mathematisch, aber 
DIV BX benötigt ja zusätzlich zum AX und BX Register noch DX für das 
Highword des Ausgangswertes und den Rest der Division im Ergebniss, man 
möchte bei Word/Byte ja kein zusätzliches Word Register unnötigerweise 
manipulieren (bzw. vor der Div. PUSHen und danach POPen)

von M. S. (siekmanski)


Lesenswert?

xor dx,dx    ; clear dx, -> REST
 mov ax,Zahl
 cwd         ; convert word to doubleword
 mov bx,D
 div bx
 mov ERG,ax
 mov REST,dx

: Bearbeitet durch User
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.