68K Assembly Language help

adding decimal integers.

Page 1 of 1

12 Replies - 16764 Views - Last Post: 24 May 2010 - 03:38 PM

#1 giddyupgirl  Icon User is offline

  • New D.I.C Head

Reputation: 3
  • View blog
  • Posts: 13
  • Joined: 09-May 08

68K Assembly Language help

Posted 16 May 2008 - 03:44 AM

Hi wonderful people,

I am a student from lovely sunny Queensland in Australia. I am currently studying for a Bachelor of Technology (Infomation Systems). I am the 1/2 point and am really enjoying the challenge.

This current assignment that I am doing is a little too challenging for me. It has a list of 4 requirements that progressively build on each other. I have managed to get requirement 2 working. I am not sure if it is acceptable to post the assignment specs here or not so I will paraphrase them.

requirement 1: add two digits that are entered seperated by a space and then display the answer ie 6 8 The sum is 14. That is all good, got that working.

requirement 2: modify to accept multi-digit integers with the same number of digits up to 3 almost got that bit under control, it works until there is an overflow. ie the sum results in a 4 digit answer I end up getting an odd hex answer, I think I know where the problem is but really have no idea how to solve it, any help would be greatly appreciated. Once I have that bit sorted then maybe I can move on, or ask for more help :rolleyes:

requirement 3: modify the program to accept multi-digit integers with numbers of different lengths. This I think I can work out but any hints wouldn't be rejected ;)

and finally requirement 4: modify the program to accept floating point number of up to 3 digits each with exactly the same format,that is , with the same number of digits to either side of the decimal. This I have absolutely no idea how to do, again any hints would be greatly appreciated.

This is the segment of code where I think I have the problem, if more code is need I am happy to add all of it, but thought just for starter this would be a good place to be.

Sorry I am not very good at this, my whole assignment is a mismatch of bits of code found here and there, I am sure there is quite a bit of it that does absolutely nothing. I really do apologise for my ignorance, but I am giving this assignment 120% effort, I am just not getting it very well.

Thanks in advance for any help given, it will be very much appreciated.

 CONVERT		MOVE.W	D2,D0;get the number
			ASR.W	D1,D0;shift the number first right bit
			AND.W	#$000F,D0;discard the other bits for this exercise
					;(we can only work on one digit at a time)
			ADD.W	#'0',D0;convert to ascii by adding zero
			CMP.W	#'9',D0;  check if the number is greater than 9 (hex digit max)
			
			BLE		NEXT_BIT;if it is greater than nine move the bit left
			ADD.W	#$07,D0; add seven to the value to take to the next bit
			
NEXT_BIT	TRAP	#14;complete the outch function and display character
			SUBQ.W	#04,D1; subtract 4 to point to the next digit
			BGE		CONVERT;repeat convert subroutine if there are more digits to process
			MOVE.W	D2,D0		
			
			MOVE.W 	(SP)+,D1;restore stack registers
			MOVE.W	(SP)+,D2
			MOVE.W	(SP)+,D7
			
			RTS		;;return from subroutine	


This post has been edited by giddyupgirl: 16 May 2008 - 05:56 PM


Is This A Good Question/Topic? 0
  • +

Replies To: 68K Assembly Language help

#2 Anthos  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 1
  • Joined: 17-May 08

Re: 68K Assembly Language help

Posted 17 May 2008 - 07:46 AM

Hi

Can you please post all of the code you have and I can have a look at it.

thanks
Was This Post Helpful? 0
  • +
  • -

#3 giddyupgirl  Icon User is offline

  • New D.I.C Head

Reputation: 3
  • View blog
  • Posts: 13
  • Joined: 09-May 08

Re: 68K Assembly Language help

Posted 18 May 2008 - 03:13 PM

View PostAnthos, on 17 May, 2008 - 07:46 AM, said:

Hi

Can you please post all of the code you have and I can have a look at it.

thanks


Hi,

I have solved one of my problems, and I think I have requirement 3 working, but requirement 4, oh boy not a clue. Can't even find vague examples to pull apart on that one.


*** DEFINE CfONSTANTS ***
FIRST		DC.W	$2000; memory for first number
SECOND		DC.W	$2100; memory for second number
SUM			DC.W	$2300 ; FOR FINAL SUM OF THE TWO NUMBERS


