2015-06-04 17 views
5

Tôi có vấn đề với chương trình đơn giản của tôi trong hội đồng. Tôi đang sử dụng DOSbox và TASM. Tôi gặp vấn đề với chương trình. Các loại toán tử không khớp với dòng 76 78 80. Đây là sau khi nhân. Tôi cố gắng để thực hiện một số thay đổi bằng cách sử dụng kích thước biến difftrentPhương trình giải phương trình trong hội

; -------------------------------------------- 
; 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

bài viết mã của bạn ở đây trực tiếp. – Carcigenicate

+1

.. và đánh dấu các dòng. Ví dụ, trong các dòng dán 76 và 80 trống. Tôi bằng cách nào đó nghi ngờ lỗi là có ... – Jester

+0

số lượng lớn nhất chương trình của bạn là giả sử để xử lý? –

Trả lời

3

chương trình của bạn là gần như tốt, bạn chỉ có một số vấn đề với kích thước toán hạng, đó là điều bình thường. Vì vậy, tôi lấy mã của bạn và thực hiện một số thay đổi nhỏ, những thay đổi đó được nhận xét và chỉ bằng các mũi tên (< ========) và chúng là:

  • Đã khắc phục sự cố kích thước toán hạng. Tôi vẫn sử dụng DB bởi vì tôi nhận thấy bạn đang nắm bắt các con số như ký tự đơn.
  • Kết quả của (d-2 * c) được lưu trữ trong BX. Điều này là do chúng ta cần phải chia (a + c * b)/(d-2 * c), và bạn đã popping (a + c * b) trong BX, do đó, khi bạn làm div bx bạn đang làm (d-2 * c)/(a ​​+ c * b).
  • Tách màn hình cho thương và phần còn lại.
  • Đã thêm 13,10 ngắt dòng vào thư.
  • Cố định shl ax,2 bởi shl ax,1. Một shl là x2, hai shl là x2x2.
  • Phần còn lại được lấy từ dl vì khi div sử dụng một từ làm số chia, phần còn lại được để lại trong dx.

Đây là mã của bạn với những thay đổi nhỏ (thử nghiệm trên EMU8086):

; -------------------------------------------- 
; 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 

Tiếp theo là danh sách "phải làm" của bạn:

  • Thay đổi kích thước của toán hạng từ DB để DW, để cho phép chương trình của bạn xử lý các số lớn hơn.
  • Thay đổi DIV theo IDIV, vì DIV không được ký trong khi IDIV được ký. IDIV sẽ cho phép bạn xử lý các kết quả tiêu cực.
  • Ghi lại các số có int = 21h ah = 0Ah dưới dạng chuỗi (không phải là ký tự đơn). Sau đó, bạn chuyển đổi các chuỗi thành số. Tiếp theo hai liên kết này sẽ đưa bạn đến các thủ tục để chuyển đổi từ chuỗi số:

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

32 bit Calculator in 8086 Assembly

Cuối cùng, dữ liệu thử nghiệm:

(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

Cảm ơn bạn. Bây giờ tôi sẽ làm cho nó hữu ích hơn như bạn đã nói:> – Mack

Các vấn đề liên quan