Ma Kro
Ma Kro

Reputation: 1242

Few errors in assembly program. For amateurs

I have to make a program which will work as calculator. I wrote this:

push ds
push 0000H


data segment
    imsg1 db 13,10,'enter 1st number:$'
    imsg2 db 13,10,'enter 2nd number:$'
    imsg3 db 13,10,'sum:$'
    imsg4 db 13,10,'diff:$'
    imsg5 db 13,10,'div:$'
    imsg6 db 13,10,'product:$'
    num dw ?
    num2 dw ?
data ends
   MOV ax,data
   MOV ds,ax
      mov ah,09h
      mov dx,offset imsg1
      int 21h
   mov cx,0
   mov bx,10
   mov num,0            ; Using num instead of dx, as we usually do, because we have to store another number too.

   r1:mov ah,01h        ; For storing first number
      int 21h          
      cmp al,13
      je yy
      sub al,48
      mov cl,al
      mov ax,num
      mul bx
      add ax,cx
      mov num,ax
      jmp r1  

   yy:
      ;to enter 2nd number  
      mov ah,09h
      mov dx,offset imsg2
      int 21h

       mov cx,0
       mov bx,10
       mov num2,0

       r2:mov ah,01h
       int 21h
       cmp al,13
       je yy1
       sub al,48
       mov cl,al
       mov ax,num2
       mul bx
       add ax,cx
       mov num2,ax
       jmp r2


    yy1:
    ;TO PRINT PROMPT MSG FOR SUM
      mov ah,09h
      mov dx,offset imsg3
      int 21h

      mov ax,num                ; Move the numbers to registers before doing any operation
      mov bx,num2               ; Because we will also need the numbers for other operations
      add ax,bx                 ; Adding and storing in ax
      mov cx,0
      mov bx,10
      mov dx,0
    r3:                                 ; To print the sum
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r3
       mov ah,02h
       print:
        pop dx
        int 21h
       loop print

       ;TO PRINT SUBTRACTION PROMPT
       mov ah,09h
      mov dx,offset imsg4
      int 21h
       mov ax,num
       mov bx,num2
       sub ax,bx                ; Subtracting and storing in ax

       mov cx,0
      mov bx,10
      mov dx,0
    r4:                                 ; Printing the subtracted value
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r4
       mov ah,02h
       print1:
        pop dx
        int 21h
       loop print1

       ;TO PRINT DIVISION PROMPT
       mov ah,09h
       mov dx,offset imsg5
       int 21h
       mov dx,0
       mov ax,num
       mov bx,num2
       div bx                   ; Quotient stored in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r5:                                 ; Printing the Quotient
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r5
       mov ah,02h
       print2:
        pop dx
        int 21h
       loop print2

       ;TO PRINT MULTIPLICATION PROMPT
       mov ah,09h
       mov dx,offset imsg6
       int 21h
       mov dx,0
       mov ax,num
       mov bx,num2
       mul bx                   ; Solution in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r6:                                 ; Printing the solution
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r6
       mov ah,02h
       print3:
        pop dx
        int 21h
       loop print3
ret
main endp
code ends
end main

And I have errors:

line 5 (data segment) parser: instruction expected
line 18(mov dx,offset imsg1): comma or end of line expected
line 39(mov dx,offset imsg2): comma or end of line expected
line 62(mov dx,offset imsg3): comma or end of line expected
line 87(mov dx,offset imsg4): comma or end of line expected
line 112(mov dx,offset imsg5): comma or end of line expected
line 138(mov dx,offset imsg6): comma or end of line expected
line 162(main endp): error:parser:instruction expected
line 163(main ends): error:parser:instruction expected
line 164(end main): error:parser:instruction expected

I'm trying to solve them since week with no success. Sorry that I have putted whole code here, but it's not so long snippet so maybe someone can help me with this.. Thank you!

Upvotes: 0

Views: 695

Answers (2)

Michael
Michael

Reputation: 58497

In the comments section you mention that you want to assemble the code using NASM, but the code is written using TASM/MASM syntax. There are some important differences between the two styles:

In TASM/MASM syntax this:

mov ax,num