; EQUATES FOR KERNEL ROUTINES

INCH		EQU	 247 ;INCH, READS A KEYBOARD ASCII KEY INTO D0 (PP91)
OUTCH   	EQU	 248	;OUT, OUTPUTS ASCII IN D0 TO THE SCREEN (PP 91)
OUTPUT	  EQU	 243	;
EXIT		EQU		228	; EXIT, EXITS BACK TO THE SIMULATOR
LF			EQU		$0A	; LINE FEED
CR			EQU		$0D	; CARRIAGE RETURN
NULL		EQU		00	; NULL VALUE
SPACE		EQU		$20	; SPACE IN ASCII


LINE_BREAK	DC.B 		CR,LF,NULL
PROMPT		DC.B		'Enter two digits separated by a space.',CR,LF,NULL
FINAL		DC.B		'The sum is ',CR,LF,NULL

ADDING		DC.B		$20,NULL	; to identify the end of the first number (a space)
EQUALS		DC.B		$0D,NULL	; to identify the end of the calculation (a carriage return)

	ORG	$1000
	
			MOVE.W #$7FFE,SP		; INITIALISE THE STACK
			
			CLR.L	D0				; clear d0 for input numbers (for debugging)
			CLR.L	D1				; CLEAR D1 FOR THE SUM
			CLR.L	D2				; clear D2 for second number
			
START		MOVE.W	#PROMPT,A1		; send first message out
			BSR		WRITE_STRING 	; go to write_string to see how

			
			MOVE.W	#ADDING,A1		; find end of first number
			BSR		GET_NUMBER		; get first number

			MOVE	D1,FIRST	

			MOVE.B	#OUTCH,D7		; output space that has been entered
			TRAP	#14				; tell system to do it
			
			MOVE.L	#EQUALS,A1		; point to the end of number two
			BSR		GET_NUMBER		;
			
			MOVE	D1,SECOND		;store the new number in second memory location
			
			MOVE.L	#LINE_BREAK,A1	; put a line break in
			BSR		WRITE_STRING 	; write to screen

			MOVE.W  FIRST,D1	
			MOVE.W  SECOND,A2
			ADDA.W  D1,A2			;do the addition,result in A2
			
			MOVE.L	#FINAL,A1		; call final message
			JSR		WRITE_STRING 	; write to screen
			
PRINT_DECIMAL							;assumes the addition result is in A2
			MOVE.L  #0,D3				; prepare the print loop counter
			CLR		D4
			MOVE.L  A2,D4				; copy sum to D4
			BRA		PRINT_DECIMAL_LOOPBODY;jump straight into the decimalisation part of the loop, bypassing the loop test
			
PRINT_DECIMAL_DIV10LOOP
			CMP.W	#0,D4				;check if the last base 10 division returned 10
			BEQ		PRINT_DECIMAL_PRINTLOOP;if so we can start printing the 0...9 values on the stack
			
PRINT_DECIMAL_LOOPBODY
			DIVU	#10,D4				;divide by ten to get the 0...9 value in the remainder for
			SWAP	D4					;the current least significant decimal value in D4
			MOVE.W  D4,-(sp)			;push that remainder onto the stack
			MOVE.W 	#0,D4				;clear the remainder
			SWAP 	D4					;keep the reduced exponent value
			ADD.L	#1,D3				;increment digit counter
			BRA		PRINT_DECIMAL_DIV10LOOP;jump to loop condition test
			
PRINT_DECIMAL_PRINTLOOP					;pops all the pushed base 10 denominators off the stack in a loop
			CMP.L 	#0,D3				;and prints them to the console as it goes so that the most significat
			BEQ		FINISHING			;quit if we've printed all digits
			
			SUB.L 	#1,D3				;decrement the digit counter index
			MOVE.W  (sp)+,D0			;pop the next less significant bit off the stack
			ADD.B 	#'0',D0				;make it an ascii numeral
			MOVE.B  #OUTCH,D7				
			TRAP 	#14					;print it
			BRA		PRINT_DECIMAL_PRINTLOOP;check for next digit
			
***  finishing routine to exit

FINISHING	MOVE.B	#EXIT,D7;call the exit function
			TRAP	#14		; tell system to do it			

			RTS
			
*** WORKING WITH THE NUMBERS ***			
				
GET_NUMBER	move.w	d7,-(sp) ; pop off stack
			MOVE.W	D3,-(SP);
			MOVE.W	D2,-(SP);
			
			CLR.L	D1		; clear contents of D1 for new number
			
			MOVE.B	#$03,D3	; SET MAXIMUM OF D3 TO 3 DIGITS (this will be our counter of how many digits in a number)
			
READ_NUMBER	MOVE.B 	#INCH,D7; READ CHARACTER FROM KEYBOARD
			TRAP	#14		; TELL SYSTEM TO DO IT
			MOVE.L	A1,A0	; SET ADDRESS POINTER TO THE END OF FIRST NUMBER
		
CHECK_ENTRY					; IS THIS THE END OF THE NUMBER
			MOVE.B	(A0)+,D2;get the space or carriage return
			CMP.B	#NULL,D2; is this the last ?
			BEQ		NUMBER_ENTRY; IF IT IS go to the number entry
			CMP.B	D0,D2	; is it an equals (aka carriage return)
			BEQ		LAST	; IF IT IS go to the last routin
			BRA		CHECK_ENTRY;ELSE  GO THROUGH THIS ROUTINE AGAIN
			
NUMBER_ENTRY
			CMP.B	#$00,D3	;SEE THAT THE LIMIT OF DIGITS ISN'T EXCEEDED
			BEQ		READ_NUMBER;IF NOT GET NEXT KEY ENTRY
			
			SUBQ.B	#$01,D3	;REDUCE D3 COUNTER BY 1
			MOVE.B	D0,D2	; STORE THE VALUE ENTERED IN D2
			
			MOVE.B	#OUTCH,D7;ECHO KEY ENTERED
			TRAP	#14		; TELL SYSTEM TO DO IT
			
			MOVE.B	D2,D0	;COPY ENTERED VALUE BACK TO D2
			SUB.B	#'0',D0	; convert to a number by subtracting ascii zero value
			CMP.B	#$09,D0	
			BLE		OKAY
			SUBQ.B	#$07,D0	; IF VALUE OVER 9 THEN TAKE AWAY 7 TO ENSURE IT ISN'T RECORDED AS HEX (aka 10-16 is A-F)
			
OKAY		MULU	#10,D1  ; multiply by 10 
			ADD.W	D0,D1		
			BRA		READ_NUMBER;GET NEXT ENTRY
			
LAST		MOVE.W	(SP)+,D2
			MOVE.W	(SP)+,D3
			MOVE.W	(SP)+,D7
			
			RTS
			
*** Other routines, taken from SAMPLES.ASM provided at the start of this subject ***

; ============================================================================

WRITE_STRING 	
			MOVE.W D7,-(SP)	;store modified registers ensuring that the
			MOVE.W D0,-(SP)	; subroutine is non-destructive
			MOVE.B #OUTCH,D7   ;ready screen output trap
NEXT		  MOVE.B (A1)+,D0	;get the next character in the string
			CMP.B  #NULL,D0	;exit if null-an explicit check allows the
			BEQ	ENDSTRING; null constant to be defined as non-zero.
			TRAP   #14	 	; tell system to do it
			BRA	NEXT		   ;get the next character
ENDSTRING	  MOVE.W (SP)+,D0	;restore modified registers ensuring that the
			MOVE.W (SP)+,D7	; subroutine is non-destructive
			RTS				;return to the calling procedure
				
			END
			


Was This Post Helpful? 1

#4 mikeblas  Icon User is offline

  • D.I.C Regular
  • member icon

Reputation: 43
  • View blog
  • Posts: 390
  • Joined: 08-February 08

Re: 68K Assembly Language help

Posted 22 May 2008 - 06:51 PM

Hi, Giddyup.

I think solving Requirement #4 is pretty easy, given how far you've already gotten. A little insight into the problem that might help is that adding two numbers with decimals is just as easy as adding two integers without decimals.

   123456
  +444333
   ------
   567789



just as


   123.456
  +444.333
   -------
   567.789



If you know that you've always got three digits on either side of the decimal point, you're in great shape; just ignore the decimal when reading input, and output it after the third digit when writing your answer.

If you don't know how many digits here are, it's not so hard. You just have to make a note of where you find the point, flood everything else with zeros, and keep the values aligned around their decimal points.

Everything is easier said than done in assembler, so let me know if you need help coming up with an implementation that reaches that goal.

This post has been edited by mikeblas: 22 May 2008 - 06:58 PM

Was This Post Helpful? 0
  • +
  • -

#5 giddyupgirl  Icon User is offline

  • New D.I.C Head

Reputation: 3
  • View blog
  • Posts: 13
  • Joined: 09-May 08

Re: 68K Assembly Language help

Posted 23 May 2008 - 08:40 AM

Hi,

Thanks heaps, I have already handed the assignment in, I just couldn't figure out the floating point thing, but what you say makes perfect sense, I just couldn't code it to make it work. I will have to settle for a maximum of 30/40, but for curiosity sake and my own sanity, I would still like to know how to make it work. My friends tell me to let it go, but I can't, I really want to know the answer.

Thanks again for your help
giddyupgirl :wub:
Was This Post Helpful? 1

#6 Joolia  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 4
  • Joined: 09-June 08

Re: 68K Assembly Language help

Posted 09 June 2008 - 01:32 AM

			
OKAY		MULU	#10,D1 ; multiply by 10 
			ADD.W	D0,D1		
			BRA		READ_NUMBER;GET NEXT ENTRY


I would like to enquire re: this part of the code. Why do you have to multiply by 10?
Was This Post Helpful? 0
  • +
  • -

#7 giddyupgirl  Icon User is offline

  • New D.I.C Head

Reputation: 3
  • View blog
  • Posts: 13
  • Joined: 09-May 08

Re: 68K Assembly Language help

Posted 09 June 2008 - 08:19 PM

View PostJoolia, on 9 Jun, 2008 - 01:32 AM, said:

			
OKAY		MULU	#10,D1; multiply by 10 
			ADD.W	D0,D1		
			BRA		READ_NUMBER;GET NEXT ENTRY


I would like to enquire re: this part of the code. Why do you have to multiply by 10?


Well at the time of posting that it was the only way I could get my output to display as a decimal digit, without that it would display as a hex digit. I am sure that isn't the way to do it, but not having enough knowledge of assembly language this appeared to work for me. I haven't got the results back from that assignment yet so I really can't tell you if it was acceptable or not, but my theory is that the assignment specs didn't say how we were to achieve the desired outputs, just that we had to achieve them, and I did :D

cheers
giddyupgirl :wub:
Was This Post Helpful? 1
  • +
  • -

#8 Joolia  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 4
  • Joined: 09-June 08

Re: 68K Assembly Language help

Posted 09 June 2008 - 09:22 PM

