2015-06-04 16 views
5

Montajdaki basit programımda sorun yaşıyorum. DOSbox ve TASM kullanıyorum. Programla ilgili problemim var. İşlenen türleri, 76 78 80 satırında eşleşmiyor. Bu çarpma sonrası. BenMontajda denklemin çözülmesi Program

; -------------------------------------------- 
; Equation=(a+c*b)/d-2*c, 
; -------------------------------------------- 
.model small 
.stack 100h 
.data 
     a  db 0       
     b  db 0 
     c  db 0 
     d  db 0 
     result1 db ? 
     result2 db ? 



     message1 db "Equation: (a+c*b)/d-2*c a=$" 
     message2 db "b=$" 
     message3 db "c=$" 
     message4 db "d=$" 
     message5 db "Result=$" 
.code 

start: mov ax,@data 
       mov ds,ax      

       mov ax, seg message1 ;get a and save to a variable 
       mov ds,ax  
       mov dx,offset message1 
       mov ah, 9h 
       int 21h 
       mov ah, 1h 
       int 21h 
       sub al,30h ;converting to real number 
       mov a,al 

       mov ax, seg message2 ;get b and save to a variable 
       mov ds,ax  
       mov dx,offset message2 
       mov ah, 9h 
       int 21h 
       mov ah, 1h 
       int 21h 
       sub al,30h ;converting to real number 
       mov b,al 


       mov ax, seg message3 ;get c and save to a variable 
       mov ds,ax  
       mov dx,offset message3 
       mov ah, 9h 
       int 21h 
       mov ah, 1h 
       int 21h 
       sub al,30h ;converting to real number 
       mov c,al 


       mov ax, seg message4 ;get d and save to a variable 
       mov ds,ax  
       mov dx,offset message4 
       mov ah, 9h 
       int 21h 
       mov ah, 1h 
       int 21h 
       sub al,30h ;converting to real number 
       mov d,al 


       mov al,b   ; (a+c*b) ------------------------error 
       mul c       
       add ax,a  ; ------------------------error 

       push ax  ;save current ax 

       mov ax,c  ;d-2*c------------------------error 
       shl ax,2 
       sub d,ax 


       pop bx  ;get previous ax to bx 

       div bx  ; div ax:bx 

       mov result1,al 
       mov result2,ah 

       add result1,30h ;converting to string 
       add result2,30h ;converting to string 

       mov al,result1 
       mov bl,result2 

       mov ax, seg message5 
       mov ds,ax  
       mov dx,offset message5 
       mov ah, 9h 
       int 21h 
       mov al,result1 
       mov bl,result2 
       mov dl, al 
       mov ah , 2h 
       int 21h 
       mov dl, bl 
       mov ah , 2h 
       int 21h 

       mov ax,4C00h   
       int 21h 

end    start 
+0

Mesaj doğrudan buradan kodu. – Carcigenicate

+1

.. ve çizgileri işaretleyin. Örneğin, 76 ve 80 macun çizgileri boştur. Ben hata orada şüphe var ... – Jester

+0

Programınız ele almak için varsayalım en büyük sayılar nelerdir? –

cevap

3