Will load ax with the value stored at num. In NASM syntax it will load ax with the address of num. To get the TASM behavior in NASM you need to put brackets around the address:

mov ax,[num]

In TASM/MASM syntax this:

mov dx,offset imsg1

Loads dx with the address of imsg1 (actually its offset within a segment). In NASM syntax that would simply become:

mov dx,imsg1

Some directives (like ENDP) are specific to TASM/MASM and have no real counterpart in NASM.

Upvotes: 2

Frank Kotler
Frank Kotler

Reputation: 3119

Easiest thing is probably to use the intended assembler... but I used to do a lot of M/Tasm translations. This is UNTESTED!... but assembles without complaint... My preference would be to assemble it to a .com file, but the original code is for an MZ file (requires a linker).

; nasm -f bin -o myprog.com myprog.asm
; or
; nasm -f obj myprog.asm
; link ???

; for -f obj, remove this line
org 100h

segment data
    imsg1 db 13,10,'enter 1st number:$'
    imsg2 db 13,10,'enter 2nd number:$'
    imsg3 db 13,10,'sum:$'
    imsg4 db 13,10,'diff:$'
    imsg5 db 13,10,'div:$'
    imsg6 db 13,10,'product:$'

segment .bss
    num resw 1
    num2 resw 1

segment .text
; if -f obj, put these lines back
;   MOV ax,data
;   MOV ds,ax

      mov ah,09h
      mov dx, imsg1
      int 21h
   mov cx,0
   mov bx,10
   mov word [num],0            ; Using num instead     of dx, as we usually do, because we have to store another number too.

   r1:mov ah,01h        ; For storing first number
      int 21h          
      cmp al,13
      je yy
      sub al,48
      mov cl,al
      mov ax,[num]
      mul bx
      add ax,cx
      mov [num],ax
      jmp r1  

   yy:
      ;to enter 2nd number  
      mov ah,09h
      mov dx, imsg2
      int 21h

       mov cx,0
       mov bx,10
       mov word [num2],0

       r2:mov ah,01h
       int 21h
       cmp al,13
       je yy1
       sub al,48
       mov cl,al
       mov ax,[num2]
       mul bx
       add ax,cx
       mov [num2],ax
       jmp r2


    yy1:
    ;TO PRINT PROMPT MSG FOR SUM
      mov ah,09h
      mov dx, imsg3
      int 21h

      mov ax,[num]              ; Move the numbers to registers before doing any operation
      mov bx,[num2]             ; Because we will also need the numbers for other operations
      add ax,bx                 ; Adding and storing in ax
      mov cx,0
      mov bx,10
      mov dx,0
    r3:                                 ; To print the sum
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r3
       mov ah,02h
       print:
        pop dx
        int 21h
       loop print

       ;TO PRINT SUBTRACTION PROMPT
       mov ah,09h
      mov dx, imsg4
      int 21h
       mov ax,[num]
       mov bx,[num2]
       sub ax,bx                ; Subtracting and storing in ax

       mov cx,0
      mov bx,10
      mov dx,0
    r4:                                 ; Printing the subtracted value
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r4
       mov ah,02h
       print1:
        pop dx
        int 21h
       loop print1

       ;TO PRINT DIVISION PROMPT
       mov ah,09h
       mov dx, imsg5
       int 21h
       mov dx,0
       mov ax,[num]
       mov bx,[num2]
       div bx                   ; Quotient stored in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r5:                                 ; Printing the Quotient
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r5
       mov ah,02h
       print2:
        pop dx
        int 21h
       loop print2

       ;TO PRINT MULTIPLICATION PROMPT
       mov ah,09h
       mov dx, imsg6
       int 21h
       mov dx,0
       mov ax,[num]
       mov bx,[num2]
       mul bx                   ; Solution in AX

       mov cx,0
       mov bx,10
       mov dx,0
    r6:                                 ; Printing the solution
       mov dx,0
       div bx
       add dx,48
       push dx
       inc cx
       cmp ax,0
       jg r6
       mov ah,02h
       print3:
        pop dx
        int 21h
       loop print3
ret

Upvotes: 2

Related Questions