Thanks for explaining! :D It sure is an interesting program to ponder on! I tried to make it reach requirement 4 but have either address error or bus trap error... :( But I'll still be trying on it during my free time just for fun. :D

This post has been edited by Joolia: 09 June 2008 - 10:07 PM

Was This Post Helpful? 0
  • +
  • -

#9 Joolia  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 4
  • Joined: 09-June 08

Re: 68K Assembly Language help

Posted 09 June 2008 - 09:57 PM

PRINT_DECIMAL_LOOPBODY
			DIVU	#10,D4			;divide by ten to get the 0...9 value in the remainder for
			SWAP	D4				;the current least significant decimal value in D4
			MOVE.W  D4,-(sp)		;push that remainder onto the stack
			MOVE.W 	#0,D4			;clear the remainder
			SWAP 	D4				;keep the reduced exponent value
			ADD.L	#1,D3			;increment digit counter
			BRA		PRINT_DECIMAL_DIV10LOOP;jump to loop condition test


I'm wondering abt this part too. Does it mean:

For e.g.: 111 + 2

This part is doing the (11 + 2 = 13)
13 / 10 to get the remainder 3 and swap the remainder (03) => 30
store it using parameter passing => clear this part of D4 and the rest I'm not really sure... How does this part of coding actually work?

Was This Post Helpful? 0
  • +
  • -

#10 giddyupgirl  Icon User is offline

  • New D.I.C Head

Reputation: 3
  • View blog
  • Posts: 13
  • Joined: 09-May 08

Re: 68K Assembly Language help

Posted 10 June 2008 - 02:26 AM

View PostJoolia, on 9 Jun, 2008 - 09:57 PM, said:

PRINT_DECIMAL_LOOPBODY
			DIVU	#10,D4		;divide by ten to get the 0...9 value in the remainder for
			SWAP	D4			;the current least significant decimal value in D4
			MOVE.W  D4,-(sp)	;push that remainder onto the stack
			MOVE.W 	#0,D4		;clear the remainder
			SWAP 	D4			;keep the reduced exponent value
			ADD.L	#1,D3		;increment digit counter
			BRA		PRINT_DECIMAL_DIV10LOOP;jump to loop condition test


I'm wondering abt this part too. Does it mean:

For e.g.: 111 + 2

This part is doing the (11 + 2 = 13)
13 / 10 to get the remainder 3 and swap the remainder (03) => 30
store it using parameter passing => clear this part of D4 and the rest I'm not really sure... How does this part of coding actually work?

To be honest I really don't know, I was grabbing bits of code from where ever I could find it trying to work out a solution, and when this did as I wanted I just accepted it and moved on. :P I am definitely not as adventurous as you are, I figure if it is working I am not going to question it! I had my exam for that subject last Wednesday, it wasn't as hard as I thought, luckily a large component of it was maths, ie, adding and subtracting binary, hex and floating point and error correcting with hamming code which I am good at, and I think I nailed the coding part too so I was very happy with that. I might even be looking at a distinction for that subject, now that would be funny.

When you do work it out I would love to know the answer out of curiosity, I am doing eCommerce and Managerial Communication this semester, so not quite as challenging or entertaining as assembly language.

Good luck with it.
cheers
giddyupgirl :wub:
Was This Post Helpful? 0
  • +
  • -

#11 Joolia  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 4
  • Joined: 09-June 08

Re: 68K Assembly Language help

Posted 11 June 2008 - 04:40 AM

View Postgiddyupgirl, on 10 Jun, 2008 - 02:26 AM, said:

To be honest I really don't know, I was grabbing bits of code from where ever I could find it trying to work out a solution, and when this did as I wanted I just accepted it and moved on. :P I am definitely not as adventurous as you are, I figure if it is working I am not going to question it! I had my exam for that subject last Wednesday, it wasn't as hard as I thought, luckily a large component of it was maths, ie, adding and subtracting binary, hex and floating point and error correcting with hamming code which I am good at, and I think I nailed the coding part too so I was very happy with that. I might even be looking at a distinction for that subject, now that would be funny.

When you do work it out I would love to know the answer out of curiosity, I am doing eCommerce and Managerial Communication this semester, so not quite as challenging or entertaining as assembly language.

Good luck with it.
cheers
giddyupgirl :wub:


It's ok then. :) I'll try to figure it out and continue to ponder on the question. I'll let you know when I've got it figured out? :D
Was This Post Helpful? 0
  • +
  • -

#12 Guest_Kamaaa*


Reputation:

Re: 68K Assembly Language help

Posted 18 May 2010 - 09:42 PM

hi guys
could you explain how the zeros and ones should work


The user must be allowed to enter 0s and 1s. Your program must display these 0s and
1s as they are entered. The user must be able to press Enter to complete their input,
at which point the program must also complete.

program must store the user's sequence of 0s and 1s to memory, starting from
address $ 2000. Your program must be equipped to accept up to 100 0s or 1s (i.e.
you must ensure that enough memory is reserved for this much data). You can
assume that the user will never enter more data than this – that is, your program does
not need to prevent the user from entering 101 or more characters.

program must check that each character entered is valid (i.e. a 0 or a 1), and if
the character is not valid your program must disregard it (without storing or displaying
it), print the message ‘TRY AGAIN' and continue to allow the user to enter more input.

program must keep a count of the number of 0s entered, and a count of the
number of 1s entered.

The number of 0s and the number of 1s entered by the user must be stored in
appropriately sized memory positions starting at $ 3000.
Was This Post Helpful? 0

#13 nathanpc  Icon User is offline

  • SCIENCE!
  • member icon

Reputation: 112
  • View blog
  • Posts: 1,171
  • Joined: 31-July 09

Re: 68K Assembly Language help

Posted 24 May 2010 - 03:38 PM

Wonderful, but why all this colors(blue and green)?

They disorganize the thread and make the visibility a lot worse. when you want to put hexadecimal values, one line codes(that needs to be embedded on a line), please use the il tag, like this: $3000. ;)

Remember to read about all the special tags we have here on the forum next post.
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1