Jump to content



Welcome to KnowledgeSutra - Dear Guest , Please Register here to get Your own website. - Ask a Question / Express Opinion / Reply w/o Sign-Up!
- - - - -

Trying To Program In Assembly And Keep Getting Error


6 replies to this topic

#1 Angela

    Newbie

  • Kontributors
  • Pip
  • 5 posts

Posted 15 November 2006 - 05:47 AM

I am brand new at learning Assembly...and can't seem to get this proram to execute....

This is my code....

;;;;;%include  "NASMENV\lib\io.mac"
.STACK 100H
.DATA
char_prompt  db  "Please input a character: ",0
out_msg1		db  "The ASCII code of  ' ",0
out_msg2		   db  "' in hex is  ",0
query_msg	 db  "Do you want to quit (Y/N):  ",0

;  translation table: 4-bit binary to hex

hex-table	   db   "012345789ABCDEF", 0

.CODE
	.STARTUP

read_char:

	PutStr	char_prompt; request a char. input
	GetCh	AL

	PutStr	out_msg1
	PutCh	AL
	PutStr	out_msg2
	mov	AH,AL	; save input character in AH
	mov	EBX, hex_table; EBX = translation table
	shr	AL,4	; move upper 4 bits to lower half
	xlatb		; replace AL with hex digit
	PutCh	AL	; write the first hex digit
	mov	AL,AH	; restore input character to AL
	and	AL,0FH	; mask off upper 4 bits
	xlatb			
	PutCh	AL	; write the second hex digit
	nwln
	PutStr	query_msg; query user whether to terminate
	GetCh	AL	; read response

	cmp	AL, 'Y'	; if response is not 'Y'
	jne	read_char; read another character

done:
	.EXIT	


When I attempt to make...I get the below.... PLEASE HELP! This is driving me bonkers!

Quote

J:\NASMENV\ASM\Hex2Char>make
MAKE Version 5.2 Copyright © 1987, 2000 Borland
/NASMENV/NASM/nasm-0.98.39/nasm -o hex2char.obj -f obj -l hex2char.lst -
P /NASMENV/lib/io.mac hex2char.asm
J:\NASMENV\lib\io.mac:7: warning: redefining multi-line macro `.STACK'
J:\NASMENV\lib\io.mac:15: warning: redefining multi-line macro `.DATA'
J:\NASMENV\lib\io.mac:21: warning: redefining multi-line macro `.UDATA'
J:\NASMENV\lib\io.mac:27: warning: redefining multi-line macro `.CODE'
J:\NASMENV\lib\io.mac:35: warning: redefining multi-line macro `.STARTUP'
J:\NASMENV\lib\io.mac:49: warning: redefining multi-line macro `.EXIT'
J:\NASMENV\lib\io.mac:57: warning: redefining multi-line macro `nwln'
J:\NASMENV\lib\io.mac:64: warning: redefining multi-line macro `PutCh'
J:\NASMENV\lib\io.mac:74: warning: redefining multi-line macro `PutStr'
J:\NASMENV\lib\io.mac:84: warning: redefining multi-line macro `GetStr'
J:\NASMENV\lib\io.mac:99: warning: redefining multi-line macro `GetCh'
J:\NASMENV\lib\io.mac:120: warning: redefining multi-line macro `PutInt'
J:\NASMENV\lib\io.mac:130: warning: redefining multi-line macro `GetInt'
J:\NASMENV\lib\io.mac:143: warning: redefining multi-line macro `PutLInt'
J:\NASMENV\lib\io.mac:152: warning: redefining multi-line macro `GetLInt'
hex2char.asm:18: error: parser: instruction expected

** error 1 ** deleting hex2char.obj


#2 ghostrider

    Super Member

  • Kontributors
  • PipPipPipPipPipPipPipPipPip
  • 398 posts
  • Gender:Male
  • Location:Wisconsin

Posted 16 November 2006 - 01:27 AM

Quote

hex-table db "012345789ABCDEF", 0

EBX is a 32-bit variable. This means it can hold a total of 32 bits / 8 bits per byte or a total of 4 bytes. The value you are trying to put in there is 17 bytes. Perhaps you are supposed to be putting the location of hex_table in EBX? I'm not familiar with some of the instructions you are using so I couldn't tell you. Post back and I can try and help you out more. I've been using assembly for 3 years.

#3 Angela

    Newbie

  • Kontributors
  • Pip
  • 5 posts

Posted 16 November 2006 - 11:53 PM

Hi Ghostrider! :blink: Thanks soooooo much for responding. I can't imagine anyone who would take this course because they want to. I am currently enrolled in the course because I have toooo...a tutor...I definitely need... anyway... I believe I am moving the hex_table into EBX...see a copy of the code below.... Any and all help is greatly appreciated...Thanks...

mov EBX, hex_table; EBX = translation table





View PostAngela, on Nov 14 2006, 11:47 PM, said:

I am brand new at learning Assembly...and can't seem to get this proram to execute....

This is my code....

;;;;;%include  "NASMENV\lib\io.mac"
.STACK 100H
.DATA
char_prompt  db  "Please input a character: ",0
out_msg1		db  "The ASCII code of  ' ",0
out_msg2		   db  "' in hex is  ",0
query_msg	 db  "Do you want to quit (Y/N):  ",0

;  translation table: 4-bit binary to hex

hex-table	   db   "012345789ABCDEF", 0

.CODE
	.STARTUP

read_char:

	PutStr	char_prompt; request a char. input
	GetCh	AL

	PutStr	out_msg1
	PutCh	AL
	PutStr	out_msg2
	mov	AH,AL; save input character in AH
	mov	EBX, hex_table; EBX = translation table
	shr	AL,4; move upper 4 bits to lower half
	xlatb	; replace AL with hex digit
	PutCh	AL; write the first hex digit
	mov	AL,AH; restore input character to AL
	and	AL,0FH; mask off upper 4 bits
	xlatb			
	PutCh	AL; write the second hex digit
	nwln
	PutStr	query_msg; query user whether to terminate
	GetCh	AL; read response

	cmp	AL, 'Y'; if response is not 'Y'
	jne	read_char; read another character

done:
	.EXIT	


When I attempt to make...I get the below.... PLEASE HELP! This is driving me bonkers!


#4 ghostrider

    Super Member

  • Kontributors
  • PipPipPipPipPipPipPipPipPip
  • 398 posts
  • Gender:Male
  • Location:Wisconsin

Posted 17 November 2006 - 01:30 AM

I'm sorry I can't elorborate on this more, but I found this on the internet. It explains the xlatb function. You need to put the address of the table in EBX, not the table itself.
lea EBX, hex-table
;lea stands for load effective address.  

Here is what I found on the internet:

Quote

Description
Locates a byte entry in a table in memory, using the contents of the AL register as a table index, then copies the contents of the table entry back into the AL register. The index in the AL register is treated as an unsigned integer. The XLAT and XLATB instructions get the base address of the table in memory from either the DS:EBX or the DS:BX registers (depending on the address-size attribute of the instruction, 32 or 16, respectively). (The DS segment may be overridden with a segment override prefix.)

At the assembly-code level, two forms of this instruction are allowed: the "explicit-operand" form and the "no-operand" form. The explicit-operand form (specified with the XLAT mnemonic) allows the base address of the table to be specified explicitly with a symbol. This explicit-operands form is provided to allow documentation; however, note that the documentation provided by this form can be misleading. That is, the symbol does not have to specify the correct base address. The base address is always specified by the DS:(E)BX registers, which must be loaded correctly before the XLAT instruction is executed.

The no-operands form (XLATB) provides a "short form" of the XLAT instructions. Here also the processor assumes that the DS:(E)BX registers contain the base address of the table.

Hope this helps.

#5 Angela

    Newbie

  • Kontributors
  • Pip
  • 5 posts

Posted 17 November 2006 - 07:28 PM

Hi Ghostrider! Any help is elaboration is better than none...I will try this..and I'll let you know how it turns out. Thanks again soooo much for your time and Assembly knowledge. It's much appreciated.

Angela

View Postghostrider, on Nov 16 2006, 07:30 PM, said:

I'm sorry I can't elorborate on this more, but I found this on the internet. It explains the xlatb function. You need to put the address of the table in EBX, not the table itself.
lea EBX, hex-table
;lea stands for load effective address.  

Here is what I found on the internet:
Hope this helps.


#6 ghostrider

    Super Member

  • Kontributors
  • PipPipPipPipPipPipPipPipPip
  • 398 posts
  • Gender:Male
  • Location:Wisconsin

Posted 18 November 2006 - 03:35 AM

I'm glad I was able to help you out. I know Assembly starts out boring and not fun, but ever since I learned it I have noticed that I prorgam more creatively, and problem solving is much easier. Both of those skills are great to have. Also, why do you have 5 semicolons in front of your include statement?

;;;;;%include  "NASMENV\lib\io.mac"


#7 Angela

    Newbie

  • Kontributors
  • Pip
  • 5 posts

Posted 20 November 2006 - 11:11 AM

Hi Ghostrider! Well I figured it out.

in my code... I used hex-table db "0123456789ABCDEF" instead hex_table db "0123456789ABCDEF". I used a hyphen instead of the underscore. That made the difference. In regard to the semi colons on my include statement.....that was intentional. I also removed the semi colons and my program ran. Thanks for getting my juices to flowing. I hope that your available in the future...because I am sure that I will have more assembly questions.

Angela

View Postghostrider, on Nov 17 2006, 09:35 PM, said:

I'm glad I was able to help you out. I know Assembly starts out boring and not fun, but ever since I learned it I have noticed that I prorgam more creatively, and problem solving is much easier. Both of those skills are great to have. Also, why do you have 5 semicolons in front of your include statement?

;;;;;%include  "NASMENV\lib\io.mac"





Reply to this topic


This post will need approval from a moderator before this post is shown.

  


1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users