Programınız neredeyse iyidir, sadece normal işlenen boyutları, bazı sorunlar var difftrent değişken boyutu kullanarak bazı değişiklikler yapmaya çalıştı. Bu yüzden bazı küçük değişiklikler kodunuzu aldı ve yapılan bu değişiklikler yorumladı ve oklar (< ========) tarafından işaret ve onlar gibidir:

  • Sabit işlenen boyutu sorunu. Hala DB kullanıyordum çünkü sayıları tek karakter olarak yakaladığınızı fark ettim.
  • (d-2 * c) 'nin sonucu BX saklanır. (A + c * b) BX içinde, bu nedenle div bx yaptığınızda, yaptıklarını (d-2 biz (a + c * b)/(d-2 * c) bölmek gerekir, çünkü bu, ve haşhaş * c)/(a ​​+ c * b).
  • Göstergeyi bölüm ve kalan değerler için ayırın.
  • Eklendi 13,10 hat mesajlarına kırar.
  • shl ax,1 tarafından shl ax,2 düzeltildi. Bir shl x2, iki shl x2x2'dir.
  • Geri kalanı, div, bölümleyici olarak bir sözcük kullandığında, kalan dx içinde kaldığı için dl numaralı telefondan elde edilmiştir.

    • Değişim için DB'den işlenenlerden boyutu:

      ; -------------------------------------------- 
      ; Equation=(a+c*b)/d-2*c, 
      ; --------------------------------------------.model small 
      .stack 100h 
      .data 
          a db 0     
          b db 0 
          c db 0 
          d db 0 
          result1 db ? 
          result2 db ? 
      
      
      
          message1 db 13,10,"Equation: (a+c*b)/d-2*c",13,10,"a=$" 
          message2 db 13,10,"b=$"   ;<================= 13,10 IS 
          message3 db 13,10,"c=$"   ;<================= LINEBREAK. 
          message4 db 13,10,"d=$"   ;<================= 
          message5 db 13,10,"Quotient=$" ;<================= 
          message6 db 13,10,"Remainder=$" ;<================= 
      .code 
      
      start: mov ax,@data 
           mov ds,ax   
      
      
      
           mov ax, seg message1 ;get a and save to a variable 
           mov ds,ax 
           mov dx,offset message1 
           mov ah, 9h 
           int 21h 
           mov ah, 1h 
           int 21h 
           sub al,30h ;converting to real number 
           mov a,al 
      
           mov ax, seg message2 ;get b and save to a variable 
           mov ds,ax 
           mov dx,offset message2 
           mov ah, 9h 
           int 21h 
           mov ah, 1h 
           int 21h 
           sub al,30h ;converting to real number 
           mov b,al 
      
      
           mov ax, seg message3 ;get c and save to a variable 
           mov ds,ax 
           mov dx,offset message3 
           mov ah, 9h 
           int 21h 
           mov ah, 1h 
           int 21h 
           sub al,30h ;converting to real number 
           mov c,al 
      
      
           mov ax, seg message4 ;get d and save to a variable 
           mov ds,ax 
           mov dx,offset message4 
           mov ah, 9h 
           int 21h 
           mov ah, 1h 
           int 21h 
           sub al,30h ;converting to real number 
           mov d,al 
      
      
           mov al,b   ; (a+c*b) 
           mul c 
           mov cl,A ;<======== MOV A TO CX TO 
           mov ch,0 ;<======== ADD IT TO AX. 
           add ax,CX ;<======== C*B + A. 
      
           ;push ax  ;<======== NO LONGER NECESSARY BECAUSE 
              ;<======== IN NEXT BLOCK WE USE BX. 
      
           mov bl,C ;<======== MOV C TO BL AND CLEAR 
           mov bh,0 ;<======== BH. NOW C IS IN BX. 
           shl bx,1 ;<======== 2*c. ONE SHIFT IS x2, TWO SHIFTS ARE x2x2. 
           sub d,bl   ;d - 2c 
           mov bl,d ;<======== MOV D TO BL AND CLEAR BH. NOW 
           mov bh,0 ;<======== D IS IN BX. BX = (D-2C). 
      
           ;pop ax  ;<======== NO LONGER NECESSARY. AX CONTAINS (A+C*B). 
      
           mov dx,0 ;<======== CLEAR DX, BECAUSE DIVISOR IS A WORD. 
              ;<======== WHEN DIVISOR IS A WORD, DIV USES DX:AX. 
           div bx  ;<======== dx:ax/bx == DX:(A+C*B)/(D-2C). THIS 
              ;<======== DIVISION IS UNSIGNED, FOR SIGNED USE IDIV. 
      
           mov result1,al ;<===== QUOTIENT. 
           mov result2,dl ;<===== REMAINDER, BECAUSE DIVISOR IS WORD. 
      
           add result1,30h ;converting to string 
           add result2,30h ;converting to string 
      
           mov al,result1 
           mov bl,result2 
      
           ;DISPLAY QUOTIENT <============= 
           mov ax, seg message5 
           mov ds,ax 
           mov dx,offset message5 
           mov ah, 9h 
           int 21h 
           mov al,result1 
           mov dl, al 
           mov ah , 2h 
           int 21h  
           ;DISPLAY REMAINDER <============= 
           mov ax, seg message6 
           mov ds,ax 
           mov dx,offset message6 
           mov ah, 9h 
           int 21h 
           mov dl, bl 
           mov ah , 2h 
           int 21h 
      
           mov ax,4C00h   
           int 21h 
      
      end  start 
      

      Sonraki senin "yapmak için" listesi: Burada

  • (EMU8086 üzerinde test) küçük değişikliklerle .kodunuz DW, programınızın daha büyük sayılarla ilgilenmesine izin vermek için.
  • idiv tarafından Değişim DIV, idiv açmışken DIV imzasız olması nedeniyle. IDIV olumsuz sonuçları ele alacaktır. int = 21h ah = 0Ah ile
  • Yakalama numaraları dizeleri (değil tek karakter) olarak. Daha sonra dizeleri sayılara dönüştürürsünüz. Sonraki iki bağlantılar dizesinden sayıya dönüştürmek için prosedürler götürecektir:

Assembly x86 Date to Number - Breaking a string into smaller sections

32 bit Calculator in 8086 Assembly

Son olarak, test verisi:

(a+c*b)/(d-2*c) 

a=1 
b=2 
c=3 
d=8 

a+c*b = 1+3*2 = 7 
d-2*c = 8-2*3 = 2 

7/2 = quotient 3, remainder 1 
+0

Teşekkür ederiz. Şimdi dediğin gibi daha kullanışlı olacak:> – Mack