TITLE Proj2

PAGE 56,90

;    I used your Lab05 as a template for this
; ----------------------------------------
;
;  
;    This program will take a name entered by the user
;    and display it backwards. It will also tell the
;    user whether the word is a palindrome or not.
; ----------------------------------------



.MODEL   SMALL
.STACK   100H
.DATA
CR       EQU     0DH ; Carriage Return Code
LF       EQU     0AH ; Line Feed Control Code
DOSEXIT  EQU     4CH ; DOS exit code for 21h int


para_list LABEL BYTE
max_len db 20
act_len db ?
theword db 20 DUP(' ')
MSG1     DB      CR,LF,'Enter a word $'

ItIs    DB    CR,LF,'The word is a Palindrome $'
ItIsNot DB    CR,LF,'The word is not a Palindrome $'
SPACE    DB    CR,LF,'----------------------------$'

MSG2    DB     CR,LF,'The word backwards is '
wordbw DB     CR,LF, 12 DUP(20H),'$'          


; --------- End of Data Segment ----------
.CODE  



Main   PROC

;------------------------------------------
;   The routine performs basic 
;   "housekeeping" operations necessary in
;   any Assembly Language Program running
;   under DOS or Windows...
;     1 - Establish Addressability to the
;         Data Segment of the program.
;------------------------------------------

HouseKeeping:

       mov  ax,@data   ;get addr. of DSeg.
       mov  ds,ax      ;set in DS Reg.
       
;------------------------------------------
;   Routine "GetPut" will...
;     1 - Display prompt message.
;     2 - capture user provided ASCII
;         letter (located in AL register).
;     3 - Convert the letter to it's decimal
;      equivalent.
;     4 - Display the converted letter within
;     an "echoing" message.
;------------------------------------------
Prompt:


       lea  dx,MSG1    ;addr. of 1st msg
       mov  ah,9h       ;set for str. displ.
       int  21H        ;call DOS to displ.
       
       
      ; DISPLAY MESSAGE ABOVE;
       

GetWord:
         mov  ah,0Ah       ;set func. to Get String
         lea DX,Para_list    ;load address of para list
         int  21H        ;call DOS (val-AL)
     mov theword,al   ;move input to theword
     
     

    lea  dx,space    ;addr. of 1st msg
    mov  ah,9h       ;set for str. displ.
        int  21H        ;call DOS to displ.

CLD
MOV CX, 20
LEA SI,theWORD



 

L20:    
LODSB
mov [di],AL
dec di
XOR BX, BX
mov bl, act_len

LEA DI, WORDBW[bx]
loop l20


lea dx, wordbw
mov ah,9h
int 21h

     jmp pgmexit  
    

;------------------------------------------
;   The routine sets the exit code and 
;   calls DOS.  This is the appropriate
;   technique for terminating a non-
;   resident program running under DOS.
;------------------------------------------

PgmExit:
       mov  ah,DOSEXIT ;set Exit code
       int  21H        ;and call DOS


Main EndP
       End  Main

My problem is that it is not outputting the reworsed word. I want to create a second string (that is the word backwards), and then compare the two strings if they are the same.

Any ideas? I've been trying for weeks and have been so stuck. I even posted here for no responces.

reverse:
mov ah,theword[bx]        ;read the letter
dec bx                ;decrease the read pointer
mov wordbw[di], ah        ;write the letter
inc di                ;increase the write pointer
cmp bx,0
JE print
loop reverse

I think the problem is that I cant use line 4 like that. It is an error. How can I make it write to the location of wordbw but in the beginning.

TITLE Proj2

PAGE 56,90

; ----------------------------------------
;
;  
;    This program will take a name entered by the user
;    and display it backwards. It will also tell the
;    user whether the word is a palindrome or not.
; ----------------------------------------



.MODEL   SMALL
.STACK   100H
.DATA
CR       EQU     0DH ; Carriage Return Code
LF       EQU     0AH ; Line Feed Control Code
DOSEXIT  EQU     4CH ; DOS exit code for 21h int


para_list LABEL BYTE
max_len db 20
act_len db ?
theword db CR,LF, 20 DUP(' ')

MSG1     DB      CR,LF,'Enter a word $'

ItIs    DB    CR,LF,'The word is a Palindrome $'
ItIsNot DB    CR,LF,'The word is not a Palindrome $'
SPACE    DB    CR,LF,'----------------------------$'

MSG2    DB     CR,LF,'The word backwards is $'
MSG3     DB    CR,LF,'The word is  '
wordbw  DB     CR,LF, 12 DUP(' ')
GOODBYE    DB    CR,LF,'See You Later $'


