Reputation: 1242
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
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
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