2017-04-11 6 views
0

Die Variable 'Prima' hat 33h gespeichert und es sollte "3" drucken, aber es nicht, es druckt "0", wenn ich das Programm normal ausführe. Was mich nervt ist, dass ich DOSBox zum Debuggen verwende und wenn ich drücke, um die Ausgabe zu sehen, zeigt es "3" an (und das Registerfeld zeigt, dass AL 33h ist), wie es sollte.
Hat jemand dieses Problem schon einmal erlebt? Der Code berechnet Pi.TASM 8086 Ausgabe Ausgabe

data segment 
      s0 db 25 dup(0ah), 'pi= $' 
      s1 db 2 dup(0ah), ' $' 
      n dw 0     
      z dw 0    
      r dw 0   
      o dw 0 
      j dw 0     
      x dw 0     
      y dw 0 
      xp dw 0     
      yp dw 0 
      rp dw 0 
      cp dw 0    
      l db 0 
      css dw 0 
      patru dw 0 
      pi dw 0 
      prima dw 0 
      adoua dw 0 
      atreia dw 0 
      data ends 

      assume cs:code, ds:data 
      code segment 
      start: 
      mov ax,data 
      mov ds,ax 

      mov n,93 
      mov z,10 
      mov r,50 
      mov o,1000 
      mov j,1 
      mov ax,n 
      mov x,ax 
      mov l,0 
      mov css,56 
      mov patru,4 

     .for: 

      cmp j,1 
      jne .if1     

       mov ax,x    
       mul x 
       mov x,ax 

       cmp x,1000   
        ja .nrbununu  
        mov ax,x   
        mul z 
        mov x,ax 
        .nrbununu: 

       mov ax,x    ; x=x%1000/10 
       xor dx,dx 
       div o 
       mov ax,dx 
       xor dx,dx 
       div z 
       mov x,ax    ; 

       mov y,ax    ; y=x; 
       inc j    

      .if1: 



      cmp j,2 
      jne .if2    

       mov ax,y    
       mul y 
       mov y,ax 

       cmp y,1000   
        ja .nrbundoi  
        mov ax,y   
        mul z 
        mov y,ax 
        .nrbundoi: 

       mov ax,y    ; y=y%1000/10 
       xor dx,dx 
       div o 
       mov ax,dx 
       xor dx,dx 
       div z 
       mov y,ax    ; 


       mov ax,x    
       mul x 
       mov xp,ax 
       mov ax,y 
       mul y 
       mov yp,ax 
       mov ax,r 
       mul r 
       mov rp,ax   ; 

       mov ax,xp 
       add ax,yp 

       cmp ax, rp 
       ja .contor 
        inc bl 

       .contor: 
       mov j,1 

      .if2: 


     inc cx 
     cmp cx,56 
     jnle .forx 
     jmp .for 
     .forx: 

     mov ax,bx 
     mul patru 
     xor dx,dx 
     div css 
     mov prima,ax 
     add prima,48 
     mov ax,dx 
     mul z 
     div css 
     mov adoua,ax 
     add adoua,48 
     mov ax,dx 
     mul z 
     div css 
     mov atreia,ax 
     add atreia,48 

     mov dx, offset s0 
     mov ah,9 
     int 21h 

     xor ax,ax 
     xor dx,dx 
     mov ax,prima 
     mov dl,al 
     mov ah,2 
     int 21h 

     mov dl,2ch 
     mov ah,2 
     int 21h 

     xor ax,ax 
     xor dx,dx 
     mov ax,adoua 
     mov dl,al 
     mov ah,2 
     int 21h 

     xor ax,ax 
     xor dx,dx 
     mov ax,atreia 
     mov dl,al 
     mov ah,2 
     int 21h 





     mov ah,4ch 
     int 21h 
     code ends 
     end start 
+1

ich, dass wir den Code sehen, müssen denken, wo prim zugewiesen bekommt. Mein TASM ist rostig, aber ich bin mir nicht sicher, ob "prim" den Wert oder die "Adresse" auch direkt lädt, Sie sollten das auch überprüfen (falls es '[prim]' oder 'word ptr prim' usw. ist) –

+0

überprüfte es auf meinem TASM (Version v5.0), sowohl 'mov ax, prim 'als auch' mov ax, [prim] 'lade prims Wert – Tommylee2k

+0

btw: was sind all diese' xor ax, ax' und sind 'xor dx, dx 'für ?? Sie sind nicht notwendig, wenn Sie diese Register mit Werten 2 Anweisungen später anyways – Tommylee2k

Antwort

0

Sie das erste Mal CX verwenden ist inc cx. Sie haben angenommen, dass CX beim Start 0 ist. Tatsächlich setzt der Debugger ihn auf 0. Die Annahme ist jedoch falsch. Initialisiere CX direkt vor .for mit xor cx,cx.

BTW: Vergessen Sie nicht, um einen Stapel zu definieren:

_STACK SEGMENT PARA STACK 'STACK' 
    dw 1024 dup (?) 
_STACK ENDS