; --------- End of Data Segment ----------
.CODE  



Main   PROC

;------------------------------------------
;   The routine performs basic 
;   "housekeeping" operations necessary in
;   any Assembly Language Program running
;   under DOS or Windows...
;     1 - Establish Addressability to the
;         Data Segment of the program.
;------------------------------------------

HouseKeeping:

       mov  ax,@data   ;get addr. of DSeg.
       mov  ds,ax      ;set in DS Reg.

;------------------------------------------
;   Routine "GetPut" will...
;     1 - Display prompt message.
;     2 - capture user provided ASCII
;         letter (located in AL register).
;     3 - Convert the letter to it's decimal
;      equivalent.
;     4 - Display the converted letter within
;     an "echoing" message.
;------------------------------------------
Prompt:


       lea  dx,MSG1    ;addr. of 1st msg
       mov  ah,9h       ;set for str. displ.
       int  21H        ;call DOS to displ.


      ; DISPLAY MESSAGE ABOVE;


GetWord:
         mov  ah,0Ah       ;set func. to Get String
         lea DX,Para_list    ;load address of para list
         int  21H        ;call DOS (val-AL)
     mov theword,al   ;move input to theword



    ;lea  dx,space    ;addr. of 1st msg
    ;mov  ah,9h       ;set for str. displ.
      ;  int  21H        ;call DOS to displ.





;set pointer to the right (act length)
;write that to the new string (left to right)
;dec the pointer
;increment the other pointer


MOV CX, 20        ;set the counter
lea si,theword        ;put the word in si register
xor bx,bx        ;clear the register
xor dx,dx        ;clear the register
add act_len,1        ;increase the length by 1, because it is an array and needs to be increased by 1 so the first
mov bl,act_len        ;set the pointer to read from the right
mov di,0        ;set the pointer to write starting from the left
;di starts at the number of letters and decreases
;bx starts at 0 and increases

inc bx
reverse:

mov ah,theword[bx]        ;read the letter
dec bx                ;decrease the read pointer
mov wordbw[di], ah        ;write the letter
inc di                ;increase the write pointer
cmp bx,0            ;check if the original word point is now at 0
JE print            ;if it is then the loop can exit
loop reverse            ;if not, then back to the beginning of the loop




print:
;Print out the Backwards Word
lea dx, wordbw
mov ah,9h
int 21h

     jmp pgmexit  



;------------------------------------------
;   The routine sets the exit code and 
;   calls DOS.  This is the appropriate
;   technique for terminating a non-
;   resident program running under DOS.
;------------------------------------------

PgmExit:
       mov  ah,DOSEXIT ;set Exit code
       int  21H        ;and call DOS


Main EndP
       End  Main       

I made a lot of progress but I am stuck on one thing. I am reversing the word except for the first letter. Any idea why?
I tried incrementing my reading pointer. And no luck. Any ideas?

Edited 3 Years Ago by pyTony: fixed formating

Im not asking for code or anything, just an idea. I tried manually moving the first letter into the last letter of the new string with:

reverse:

mov ah,theword[bx]        ;read the letter
dec bx                ;decrease the read pointer
mov wordbw[di], ah        ;write the letter
inc di                ;increase the write pointer
cmp bx,0            ;check if the original word point is now at 0
JE print            ;if it is then the loop can exit
loop reverse            ;if not, then back to the beginning of the loop

Edited 3 Years Ago by happygeek: fixed formatting

Im not asking for code or anything, just an idea. I tried manually moving the first letter into the last letter of the new string with:

reverse:

mov ah,theword[bx]        ;read the letter
dec bx                ;decrease the read pointer
mov wordbw[di], ah        ;write the letter
inc di                ;increase the write pointer
cmp bx,0            ;check if the original word point is now at 0
JE print            ;if it is then the loop can exit
loop reverse            ;if not, then back to the beginning of the loop

end quote.

Try something like this:

mov al, 0
push al

move2stack:
mov al, theword[bx]
push al
inc bx
cmp al, 0
jne move2stack

pop al
xor bx, bx

move2mem:
pop al
mov wordbw[bx], al
inc bx
cmp al, 0
jne move2mem

Nathan.

Edited 3 Years Ago by mike_2000_17: Fixed formatting

I figured out the problem. I was moving the ah into theword; and i was only moving the last string entered. Which was the enter key. So it never recorded the first letter, and thus never repeated it.

This article has been dead for over six months. Start a new discussion instead.