943,631 Members | Top Members by Rank

Ad:
  • Assembly Discussion Thread
  • Unsolved
  • Views: 606
  • Assembly RSS
Apr 10th, 2009
0

help in`assembly project

Expand Post »
hello this is my project to convert from arabic numerals to roman one's and vice versa but i have some problems in it ,dont know what 2 do ??/so pleassse help me 2 know or even 2 correct it
thanx alot

MODEL SMALL
.STACK 1000
ORG 100H
.DATA
INPUT LABEL BYTE

DB 20 DUP (?)

PARAMETER LABEL BYTE ;DEFINE A PARAMETER LIST
numM db 10,13,'1000 '
numD db 10,13,'500 '
numL db 10,13,'50 '
numX db 10,13,'10'
numV db 10,13,'5'
numI db 10,13,'1'
SHOWNAME DB 10,13,'MY NAME IS RASEEL$'
SHOWID DB 10,13,'MY ID 1060110$'
REQUEST DB 10,13,'IF U WANT TO CONVERT ROMAN TO ARABIC PRESS R,OR ARABIC TO ROMAN PRESS A$'
ENTER_ARABIC DB 10,13,'ENTER ARABIC NUMBER TO CONVERT$'
ENTER_ROMAN DB 10,13,'ENTER ROMAN NUMBER TO CONVERT$'
ROMAN_ARRAY_RESULT DB 50 DUP ?
ROMAN DB 50 DUP (?)
ARABIC DB 50 DUP(?)
INVALID_NUM DB 10,13,'YOU ENTERED AN INVALID NUMBER$'
PNTR DW 0
CUR_CHAR DB (?)
NXT DN (?)
.CODE
.386
.STARTUP

PROCEDURE PROC FAR ; A PROCEDURE FOR SEGMENT INITIALIZATION
MOV AX,@DATA ;INITIALIZE SEGMENT
MOV DS,AX ;REGISTERS
MOV ES,AX ;REGISTERS
JMP START


START :
CALL CLRSCR
MOV AH,02H ;SET CURSOR SUB SERVICE
MOV BH,00H ;PAGE NUMBER 0
MOV DX,0000
INT 10H
;make the boxes
mov bh,01h
mov cx,0000h
mov dx,1807h
int 10h

;make the boxes
mov bh,01h
mov cx,0048h
mov dx,184fh
int 10h
; make the boxes
mov bh,80h
mov cx,0210h
mov dx,0640h
int 10h
mov ah,02h ;setting crusor
mov bh,00 ;page number
mov dh,04 ;ROW NUMBER
mov dl,20 ;COLUMN NUMBER
int 10h
LEA DX,SHOWNAME
CALL DISPLAYMSG
LEA DX ,REQUEST
CALL DISPLAYMSG
CALL GETINPUT
CALL CHOICE

;CALL PROCEDURE FOR DISPLAYING INPUT REQUEST AND PNTREPTING INPUT


CHECK_NUM PROC NEAR ;check if this digit is anumber between 0-9

mov ax, num
cmp ax, 30h
jl INVALID
cmp ax, 39h
jg INVALID
xor ah,ah

endP
; ***************************************************************************;
CHECK_ROMAN PROC NEAR ;A PROCEDURE TO CHECH ROMAN ENTERED NUM VALIDITY
;MUST NOT BE MORE THAN 3999 OR LESS THAN 1
mov ax, num
cmp ax, 34h
jg INVALID
xor ah,ah
endP

INVALID:
LEA DX,INVALID_NUM
CALL SHOWMSG
;***************************************************************************************;
CHOICE PROC NEAR

xor bp,bp ; intialization of base pointer
CHOICE:
CALL GETINPUT
CMP al,'R' ; IF INPUT IS R=> CONVERT FROM ROMAN TO ARABIC
CALL CONVERT_ROMAN_ARABIC
CMP al,'A' ; IF INPUT IS A ==> CONVERT FROM ARABIC TO ROMAN
CALL CONVERT_ARABIC_ROMAN
loop CHOICE ; else start again

CHOICE ENDP

;************************************************************************************************************************

;****************************;
CLRSCR PROC NEAR ;PROCEDURE FOR CLEARING THE SCREEN
PUSHA ;PERSERVE GENERAL REGISTERS IN THE STACK
MOV AX,0600H ;SUB-SERVICE TO SCROLL SCREEN
MOV BH,30 ;COLOR ATTRIBUTES(BACKGROUND: BLUE,FOREGROUND:YELLOW)
MOV CX,0000 ;STARTING ROW:COLUMN
MOV DX,184FH ;ENDING ROW:COLUMN, CLEARING ENTIRE SCREEN
INT 10H ;GET BACK REGISTERS VALUE
POPA ;INTERRUPT FOR SCREEN HANDLER
RET ;RETURN TO OPERATING SYSTEM
CLRSCR ENDP
;****************************;
GETINPUT PROC NEAR
MOV AH,0AH ; TO IN FROM KB
LEA DX,INPUT
INT 21H
RET ;RETURN TO OPERATING SYSTEM
GETINPUT ENDP
;-------------------------------------------------------------;
DISPLAYMSG PROC NEAR ;MSG OFFSET MUST BE IN DX
MOV AH,09H ;OUTPUT TO SCREEN SUB-SERVICE
INT 21H ;OPERATING SYSTEM INTERRUPT
RET ;RETURN TO OPERATING SYSTEM
DISPLAYMSG ENDP
;------------------------------------
CONVERT_ARABIC_ROMAN PROC NEAR
LEA DX,ENTER_ARABIC
CALL SHOWMSG
MOV [SI],OFFSET ARABIC
MOV AH, 0AH
INT 21h
CALL CHECK_NUM
MOV SI,OFFSET ARABIC
MOV DI,OFFSET ROMAN_ARRAY_RESULT
MOV CX,50
CMP [SI],F9FH
JG INVALID
CMP [SI],1H
JL INVALID
CMP [SI],3F7H
JG PART1
CMP [SI],383H
JG PART2
CMP [SI],1F3H
JG PART3
CMP[SI],18FH
JG PART4
CMP [SI],63H
JG PART5
CMP[SI],59H
JG PART6
CMP [SI],31H
JG PART7
CMP [SI],27H
JG PART8
CMP [SI],9H
JG PART9
CMP [SI],8H
JG PART10
CMP [SI],4H
JG PART11
CMP [SI],3H
JG PART12
CMP [SI],1H
JG PART13
JMP PRINT_ROMAN
RET
END

PRINT_ROMAN:
MOV SI,OFFSET ROMAN_ARRAY_RESULT
MOV DI,2000 ; the result will be print in the center of the screen
mov AH,1Eh

PRINTLOOP:
LODSB
CMP AL,0
JE Finish
STOSW
JMP PRINTLOOP

INALID:
LEA DX,INVALID_NUM
CALL DISPLAYMSG
JMP EXIT

PART1:
MOV AL,'M'
MOV[DI],AL
INC DI
SUB [SI],3E8H
CMP [SI],3F7H
JG PART1
INC SI
PART2:
MOV AL,"CM"
MOV[DI],AL
INC DI
SUB [SI],384H
CMP [SI],383H
JG PART2
INC SI
PART3:
MOV AL,'D'
MOV [DI],AL
INC DI
SUB [SI],1F4H
CMP [SI],1F3H
JG PART3
INC SI
PART4:
MOV AL,"CD"
MOV[DI],AL
INC DI
SUB [SI],190H
CMP [SI],18FH
JG PART4
INC SI
PART5:
MOV AL,'C'
MOV [DI],AL
INC DI
SUB [SI],64H
CMP [SI],63H
JG PART5
INC SI
PART6:
MOV AL,"XC"
MOV [DI],AL
INC DI
SUB [SI],5AH
CMP [SI],59H
JG PART6
INC SI
PART7:
MOV AL,'L'
MOV [DI],AL
INC DI
SUB [SI],32H
CMP [SI],31H
JG PART7
INC SI
PART8:
MOV AL,"XL"
MOV [DI],AL
INC DI
SUB [SI],28H
CMP [SI],27H
JG PART8
INC SI
PART9:
MOV AL,'X'
MOV [DI],AL
INC DI
SUB [SI],0AH
CMP [SI],9H
JG PART9
INC SI
PART10:
MOV AL,"IX"
MOV [DI],AL
INC DI
SUB [SI],9H
CMP [SI],8H
JG PART 10
INC SI
PART11:
MOV AL,'V'
MOV [DI],AL
INC DI
SUB [SI],5H
CMP [SI],4H
JG PART11
INC SI
PART12:
MOV AL,'IV'
MOV[DI],AL
INC DI
SUB [S],4H
CMP [SI],3H
JG PART12
INC SI
PART13:
MOV AL,'I'
MOV [DI],AL
INC DI
SUB [SI],1H
CMP [SI],0H
JG PART13
INC SI

;-------------------------------------------------------------;

PROC CONVERT_ROMAN_ARABIC NEAR

LEA DX,ENTER_ROMAN
CALL SHOWMSG
CALL CHECK_ROMAN


mov bx, offset ROMAN
mov al, [bx + 1]
xor ah,ah
mov cx, ax
xor si,si


two_char:

mov AL, [bx + 2 + si]
MOV CUR_CHAR, AL
inc si

one_char:

mov AL, [bx + 2 + si]
MOV NXT, AL
inc si

;*********************************************
mov aL, CUR_CHAR
cmp aL, 4Dh ;compare M
je PART1
PART1:
add [word ptr PNTR],1000
dec si
jmp two_char
;*******************************************
cmp aL, 44h ;compare D
je PART2
PART2:
add [word ptr PNTR],500
dec si
jmp two_char
;**************************************************
cmp aL, 43h ;compare C
je PART3
PART3:
mov cL, NXT
cmp cL, 4Dh ;IF NXT IS M ADD 900
je PART4
PART4:
add [word ptr PNTR],900
jmp two_char

mov cL, NXT
cmp cL, 44h ;IF NXT IS D ADD 400
je PART5
PART5:
add [word ptr PNTR],400
jmp two_char


add [word ptr PNTR],100
dec si
jmp two_char
;********************************************************
cmp aL, 4Ch ;compare L
je PART6
PART6:
add [word ptr PNTR],50
dec si
jmp two_char
;***************************************************************
cmp aL, 58h ;compare X
je PART7
PART7:
mov cL, NXT
cmp al, 43h ;compare C
je PART8

PART8:
add [word ptr PNTR],90
jmp two_char


mov cL, NXT
cmp aL, 4Ch ;compare L
je PART9
PART9:

add [word ptr PNTR],40
jmp two_char

add [word ptr PNTR],10
dec si
jmp two_char

;*************************************************************
cmp aL, 56h ;compare V
je PART10
PART10:
add [word ptr PNTR],5
dec si
jmp two_char
;********************************************************************
cmp aL, 49h ;compare I
je PART11
PART11:
mov cL, NXT
cmp aL, 58h ;compare X
je PART12
PART12:
add [word ptr PNTR],9
jmp two_char

mov cL, NXT
cmp cL, 56h ;compare V
je PART13
PART13:

add [word ptr PNTR],4
jmp two_char



add [word ptr PNTR],1
dec si
jmp two_char

CALL PRINT_ARABIC

ret
endp
;*************************************************************************************************
PRINT_ARABIC PROC NEAR
LEA BX,[PNTR]

SUB SI,SI
LOOOP:
MOV DL,[BX+SI]

MOV AH,2 ; SUBROUTINE TO PRINT OUT WHAT IN DL
SUB DL,1; HERE IS THE ENCRYPTION
INT 21H

CMP DL,0
JE RETURN1

INC SI
JMP LOOOP; THE LOOP CONTINUES UNTIL DL=0
RETURN1:
RET
PRINT_ARABIC ENDP

;******************************************************************************
PROC FINISH NEAR
mov ah,4ch
int 21h
endp

;*******************************************************************************
END

;END OF MY PROJECT
Similar Threads
Reputation Points: 10
Solved Threads: 0
Newbie Poster
raseel is offline Offline
10 posts
since Dec 2008
Apr 14th, 2009
0

Re: help in`assembly project

ROMAN_ARRAY_RESULT DB 50 DUP ? ----> NEED (?)

ROMAN_ARRAY_RESULT DB 50 DUP (?) --should be like this.

WHAT IS "DN"........NXT DN (?)

NXT DB (?)


CHECK_NUM PROC NEAR ;check if this digit is anumber between 0-9

mov ax, num
cmp ax, 30h
jl INVALID
cmp ax, 39h
jg INVALID
xor ah,ah

endP -------------->end of what put label in front XXXXX endp
; ***************************************************************************;
CHECK_ROMAN PROC NEAR ;A PROCEDURE TO CHECH ROMAN ENTERED NUM VALIDITY
;MUST NOT BE MORE THAN 3999 OR LESS THAN 1
mov ax, num
cmp ax, 34h
jg INVALID
xor ah,ah
endP --------------------> end of what put label in front XXXXX endp

[ LABEL HERE ] endP of What...need Label
Reputation Points: 13
Solved Threads: 12
Junior Poster
rm_daniweb is offline Offline
165 posts
since Jan 2007

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in Assembly Forum Timeline: Performance issue in code
Next Thread in Assembly Forum Timeline: 16-bit assembaly on a 64-bit system





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC